본문 바로가기

빅데이터/hive127

[hive] Blobstore 기능으로 처리 속도 증가 하이브 2.2.0 버전부터 Blobstore기능을 제공합니다. Blobstore Blobstore는 하이브 작업시에 생성되는 임시 파일을 S3에 작성하지 않고, HDFS에 작성하는 기능을 제공합니다. HDFS가 S3보다 IO속도가 빠르기 때문에 작업의 속도가 빨라지게 됩니다. 해당 기능을 이용하였을 때 1.5배 정도의 속도 증가가 이루어졌습니다. 하이브에서 TEZ로 작업하고 파일 머지까지 발생하는 작업으로 테스트 결과 MR속도와 파일 머지 속도가 빨라서 전체 작업시간이 다음과 같이 HDFS를 사용하는 경우가 1.5배 빠르게 나왔습니다. 하지만 HDFS를 사용하는 경우 임시파일의 저장으로 인한 작업 공간의 사용, 네임노드 관리로 인한 과부하 등의 오버헤드가 발생하기 때문에 작업의 형태에 따라 적절한 선택과.. 2019. 12. 19.
[hive] MSCK is missing partition columns under location. 오류 해결 방법 EMR에서 하이브의 테이블에 MSCK 명령을 이용해서 테이블을 재구성할 때 다음의 오류가 발생하는 경우가 있습니다. Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: MSCK is missing partition columns under s3://bucket_name/directory_location 원인 이 오류는 지정한 버켓의 폴더가 없어서 발생하는 오류입니다. S3의 특성상 디렉토리만 생성되면 파일시스템에 따라서 $folder$ 가 생성되면서 이 특수 파일이 옮겨지는 과정에서 누락되면 이 오류가 발생합니다. 해결방법 이 오류는 디렉토리를 만들어서 해결할 수도 있고, 아래의 설정을 이용해서 오류가 있는 폴더는 무시하고 처리할 수 있도록 설정할.. 2019. 12. 4.
[hive] Error in getting fields from serde.Invalid Field null 오류 수정 방법 하이브에서 파티션의 정보를 확인할 때 다음의 오류가 발생하는 경우가 있습니다. hive> desc formatted TABLE_NAME partition(partition1='A'); FAILED: Excution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Error in getting fields from serde.Invalid Field null 원인 이 오류는 확인 하려고 하는 파티션의 정보를 부족하게 제공해서 발생합니다. 위의 예제의 경우 partition1과 partition2 두 개의 파티션을 가진 테이블에서 정보를 하나만 제공하여 오류가 발생하였습니다. 해결방법 아래와 같이 테이블의 파티션에 관련된 모.. 2019. 12. 4.
[hive] 하이브 schemaTool을 이용하여 스키마 생성 원격 하이브 메타스토어를 이용하기 위해서는 RDB에 하이브 메타스토어 스키마를 설정해야 합니다. hive-site.xml에 RDB에 접속을 위한 정보를 입력하고, 커맨드를 입력하여 스키마를 생성할 수 있습니다. hive-site.xml 설정 원격 데이터베이스에 접속하기 위한 접속정보를 설정합니다. javax.jdo.option.ConnectionURL jdbc:mysql://database_ip:database_port/database_name javax.jdo.option.ConnectionDriverName org.mariadb.jdbc.Driver javax.jdo.option.ConnectionUserName user_name javax.jdo.option.ConnectionPassword pas.. 2019. 10. 30.
[hive] 테이블 DROP 시 발생하는 Caused by: MetaException(message:Timeout when executing method: drop_table_with_environment_context; 69853ms exceeds 60000ms) 오류 하이브에서 테이블을 DROP 할 때 다음의 오류가 발생하는 경우가 있습니다. 증상 2019-07-29 06:08:02,737 ERROR [c09ac50a-3167-4c79-8909-a678d59ab9a0 uber-SubtaskRunner] hive.ql.exec.DDLTask: org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:Timeout when executing method: drop_table_with_environment_context; 69853ms exceeds 60000ms) at org.apache.hadoop.hive.ql.metadata.Hive.dropTable(Hive.java:1180) at org.a.. 2019. 7. 29.
[hive] TEZ 작업중 GC overhead limit exceeded 오류 처리 하이브 TEZ작업 중 발생하는 다음의 GC오류는 수행시간의 많은 부분(98%)이 GC에 들어가고, GC를 수행하여도 사용할 수 있는 메모리가 부족(2%가 복구)할 때 발생하는 오류입니다. -XX:-UseGCOverheadLimit 옵션을 이용하여 이 오류가 발생하지 않도록 설정 할 수 있습니다. 자바 프로그램에서는 -Xmx 옵션으로 힙의 용량을 늘여서 해결할 수 있습니다. 하이브에서는 컨테이너의 메모리 용량과 힙의 용량을 늘여서 해결할 수 있습니다. Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded at java.util.Arrays.copyOf(Arrays.java:3181) TEZ 컨테이너의 메모리 증설 방법은 다음과 같습니다. 또한.. 2019. 7. 5.
[hive] common.JvmPauseMonitor (JvmPauseMonitor.java:run(194)) - Detected pause in JVM or host machine (eg GC): pause of approximately 1727ms 메시지 최근 hive 작업을 진행하면서 하이브 메타스토어의 연결이 자주 끊어지는 현상이 발생하였습니다. 이 문제를 확인하기 위해서 로그를 확인하였는데 다음과 같은 메시지를 확인할 수 있었습니다. 이 메시지는 어떤 이유(보틍은 GC작업)에 의해서 JVM이 멈췄다는 것을 이야기 하고 있습니다. 2019-05-20T08:20:23,695 INFO [org.apache.hadoop.hive.common.JvmPauseMonitor$Monitor@503a5861([])]: common.JvmPauseMonitor (JvmPauseMonitor.java:run(194)) - Detected pause in JVM or host machine (eg GC): pause of approximately 1727ms 2019-0.. 2019. 7. 1.
[hive] 하이브 테이블 조회시 파티션 개수 제약하기 하이브에서 테이블을 조회할 때 where 조건에 파티션 정보를 이용하면 하이브 메타스토어에서는 테이블의 파티션 정보를 가져와서 데이터를 조회할 로케이션을 설정합니다. 이때 MetaStoreDirectSql.java 에서 다음의쿼리를 이용하여 파티션 정보를 가져옵니다. 그런데 이때 파티션의 구간을 길게 잡아서 조회하는 파티션 개수가 많아지면 버퍼 오류가 발생하게 됩니다. select PARTITIONS.PART_ID from PARTITIONS inner join TBLS on PARTITIONS.TBL_ID = TBLS.TBL_ID and TBLS.TBL_NAME = "테이블명" inner join DBS on TBLS.DB_ID = DBS.DB_ID and DBS.NAME = "데이터베이스명" wher.. 2019. 5. 22.
[hive] TEZ엔진을 이용한 UNION ALL INSERT문에서 서브디렉토리 생성을 막는 방법 하이브에서 TEZ엔진을 이용하여 UNION ALL을 이용하여 생성한 데이터로 데이터를 입력하면 최종 결과가 생성될 때 숫자로 서브 디렉토리가 생성됩니다. 예를 들면 다음과 같은 경우 입니다. -- INSERT INSERT OVERWRITE TABLE h1_passwords_target SELECT * FROM (SELECT * FROM h1_passwords UNION ALL SELECT * FROM h1_passwords) sub; -- FROM INSERT FROM ( SELECT * FROM (SELECT * FROM h1_passwords UNION ALL SELECT * FROM h1_passwords) sub ) R INSERT OVERWRITE TABLE h1_passwords_target .. 2019. 4. 9.
[hive] explain을 이용하여 CBO 적용 여부 확인 하이브는 쿼리 최적화를 위해서 CBO를 사용할 수 있습니다. CBO사용을 설정하고, explain 명령을 이용하여 실행계획을 확인할 때 CBO 적용 여부를 알 수 있는데 CBO를 적용하기 위해서는 ANALYZE 명령을 이용해서 테이블의 메타 데이터를 수집해야 합니다. 메타데이터 자동 수집 설정으로 통해 데이터를 입력할 때 자동으로 수집하게 할 수도 있습니다. # CBO 동작 설정 set hive.cbo.enable=true; # 메타데이터 자동 수집 설정 set hive.stats.autogather=true; 메타 데이터를 수집하는 명령은 ANALYZE를 이용합니다. ANALYZE TABLE sample_table PARTITION(yymmdd='20180201') COMPUTE STATISTICS f.. 2019. 4. 5.
[hive] TEZ엔진의 리듀서 처리중 셔플 단계의 OutOfMemoryError: Java heap space 오류 처리 TEZ엔진으로 작업을 처리하는 중 다음의 오류가 발생하였습니다. 에러를 보면 셔플 단계에서 메모리 오류가 발생한 것을 확인 할 수 있습니다. 셔플 단계는 맵작업의 결과를 리듀서에 전달하는 작업으로 여러 매퍼에서 전달된 결과를 리듀서에 저장하여 정렬하는 과정에서 OOM 오류가 발생할 수 있습니다. 2019-04-05 00:11:34,008 ERROR [Thread-104] SessionState: Vertex failed, vertexName=Reducer 4, vertexId=vertex__1_05, diagnostics=[Task failed, taskId=task__1_05_000182, diagnostics=[TaskAttempt 0 failed, info=[Error: Error while run.. 2019. 4. 5.
[hive] Vertex's TaskResource is beyond the cluster container capability 오류 처리 TEZ를 이용하여 작업을 처리할 때 발생하는 이 오류는 YARN에 지정한 컨테이너에 할당할 수 있는 최대 메모리보다, TEZ 컨테이너 사이즈 설정이 더 클때 발생합니다. YARN에 설정된 최대 메모리 이하로 컨테이너 사이즈를 설정해야 합니다. MR 엔진을 이용할 때도 최대 메모리 이하로 설정해야 합니다. # YARN에서 관리하는 컨테이너의 최대 메모리 설정 set yarn.scheduler.maximum-allocation-mb=11520; # TEZ의 컨테이너당 메모리 설정 set hive.tez.container.size=1440; # MR의 매퍼 메모리 설정 set mapreduce.map.memory.mb=2048; # MR의 리듀서 메모리 설정 set mapreduce.reduce.memory... 2019. 4. 5.
[hive] 하이브 처리 결과를 gzip으로 압축하는 방법 하이브 처리 결과를 gzip으로 압축하여 출력할 때는 다음과 같이 사용합니다. hive.exec.compress.output: 출력결과의 압축 여부를 설정 mapred.output.compression.codec: 압축 코덱을 설정. core-site.xml의 io.compression.codecs에 설정된 값을 사용 set hive.exec.compress.output=true; set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; -- 조회결과를 gzip으로 압축하여 출력 INSERT OVERWRITE DIRECTORY 'hdfs:///user/tables/' SELECT * FROM table WHERE name =.. 2019. 4. 3.
[hive] MSCK REPAIR 처리중 Caused by: MetaException(message:Expected 2 components, got 1) 처리 MSCK REPAIR는 하이브에서 테이블의 파티션을 일괄 생성할 때 사용하는 명령어 입니다. 테이블의 로케이션의 하위 디렉토리를 검색하여 파티션 정보와 일치하는 디렉토리를 자동으로 파티션으로 추가해주는데 파티션 정보와 다른 디렉토리가 존재하면 아래의 오류가 발생합니다. 2개의 파티션 데이터가 있는 구조인데 한개만 있다고 오류가 발생하였습니다. Caused by: MetaException(message:Expected 2 components, got 1) 이 오류를 해결하는 방법은 두가지가 있습니다. 첫번째는 디렉토리를 정리하여 파티션 구조에 맞는 디렉토리와 파일만 놓아두는 것입니다. 두번째는 다음의 옵션값을 이용하는 방법이 있습니다. set hive.msck.path.validation=ignore; 이.. 2019. 4. 1.
[hive] 테이블의 파티션을 범위로 삭제(Drop)하는 방법 하이브 테이블의 파티션을 제거(drop)하는 문법은 다음과 같습니다. ALTER TABLE table_name DROP PARTITION(partition_name='partitions_value'); yyyymmdd 파티션을 가지는 table을 이용해서 삭제 방법을 알아보겠습니다. # table은 yyyymmdd 파티션을 가지고 있음 hive> show partitions table; OK yyyymmdd=20190220 yyyymmdd=20190221 yyyymmdd=20190222 yyyymmdd=20190223 yyyymmdd=20190224 yyyymmdd=20190225 yyyymmdd=20190226 yyyymmdd=20190227 yyyymmdd=20190228 yyyymmdd=201902.. 2019. 4. 1.
[hive] 하이브의 LLAP(Live Long And Process) 구조 LLAP는 하이브 2.0에서 신규로 추가된 기능입니다. LLAP는 MR이나 TEZ 같은 실행엔진이 아닙니다. HDFS같은 저장 장치도 아닙니다. 각 노드에서 실행되는 작업 데몬으로 자주 사용되는 데이터를 캐슁하여 작업 속도를 높이는 기술입니다. LLAP는 작업 노드에서 실행되어 계속 유지되면서 작업 데이터의 캐슁, 미리 가져오기(Pre-fetching) 등을 처리합니다. 사용자가 쿼리를 실행하면 그때 마다 데이터를 읽지 않고, LLAP에 저장된 데이터가 있으면 이를 이용하여 처리 속도를 높이는 기술입니다. 하이브 매뉴얼 LLAP -> 바로가기하이브 설정 매뉴얼 LLAP -> 바로가기 LLAP 구조 -> 바로가기 LLAP: long-lived execution in Hive from DataWorks Su.. 2019. 2. 26.
[hive] 하이브 3의 특징 2018년 5월 발표된 하이브3의 특징에 대해서 알아보겠습니다. 워크로드 관리 추가 하이브 쿼리를 이용해 작업 부하 관리가 가능해 졌습니다. Role, Plan 을 이용하여 쿼리의 수행에 제약을 걸 수 있습니다. 시스템 데이터베이스, 테이블 추가 테이블의 칼럼, 데이터베이스 정보를 확인할 수 있는 테이블이 추가 되었습니다. 오라클의 시스템 DB와 같습니다. 또한, 커넥터를 제공하여 사용자가 JDBC등을 이용하여 직접 조회할 수도 있습니다. 구체화 뷰 추가 Materialized View 가 추가 되었습니다. 집계 데이터 조회시 구체화 뷰를 이용해 좀더 빠른 처리가 가능합니다. 일반적인 뷰는 실제 데이터를 가지지 않고, 논리적 구조만을 가지고 있습니다. 구체화뷰는 실제 데이터를 가지고 있으며, 테이블에 데.. 2019. 2. 25.
[hive] CLI 동작중 에러 발생시 무시하기 하이브 CLI 를 이용해서 쿼리 처리중 하나의 쿼리가 실패해도 다음 쿼리를 실행해야 하는 경우가 있습니다. 즉, 에러가 발생해도 무시하게 하는 설정이 필요할 때가 있는데 다음의 설정을 쿼리 시작전에 set 하면 됩니다. set hive.cli.errors.ignore=true; 2019. 2. 22.
[hive] 작은 사이즈의 파일 머지 설정과 그로 인한 오버헤드 하이브에서 FROM INSERT 문을 이용하여 한번에 여러곳에 데이터를 입력할때 다음과 같이 사용합니다. [FROM INSERT 문을 이용한 입력 예시] FROM ( SELECT * FROM tbl ) INSERT tableA INSERT tableB [TEZ 엔진 실행 결과] ---------------------------------------------------------------------------------------------- VERTICES MODE STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED --------------------------------------------------------------------------------.. 2019. 2. 20.
[hive] 테이블 파티션의 로케이션 정보 확인, 생성, 수정 방법 하이브 테이블의 로케이션과 파티션의 로케이션은 desc 명령으로 확인할 수 있고,파티션의 정보 수정 방법은 다음과 같습니다. # 테이블 정보 및 로케이션 확인 desc formatted [테이블명]; # 테이블의 파티션 목록 확인show partitions [테이블명]; # 신규 파티션 추가 ALTER TABLE [테이블명] ADD PARTITION (yymmdd='20180510'); # 파티션의 LOCATION 수정 ALTER TABLE [테이블명] PARTITION (yymmdd='20180510') SET LOCATION 'hdfs://127.0.0.1/user/'; # 파티션 삭제 ALTER TABLE [테이블명] DROP PARTITION (yymmdd='20180510'); 2019. 1. 17.
[hive] 쿼리 실행중 MetaException 발생시 오류 처리 쿼리 실행중 MetaException이 발생하는 경우가 있습니다. 메타스토어에서 쿼리상의 테이블 정보를 조회하는 과정에서 오류가 발생하여 출력됩니다. 이때 hive CLI 상에서는 MetaException의 쿼리만 확인이 가능하기 때문에 확인이 힘든 경우가 많습니다. 따라서 이경우에는 메타스토어의 로그를 확인하면 정확한 오류을 확인할 수 있습니다. 이번에 발생한 오류는 다음과 같았습니다. 2018-11-30T05:19:09,495 ERROR [main([])]: ql.Driver (SessionState.java:printError(1097)) - FAILED: SemanticException MetaException(message:Exception thrown when executing query : .. 2018. 12. 4.
[hive] inline() 함수를 이용하여 JSON 문자열 테이블화 예제 JSON 형태의 문자열로 들어오는 칼럼을 UDTF 함수를 이용하여 테이블로 만들어야 할 때 다음과 같이 사용할 수 있다. JSON 문자열의 데이터를 찾는 것은 get_json_object()를 이용하고, inline() 함수를 이용하여 테이블화 한다. hive> SELECT inline(array( struct(get_json_object(str, "$.key1")) > , struct(get_json_object(str, "$.key2")) )) > FROM ( SELECT '{ "key1": "a", "value1" : "1", "key2": "b", "value2" : "2" }' AS str ) t > ; OK a b Time taken: 0.031 seconds, Fetched: 2 row(s) 2018. 11. 21.
[hive][tez] TEZ엔진의 메모리 설정 방법 TEZ 엔진을 이용할 때 메모리 부족 오류가 발생하는 곳은 AM과 MR 작업 중에 발생한다. AM은 다음의 설정으로 메모리를 설정한다. // AM의 메모리 set tez.am.resource.memory.mb=2048; // AM이 사용할 힙메모리 사이즈(tez.am.resource.memory.mb의 80%) set tez.am.java.opts=-Xmx1600m; 그리고 MR 작업에서 메모리를 설정하는 방법은 다음과 같다. // tez 작업을 진행하는 컨테이너의 메모리 크기 set hive.tez.container.size=2048; // 컨테이너에서 사용할 수 있는 힙의 메모리 크기 set hive.tez.java.opts=-Xmx1600m; // hive.tez.container.size의 80%.. 2018. 8. 3.
[hive][tez] tez의 실행 시간 요약 확인을 위한 옵션(hive.tez.exec.print.summary)및 GC시간의 하이브 튜닝 하이브의 tez 실행엔진을 이용할 때 아래의 옵션을 이용하면 실행의 각 단계에서 걸리는 시간을 확인할 수 있다. hive.tez.exec.print.summaryDefault Value: falseAdded In: Hive 0.14.0 with HIVE-8495If true, displays breakdown of execution steps for every query executed on Hive CLI or Beeline client. 옵션을 true 로 설정하고 쿼리를 실행하면 다음과 같이 실행의 각단계에서 걸리는 시간을 확인할 수 있다. 이때 각 단계에서 걸리는 시간을 이용하여 쿼리를 튜닝할 수 있다. Launching Job 1 out of 1 Status: Running (Executing .. 2018. 7. 11.
[hive][error] 셔플 과정에서 발생하는 OutOfMemoryError: Java heap space, error in shuffle in fetcher 오류 해결방법 hive를 이용하여 MR 작업 처리중 shuffle 과정에서, OutOfMemory 오류가 발생하면 다음과 같이 수정하면 된다. Error: org.apache.hadoop.mapreduce.task.reduce.Shuffle$ShuffleError: error in shuffle in fetcher#12 at org.apache.hadoop.mapreduce.task.reduce.Shuffle.run(Shuffle.java:134) at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:377) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) at java.security.AccessCo.. 2018. 7. 2.
[hive] 하이브 데이터베이스 이름 변경(hive database rename) 기본적으로 하이브는 데이터베이스의 이름을 변경하는 것은 지원하지 않는다. 따라서 메타스토어(metastore)의 테이블에 있는 하이브 테이블의 이름을 수정하면 된다. 메타스토어는 ID 기준으로 처리 되기 때문에 메타스토어의 이름을 변경하면 적용된다. 우선 하이브 메타스토어(metastore)에 mysql 로 접속한다. * 설정한 기준에 따라 다르게 접속하면된다. * 메타 스토어의 주소를 모르면 hive-site.xml 에 설정된 javax.jdo.option.ConnectionURL 정보를 확인한다. 하이브 DB를 보면 DBS 테이블이 DB 관련 정보이다. mysql> desc DBS;+-----------------+---------------+------+-----+---------+-------+|.. 2018. 5. 25.
[hive] 트랜잭션(Transactional, ACID) 테이블 구성 Hive 트랜잭션 하이브는 0.13버전부터 트랜잭션을 지원한다. 파일 수정이 없는 HDFS의 특성상 모든 기능이 완벽하게 지원되지 않고, 기본(default) 트랜잭션 설정은 off로 되어 있다. BEGIN, COMMIT, ROLLBACK은 아직 지원하지 않음, 현재는 auto-commit 만 지원 ORC 파일 포맷, 버켓팅 설정이 된 매니지드 테이블에서만 지원 Non-ACID 세션에서는 ACID 테이블에 접근 불가 상세한 내용은 Hive Wiki를 참조하면 된다. 트랜잭션 구조 HDFS는 파일의 변경/수정을 지원하지 않는다. 따라서 HDFS에서 데이터의 수정, 삭제를 지원하기 위해서 데이터를 베이스(base) 파일에 기록하고, 트랜잭션이 발생할 때마다 델타(delta) 파일에 내용을 기록한다. 그리고 .. 2018. 5. 21.
[hive] Fatal error occurred when node tried to create too many dynamic partitions 오류 처리 하이브에서 다음과 같은 오류가 발생하면 이는 다이나믹 파티션 처리중 생성가능한 파티션 개수 이상의 파티션이 생성되어서 발생하는 것이다. 아래 오류의 내용처럼 해당 설정을 늘여주면 된다. Caused by: org.apache.hadoop.hive.ql.metadata.HiveFatalException: [Error 20004]: Fatal error occurred when node tried to create too many dynamic partitions. The maximum number of dynamic partitions is controlled by hive.exec.max.dynamic.partitions and hive.exec.max.dynamic.partitions.pernode. .. 2018. 5. 11.
[hive] Container failed, exitCode=1. Exception from container-launch 오류 해결방법 hive 처리중 tez의 AM 힙메모리 옵션을 다음과 같이 설정하였더니, 아래의 오류가 발생하였다. set tez.am.java.opts=-Xmx1600; 컨테이너를 실행하는 중에 오류가 발생하였는데,메모리 설정에서 m을 빠트려서 JVM 실행중 오류가 발생한 것이다. 다음의 오류가 발생할 때는 JVM 옵션에 이상은 없는지 확인하면 될 것이다. 그리고 위의 옵션은 다음과 같이 수정한다. set tez.am.java.opts=-Xmx1600; --> set tez.am.java.opts=-Xmx1600m; Container exited with a non-zero exit code 1]], TaskAttempt 2 failed, info=[Container container_1511744605848_9336.. 2018. 4. 26.
[hive] hive cli 로그 출력하게 설정 변경 hive CLI를 사용할 때 콘솔에서는 에러의 원인이 정확하게 나오지 않기 때문에, java Exception 등을 확인하기 위해서는 다음과 같이 설정하여 로그를 파일로 출력하게 설정하면 된다. * 물론 기본적으로 설정된 로그 위치에서 확인해도 된다. 2018. 4. 25.