Big Data 49

Hive 데이터 입력시 노드당 처리 파티션 개수 초과 오류

Hive 데이터 입력시 노드당 처리 파티션 개수 초과 오류 · Version : Hive 파티셔닝된Hive 테이블에 데이터 입력시 아래와 같은 오류가 발생하였다. 오류 메시지를 살펴보면 노드당 최대 동적 파티션 개수보다 더 많은 수의 동적 파티션이 생성되어 발생한 오류이다. Error: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row {“col_1”:25513237,“col_2”:8104666,“col_3”:3808,“col_4”:6705,“col_4”:“2016-01-21 08:31:33",“col_6”:42,“col_7”:“471.00”,“..

Hive UDF (사용자 정의 함수)

Hive UDF (사용자 정의 함수) · Version : Hive Hive UDF(User Define Function, 사용자 정의 함수)는 사용자에게 HiveQL을 확장할 수 있게 해주는 하이브의 강력한 기능이다. 자바를 이용해 구현하며 한 번 세션에 추가되면 마치 내장 함수처럼 동작하고 심지어 온라인 도움말도 제공할 수 있다. UDF를 사용하면 하이브 쿼리가 동작하는 동일한 프로세스 안에서 마치 태스크처럼 돌아간다. 그러므로 효과적으로 동작하고 다른 시스템과의 통합 과정에서 발생하는 복잡함을 제거할 수 있다. 현재 하이브 세션에 로드된 내장함수는 SHOW FUNCTIONS 명령어를 사용하여 목록을 확인할 수 있다. hive>show functions; 함수는 보통 자신을 설명하는 문서를 가지고 있..

Hive Thrift Service (쓰리프트 서비스)

Hive Thrift Service (쓰리프트 서비스) · Version : Hive Hive는 하이브 서버(Hive Server) 또는 하이브 쓰리프트(Hive Thrift)라 불리는 구성요소를 가지고 있다. 쓰리프트는 확장성과 서로 다른 언어간에 통신이 가능한 소프트웨어 프레임워크이다. 이 구성요소를 통해 클라이언트는 하나의 포트(Port)로 하이브에 접근할 수 있다. CLI는 하이브를 접근하는 가능 일방적인 방식이다. CLI는 모든 하이브 구성요소 및 설정이 로컬에 복사본으로 존재해야만 동작한다. 마찬가지로 하둡 클리아언트와 하둡 설정도 있어야 한다. 하이브 CLI는 HDFS 클라이언트, 맵리듀스 클라이언트, JDBC 클라이언트(메타스토어 접속용)로 동작한다. 하이브 서비스는 쓰리프트를 이용한다. ..

Hive 보안 및 인증, 권한 부여

Hive 보안 및 인증, 권한 부여 · Version : Hive 하둡은 보안강화를 위해 커버로스(Kerberos)인증을 지원한다. 커버로스 인증은 서버와 클라이언트 간의 상호 인증을 지원한다. 더이상 hadoop. job.ugi 속성을 설정하여 다른 사용자인척 할 수 없다. 하지만 이렇게 동작하려면 모든 하둡 구성요소는 커버로스 보안을 양쪽 끝에서 지원해야한다. 모든 하둡 에코 시스템이 커버로스 인증을 지원 못하듯이, 하이브 인증도 완전하지 않다. 하이브는 메타스토어에 접속하기 위해서 JDBC 데이터베이스 연결을 사용하거나 사용자를 대신해서 동작을 수행하는 쓰리프트를 사용한다. 쓰리프트 기반의 하이브 서비스 역시 다른 사용자인척 해야한다. 한 소유자와 그룹이 한 파일에 대한 소유권을 갖는 하둡의 파일 ..

Hive 잠금(lock)

Hive 잠금(lock) · Version : Hive HiveQL은 SQL과 유사하지만 잠금(locking)에 대한 메커니즘은 완전히 다르다. SQL과 비교한다면 매우 부족한 lock 모델을 가지고 있다. 하둡이 제한된 의미의 이어쓰기 (append)를 지원하고 있지만 전통적으로는 write-once(한번쓰면 변경이 불가능하다는 의미) 의 특성을 가지고 있기 때문에 이러한 특성과 맵리듀스의 스트리밍 읽기 방식으로 인해 세밀한 잠금에 대한 접근은 불필요하기 때문이다. 그러나 하둡은 다중 사용자 시스템이기 때문에 잠금과 코디네이션이 필요할수도 있다. 예를들어 INSERT OVERWRITE 쿼리는 테이블의 모든 내용을 덮어쓰고 다른 사용자가 동시에 테이블에 쿼리를 시도하면 쿼리가 실패하거나 잘못된 결과를 반..

Hive 투기적 실행(Speculative execution)

Hive 투기적 실행(Speculative execution) · Version : Hive Hive에서 투기적 실행(Speculative execution)이라 불리는 기능은 하나의 잡을 중복된 태스크로 구성하여 동시에 수행 시키는 하둡의 기능이다. 같은 데이터를 중복하여 복사하기 때문에 더 많은 리소스를 사용하며, 대부분의 데이터는 버려진다. 이 기능의 목적은 느리게 동직하는 태스크 트래커를 제거함으로써 개별 태스크의 결과가 더 빨리 도출되고 결과적으로 전체 잡 수행을 향상시키는데 있다. 즉, 동일한 태스크를 여러노드에서 실행함으로써, 특정 노드가 느리더라도 (장비 노후 또는 기타 문제로) 다른 노드에서 먼저 끝나면 해당 결과를 사용하고 나머지 노드는 중지 시킨다. 그래서 전체적으로는 수행시간이 단축..

Hive 자바 가상 머신 재사용

Hive 자바 가상 머신 재사용 · Version : Hive 하둡에서 맵리듀스 태스크를 실행하면 기본적으로 자바 가상 머신이 실행되고 그 위에서 맵 또는 리듀서 태스크를 실행한다. 하둡의 기본 설정은 일반적으로 포크(forked)된 자바 가상 머신을 사용한다. 자바 가상 머신은 가동할 때 오버헤드가 있기 때문에, 가상 머신의 재사용은 하이브 성능과 매우 밀접한 관계가 있다. 특히 작은 파일을 처리해야하는 경우나 태스크 수행시간이 짧은 작업의 경우 자바 가상 머신을 재사용하면 매우 효율이 좋다. 만약 수십, 수백번의 태스크를 가진 잡을 수행할때 자바 가상 머신 인스턴스를 재사용한다면 동일한 잡에 N번 재사용된다. 가상 머신의 재사용 설정은 하둡의 mapred-site.xml에서 설정할 수 있다. mapr..

Hive Mapper, Reduce 개수 최적화

Hive Mapper, Reduce 개수 최적화 · Version : Hive 하이브는 쿼리를 한 개 이상의 맵리듀스 잡으로 나누어 병렬로 처리한다. 맵리듀스는 다수의 맵퍼와 리듀서 태스크로 실행되는데 맵퍼와 리듀서의 수는 입력하는 데이터 크기, 데이터 수행 연산 종류 등 다양한 변수에 의존적이다. 너무 많은 맵퍼와 리듀서 태스크는 잡을 초기화 하고, 스케줄링하고 실행하기 위해 많은 오버헤드를 유발한다. 반대로 너무 적은 태스크는 클러스터가 가진 병렬처리의 장점을 잘 활용하지 못하게 된다. 리듀스 단계가 있는 하이브 쿼리를 실행하면 리듀서 수를 출력한다. GROUP BY는 항상 리듀서 단계가 필요하기 때문에 해당 구문이 포함한스크립트를 실행하면 사용된 맵퍼와 리듀서의 개수를 확인할 수 있다. INFO :..

HDFS Cluster Balancing(데이터 블록 분포의 불균형 해소)

HDFS Cluster Balancing(데이터 블록 분포의 불균형 해소) · Version : HDFS HDFS 시스템은 여러대의 노드가 클러스터로 동작하기 때문에 시간이 지날수록 데이터 노드의 블록 분포에 대한 불균형이 발생할 수 있다. 불균형 상태의 클러스터는 맵리듀스의 로컬리티에 영향을 주기 때문에 자주 사용되는 데이터노드에 더 많은 부하를 주게 된다. 따라서 이러한 블록의 불균형 분포를 해결하기 위해 밸런서 작업으로 블록을 재분배 하여 전체적으로 블록을 고르게 유지할 수 있도록 다른 노드로 블록을 이동한다. 이때 데이터 유실을 방지하기 위해 데이터 블록 복제본의 배치전략은 유지된다. 밸런서를 실행하는 명령은 아래와 같다. sudo -u hdfs hdfs balancer 각 노드의 균형은 노드들의..

Hive LIMIT 튜닝 (데이터 샘플링으로 빠르게 응답하기)

Hive LIMIT 튜닝 (데이터 샘플링으로 빠르게 응답하기) · Version : Hive 하이브에서 현재 저장되어 있는 데이터의 일부분을 확인하려고 LIMIT 절을 자주 사용한다. RDB의 경우 데이터를 ROW단위로 읽기때문에(정확히는 페이지 단위) ROW단위로 처리하면서LIMIT 의 결과를 (Sort, Group 등 연산을 하지 않았을 경우) 빠르게 응답할 수 있다. 하지만 하이브의 경우 데이터 전체에 대해 쿼리를 수행하고 일부 결과만을 반환하기 때문에 불필요한 리소스 낭비가 크다. 그래서 최대한 LIMIT 명령을 피하는 것이 좋다. 만약 limit를 자주 사용할 경우 hive-site.xml 파일에서 hive.limit.optimize.enable설정을 통해서 LIMIT를 사용할 경우 원본 데이터..