정규화정규화란 이상 현상이 발생하지 않도록, 릴레이션을 분해하는 과정을 말한다. 데이터베이스 설계 또는 설계 결과를 검증하는 용도로 사용된다. 두 설계 방법 중 적절한 방법을 선택하자.E-R 모델과 릴레이션 변환 규칙정규화이상 (Anomaly)데이터 중복이 발생하여 릴레이션에 대한 데이터 삽입, 수정, 삭제 연산 시의 부작용을 말한다. 정규화 과정을 진행하면 이상 현상이 제거된다. 이상 현상의 종류삽입 이상 : 새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제갱신 이상 : 중복 튜플 중 일부만 변경하여 데이터가 불일치되는 문제삭제 이상 : 튜플을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 문제결정자하나의 릴레이션을 구성하는 속성들의 부분 집합을 X와 Y라고 하자. 어느 시점에서든 X..
서론B Tree와 B+ Tree는 이진 탐색 트리를 확장해 하나의 노드가 2개 이상의 자식을 가질 수 있게 만든 트리이며 주로 데이터베이스, 파일 시스템에서 사용된다. 하드 디스크는 블록 단위로 읽기/쓰기 작업을 수행한다. DB의 모든 행은 블록에 저장된다. 만약 특정 행을 조회하는 쿼리를 수행하려면 행이 저장된 모든 블록을 모두 탐색해야하는데 이는 비효율적이다. 그래서 인덱스를 사용한다. 행의 키를 키로, 블록 주소를 값으로 갖는 인덱스를 사용한다. 인덱스가 저장된 블록 + 1개의 행이 저장된 블록만 탐색하면 되므로 탐색할 블록 개수가 줄어든다. 인덱스를 위한 인덱스행이 많아지면 인덱스 블록 개수도 증가한다. 때문에 인덱스를 위한 인덱스(high level index)를 둔다. DB 행이 증가할수록 ..
해시인덱스의 범위가 상당히 큰데에 비해 사용되는 공간이 적은 경우를 생각해보자. 예를 들어 인덱스 범위가 1 ~ 1억인 경우 1억 크기 배열을 사용해야하는데 이는 공간 낭비이다.또한 인덱스가 정수가 아닌 문자열이나 객체인 경우 어떻게 해야할까? 이 경우 해시 함수와 해시 테이블을 사용할만 하다. 키로 원소를 O(1)에 찾는 검색 알고리즘해시 테이블 - 원소를 저장하고 있는 공간(배열)해시 함수 - 키를 해시 테이블의 인덱스로 바꾸는 함수. 키를 해시 테이블 인덱스로 쓸 수 있다면 해시 함수가 필요 없겠지만 보통 키의 범위가 너무 크고, 정수형이 아닐기 있기에 변환 함수인 해시 함수가 필요하다. 해시 함수의 결과값을 해시 값이라 한다.충돌서로 다른 키의 해시 값이 동일 할 때 충돌이 발생했다고 한다. 키의..
Heap힙은 힙 속성을 만족하는 완전 이진 트리(이진 힙의 경우)이다. 우선 순위가 가장 높은 원소를 빠르게 찾는 용도로 사용된다. 힙을 사용하면, 원소를 추가하는 연산, 가장 우선순위가 높은 연산을 O(logN)으로 수행할 수 있다. 우선순위가 가장 높은 수가 가장 큰수라면 최대힙, 가장 작은 수라면 최소힙이라 부른다. 힙 속성 : 부모 노드는, 항상 자식 노드보다 우선순위가 높다.따라서 힙은 힙 속성, 완전 이진 트리를 만족해야한다.BBST를 쓰면 안되나?BBST보다 힙이 훨씬 빠르다. BBST도 같은 시간 복잡도를 가지며, 심지어 우선 순위가 가장 낮은 원소도 가져올 수 있지만, 같은 시간 복잡도라도 힙은 간단한 작업을 수행하기에 더 빠르다. BBST는 트리의 균형을 맞추기 위해 복잡한 작업을 수행..
Git 히스토리 삭제GitLab의 저장소가 private라 기밀 정보가 들어간 application.propeties 파일을 넣으면서 작업했더니 나중에 Github로 미러링할 때 문제가 되었다. (기밀 정보는 넣지 말자) 단순히 application.propeties 파일을 삭제하면 안된다. Git은 파일을 삭제하지 않는 구조일 뿐만 아니라 히스토리, 즉 이전 커밋들에 포함되어 있기 때문이다.(더 상세하게 표현하면 커밋의 트리 파일에 기밀 정보가 포함된 application.propeties에 해당하는 blob 객체가 포함되어 있기 때문) 아래 명령어를 실행하자. 아래의 명령어는 지정한 파일 또는 폴더를 모든 브랜치와 태그에서 제거하고, 그 과정에서 비어 있는 커밋을 삭제한다. 이 명령어를 사용할 때는 ..
YARN YARN (Yet Another Resource Negotiator)은 하둡 2부터 도입된 클러스터 리소스 관리, 애플리케이션 라이프 사이클 관리를 위한 아키텍처이다. YARN에서는 맵리듀스 기반의 애플리케이션외에도 피그, 스톰, 스파크 등 분산 애플리케이션에 대해 클러스터 리소스를 관리 할 수 있다. YARN 아키텍처의 세 가지 중요한 요소는 리소스 매니저, 노드 매니저, 애플리케이션 마스터이다. 리소스 매니저 리소스 매니저(Resource Manager)는 하둡 클러스터의 마스터 노드에 실행되는 자바 프로세서로 노드 매니저로부터 전달받은 정보를 이용하여 클러스터에서 CPU, 메모리, 디스크 등의 자원을 관리한다. 클러스터 상태 모니터링 : 클러스터 내 노드의 상태를 모니터링하고 노드 장애 발..
스파크 애플리케이션 제출 Spark bin 폴더의 spark-submit 스크립트로 사용자가 작성한 애플리케이션을 클러스터에 배포할 수 있다. spark-submit은 모든 클러스터 매니저와 같이 사용할 수 있으므로 클러스터 매니저에 따라 애플리케이션을 변경할 필요는 없다. 종속성이 있는 애플리케이션 번들링 만약 애플리케이션의 코드에 의존성이 있는 경우 의존성과 함께 코드를 패키징해야한다. 따라서 코드와 종속성을 포함하는 어셈블리 jar(또는 jber jar)을 만든다. 어셈블리 jar을 만들기 위해 sbt, maven와 같은 어셈블리 플러그인을 사용할 수 있다. 어셈블리 jar을 만들 때 Spark 및 Hadoop 종속성을 provided 종속성으로 지정한다. 클러스터 매니저가 런타임 시에 해당 종속성..
스파크 클러스터 넓은 의미에서 보면, 스파크 애플리케이션은 스파크 클러스터의 병렬 작업들을 조율하는 하나의 드라이버 프로그램이다. 드라이버 프로그램은 SparkSession 객체를 초기화하고 클러스터 매니저와 통신하며 스파크 이그제큐터를 위한 필요한 자원(cpu, memory)를 요청한다. 또한 모든 스파크 작업을 DAG 연산 형태로 변환해 스케줄링하며 각 실행 단위를 태스크로 나누어 스파크 이그제큐터(Executor)에 분배한다. 자원이 할당되면 그 다음부터 드라이버 프로그램은 이그제큐터와 직접 통신한다. 스파크 2.0에서 스파크 세션은 모든 스파크 연산과 데이터에 대한 통합 연결 채널이 되었다. 이전의 SparkContext, SQLContext, HiveContext, SparkConf, Strea..