본문 바로가기

HIVE126

[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의 실행 시간 요약 확인을 위한 옵션(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.
[hive][스크랩] hive orc 예제 ORC는 칼럼 기반의 파일 저장방식으로, hive에 적용하면 성능을 개선할 수 있다. 사용방법은 다음과 같이 STORED AS를 ORC로 선언해주면 된다. 그리고 TBLPROPERTIES에 설정정보를 입력할 수 있다. CREATE TABLE table1( col1 string, col2 string, col3 string, col4 string)STORED AS ORCTBLPROPERTIES ("orc.compress"="ZLIB","orc.compress.size"="262144","orc.create.index"="true","orc.stripe.size"="268435456","orc.row.index.stride"="3000","orc.bloom.filter.columns"="col1,col2").. 2018. 4. 20.
[hive] hive에서 함수용 테스트 array, map 데이터 생성하는 법 hive의 함수를 테스트할 때 array, map, json 문자열을 이용하여 값을 테스트 해야 하는 경우가 있다. 이럴때 임시로 문자열을 이용하여 데이터를 생성하고 테스트하면 편리하다. 다음과 같이 사용한다. select array(1,2,3)[2]; select array("a","b","c")[1]; select str_to_map("key1:value1,key2:value2", ",", ":")['key2']; SELECT get_json_object('{"store": {"fruit":\[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}], "bicycle":{"price":19.95,"color":"red"} }, "email":"amy@only.. 2018. 4. 12.
[hive] rank() 함수 처리중 Caused by: org.apache.hive.com.esotericsoftware.kryo.KryoException: java.lang.IndexOutOfBoundsException hive 쿼리중 rank() 함수를 이용하였는데 다음과 같은 오류가 발생하였다. json을 UDTF를 이용하여 변환하는 함수 였는데 오류가 발생하였다. 그래서 cbo를 false 로 설정했더니 처리 되었다. explain 으로 확인결과 Reduce 단계가 하나 빠진것이 해결된 것 같다. 정확한 원인은 알 수 없으나 검색결과는 bug 일 가능성도 있는 것 같다. 혹시 모르니 cbo 를 false 로 설정해보길 권한다. set hive.cbo.enable=false; Caused by: java.lang.RuntimeException: Failed to load plan:org.apache.hive.com.esotericsoftware.kryo.KryoException: java.lang.IndexOutOf.. 2018. 4. 9.
[hive] hive 쿼리 where 조건의 in 사용시 메타 스토어 오류 hive의 쿼리에서 in 을 이용하여 데이터를 비교할 때 다음과 같이 transform 구문을 이용하여 처리하였다.그랬는데 비교부분 테이블의 파티션이 늘어나면서 다음과 같이 BufferOverflowException 이 발생하였다. SELECT * FROM table1 WHERE create_date in ( select explode( split( yyy.date_list, ',' ) ) ... ) 파티션의 정보를 비교하다가 버퍼 오퍼플로우 익셉션이 발생하였다. 2018-09-09T01:11:11,111 WARN [pool-5-thread-200([])]: metastore.MetaStoreDirectSql (MetaStoreDirectSql.java:executeWithArray(1750)) - Fa.. 2018. 4. 9.
[hive] Hive의 데이터를 CSV 형태의 파일로 export 하는 방법 하이브의 데이터를 csv 형태로 export 하는 방법은 다음과 같다. 다음과 같이 INSERT DIRECTORY 문을 이용화여 파일로 데이터를 작성하는 방법이다. 데이터 양이 작을 경우에는 LOCAL 문을 추가하여 로컬에 데이터를 저장해도 되고, 데이터 양이 많다면 hdfs 에 데이터를 저장하면 된다. hive -e "INSERT OVERWRITE [LOCAL] DIRECTORY 'hdfs://hdfs_location'ROW FORMAT DELIMITEDFIELDS TERMINATED BY ','STORED AS TEXTFILESELECT * FROM temp;" * cli 환경에서 상요할 때는 \ 를 추가하여 개행이 되도록 설정 칼럼 헤더를 파일에 추가해야 한다면 다음과 같이 처리하는 방법도 있다. .. 2018. 3. 30.
[hive] 하이브에서 insert, delete, update 사용 Hive ACID 0.13버전부터 ACID를 지원하곡, 0.14버전부터 Update, Delete를 포함한 DML을 지원 ORC 일때만 지원 CREATE TABLE table1 ( ) SOTRED AS ORC TBLPROPERTIES ("transactional"="true") 제약사항 auto-commit 으로 처리 ORC 포맷만 지원 버켓팅 되어야 함 Managed 테이블만 가능 External 테이블은 Compactor 가 제어할 수 없기 때문 Non-ACID 세션에서는 ACID 테이블에 접근 불가 기본 설계 테이블이나 파티션은 base 파일의 집합으로 저장 새로운 레코드, update, delete 에 대해서는 delta 파일로 저장 읽는 시점에 delta 파일과 합쳐서 새로운 파일 생성 Comp.. 2018. 3. 30.
[hive] An error occurred when trying to close the Operator running your custom script. 오류 해결방법 hive 수행중 USING 문을 이용하여 스크립트 파일을 실행할 때 다음의 오류가 발생하는 경우가 있다. Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: [Error 20003]: An error occurred when trying to close the Operator running your custom script.at org.apache.hadoop.hive.ql.exec.ScriptOperator.close(ScriptOperator.java:585)at org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:696) 이럴경우 ADD FILE 구문을 이용해서 파일을 추가해주고 진행하면.. 2018. 3. 20.
[hive] 메타스토어의 테이블로 파티션 위치 확인하는 방법 하이브 테이블의 파티션별 로케이션을 확인하는 명령은 다음과 같다. DESC FORMATTED 테이블_명 PARTITIONS (part_col=1, part_col=2); ...# Detailed Partition Information Partition Value: [1, 2] Database: 데이터베이스Table: 테이블CreateTime: Tue Dec 05 02:51:17 UTC 2017 LastAccessTime: UNKNOWN Location: hdfs://locationPartition Parameters: 이렇게 로케이션을 확인 할 수 도 있지만, 하이브 메타스토어에 접속하여 로케이션을 확인 할 수 도 있다. 하이브 메타스토어의 데이터를 저장하고 있는 DB에 직접 접속하여 다음의 쿼리로 확인.. 2018. 3. 19.
[hive] hive.exec.dynamic.partition.mode, hive.optimize.sort.dynamic.partiton 설정에 따른 성능 저하 확인 하이브에 hive.exec.dynamic.partition.mode 옵션은 다음과 같이 다이나믹 파티션으로 모든 데이터를 입력해야 할 때 nonstrict 모드로 설정해야 할 때 사용한다. hive.exec.dynamic.partition.modeDefault Value: strictAdded In: Hive 0.6.0In strict mode, the user must specify at least one static partition in case the user accidentally overwrites all partitions. In nonstrict mode all partitions are allowed to be dynamic.Set to nonstrict to support INSERT .. 2018. 3. 8.
[hive] 하이브에서 MR 작업 결과를 merge 하는 방법 하둡은 작은 크기의 파일이 많으면 성능에 안좋은 영향을 주게 된다. 파일이 많다. -> 네임노드가 관리해야할 파일이 많아진다. -> 성능이 느려진다. 작은 사이즈의 파일이 많다. -> 네임노드가 관리해야 하는 블록의 개수가 많아진다. -> 성능이 느려진다. 따라서 하이브 작업의 결과를 합쳐서 비슷한 크기로 만드는 것이 좋다. 아래의 설정을 이용하여 결과를 합쳐준다. set hive.merge.mapfiles=true; - map only 잡의 결과 파일을 합친다. set hive.merge.mapredfiles=true; - 맵리듀스 잡의 결과 파일을 합친다. set hive.merge.tezfiles=true; - tez 엔진 작업의 결과를 합친다. set hive.merge.smallfiles.avg.. 2018. 3. 7.
[hive] 테이블 생성시 예약어를 사용하는 방법 하이브 테이블 생성시에 예약어를 칼럼 명으로 사용해야 하는 경우가 있을 수 있다. 이럴때는 역 따옴표(`)를 이용하여 칼럼명을 감싸주면 생성할 수 있다. * hive 0.13 이후부터 적용 CREATE EXTERNAL TABLE IF NOT EXISTS test_table ( `timestamp` string, ); https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTableCreate/Drop/TruncateTable 2018. 2. 8.
[hive] java.lang.OutOfMemoryError: Java heap space 오류 수정 하이브 tez 엔진 처리중 발생하는 java.lang.OutOfMemoryError: Java heap space오류는 다음과 같이 설정하여 수정할 수 있다. 이번 경우는 OpenCSVSerde 에서 발생하였는데 다음과 같이 container size 를 수정하여 처리하였다. set hive.tez.container.size=4096;set hive.tez.java.opts=-Xmx3280m; ], TaskAttempt 3 failed, info=[Error: Error while running task ( failure ) : attempt_1513225774189_104839_1_00_000002_3:java.lang.RuntimeException: java.lang.OutOfMemoryError: .. 2018. 1. 3.
[hive][db] rank() 함수를 이용하여 그룹별로 상위 n개의 결과만 출력하는 방법 그룹별로 상위 n개의 데이터만 출력하는 방법은 윈도우 함수(window function) 중에서 RANK() 함수를 이용한다. RANK 함수는 ORDER BY를 포함한 쿼리에서 특정 칼럼의 순위를 구하는 함수이다. 아래와 같이 PARTITION BY, ORDER BY 를 함께 이용하여 그룹별로 순위를 구할 수 있고,이 순위를 이용하여 상위 n개의 결과만 출력이 가능하다. SQL> SELECT JOB, ENAME, SAL, RANK( ) OVER (ORDER BY SAL DESC) ALL_RANK, RANK( ) OVER (PARTITION BY JOB ORDER BY SAL DESC) JOB_RANK FROM EMP; JOB ENAME SAL ALL_RANK JOB_RANK --------- ------.. 2017. 12. 27.
[hive] 하이브 성능 최적화 방안 하이브의 성능 향상을 위한 방안은 다음과 같다. TEZ 엔진 사용hive 의 기본엔진은 mr 이었으나 2.x로 넘어오면서 tez를 사용하게 되었다. mr 엔진은 맵리듀스 연산중 중간 파일을 로컬 디스크에 쓰면서 진행한다. 이로 인한 IO 비용으로 늦어지게 되는데 tez 엔진은 이 임시 파일을 메모리에 저장하여 처리 속도를 높인다. : 엔진 설정 및 큐 설정set hive.execution.engine=tez;set tez.queue.name=queue; ORC 파일 사용데이터 저장에 ORC 파일 포맷을 이용한다. ORC 파일 포맷은 데이터를 컬럼별로 저장하기 때문에 검색 속도와 압축률이 좋다. 아래와 같이 CREATE 문에 STORED AS 구문을 추가하면 된다. 압축방식도 프로퍼티를 이용하여 설정할 수.. 2017. 12. 26.
[hive] explode, lateral view 사용 예제 hive 에서 array, map 타입의 데이터를 처리하기 편리하게 하기 위해서 1행의 데이터를 여러행의 데이터로 펼쳐주는 explode UDTF 함수가 존재한다. 이 함수와 lateral view 명령어를 이용하면 array, map을 쉽게 처리할 수 있다. 사용 방법은 다음과 같다. select mapcolumn from table1;> {"key1" : "value1", "key2" : "value2"} select key, value from table1 lateral view explode(mapcolumn) k as key, value limit 10 ; key1 value1key2 value2 https://cwiki.apache.org/confluence/display/Hive/Langua.. 2017. 12. 26.
[hive] drop table partitions 의 null 오류 hive에서 테이블의 파티션 드랍시에 비교 연산자를 이용 할 수 있는데,이때 DDLTask Exception null 오류가 발생하는 경우가 있다. ALTER TABLE table1 DROP PARTITION (partCol 2017. 12. 21.
[hive] JSON 문자열을 맵으로 변환(json string to map) hive 에서 json 문자열을 map으로 변환하는 방법은 다음과 같다. SELECT substring("{'a':'1','b':'2'}", 2, length("{'a':'1','b':'2'}")-2); SELECT str_to_map(substring("{'a':'1','b':'2'}", 2, length("{'a':'1','b':'2'}")-2), ",", ":"); SELECT explode(str_to_map(substring("{'a':'1','b':'2'}", 2, length("{'a':'1','b':'2'}")-2), ",", ":")) as (key,value); hive> SELECT substring("{'a':'1','b':'2'}", 2, length("{'a':'1','b':'2.. 2017. 12. 12.
[hive] 하이브 성능 개선#1 - CBO, Stat 를 이용하여 통계 쿼리 성능 개선 하이브의 CBO, StatDEV를 이용하면 통계형 데이터(count, sum)의 데이터를 확인하는데 큰 성과를 볼 수 있다. 우선 하이브 위키의 StatDev(바로가기)와 Statics 관련 설정(바로가기)을 확인하면 좀더 많은 정보를 확인할 수 있다. 요약하면 하이브는 통계성 지표의 성능을 높이기 위해 메타데이터에 관련 정보를 저장하고 있다. desc extended 명령으로 확인하면 row 개수, 파일 개수, 파일 사이즈 등의 정보를 메타에 보관하고 있는 것을 볼 수 있다. 관련된 주요 설정은 다음과 같다. # 메타 정보를 이용하여 통계지표를 확인할 수 있게 함set hive.compute.query.using.stats=true; # 하이브가 자동으로 메타 정보를 수집하게 함(기본값 true)set.. 2017. 11. 29.
[개념] HCatalog, HCatalog Server HCatalog는 하이브 0.11.0 버전에 통합되었습니다. [바로가기] HCatalog Server는 Hive Metastore와 같습니다. 따라서 EMR의 경우 hive-hcatalog-server 로 실행되는 프로세스가 하이브 메타스토어 입니다. 개요 HCatalog는 하둡 에코 시스템의 데이터 처리 도구(Pig, MR, Hive)들 간의 테이블, 저장공간 관리 계층을 제공한다. HDFS 상의 파일들에 대한 추상계층을 제공하여, 사용자가 데이터의 위치, 저장 형태에 대하여 신경쓰지 않아도 되도록 제공한다. HCatalog는 파일을 읽고, 쓰기 위한 SerDe 를 제공한다. RCFile, CSV, JSON, SequenceFile, ORC 포맷을 지원한다. 사용자가 커스텀 포맷을 생성하여 처리할 수도.. 2017. 11. 28.
[hive] dynamic partition 에서 리듀서를 하나만 사용하는 오류 수정 하이브에서 다이나믹 파티션을 이용할 때 리듀서가 100개가 생겨도 하나의 리듀서만 이용하여 데이터를 생성하여 작업이 오래 걸리는 경우가 있다. 예를 들어 작업중 다음과 같은 쿼리를 이용하여 데이터를 적재하면 dynamic_partition 칼럼의 값을 이용하여 파티션을 생성하고 값을 입력하게 된다. INSERT INTO TABLE target_table PARTITION (dynamic_partition_col)SELECT col1, col2, dynamic_partition FROM source_table; 이때 dynamic_partition 칼럼의 값이 2개여서 파티션이 2개만 생성되게 되는데 리듀서가 100개 생성되어도 마지막 리듀서 2개만 사용하여 데이터를 쓰는 문제가 발생하였다. 이때 stat.. 2017. 11. 15.
[hive] tez로 처리중 File Merge 부분에서 오류 작업중 hive에서 tez 엔진으로 처리중 파일 머지를 실행하면 다음과 같은 오류가 발생하는 것을 확인하였다. 2017-10-24 01:26:03,407 INFO [Thread-152] SessionState: File Merge: 0/12017-10-24 01:26:03,412 INFO [Thread-153] org.apache.hadoop.hive.ql.exec.Task: Dag submit failed due to App master already running a DAG at org.apache.tez.dag.app.DAGAppMaster.submitDAGToAppMaster(DAGAppMaster.java:1368) at org.apache.tez.dag.api.client.DAGClientHa.. 2017. 10. 24.