본문 바로가기

빅데이터/hive127

[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] CBO처리중 힌트 사용시 오류 조인 처리시 힌트를 이용하여 조인 처리를 지시할 수 있는데, 맵조인이 되지 않아 로그를 확인해 보니 cbo 를 이용할 때는 힌트를 이용할수 없다는 에러메시지가 나온다. Hint specified for /*+ MAPJOIN(TABLE) */. Currently we don't support hints in CBO, turn off cbo to use hints. 따라서 다음의 옵션로 cbo 처리를 끄고 나니 오류가 사라졌다. SET hive.cbo.enable=false; https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins#LanguageManualJoins-MapJoinRestrictions 2018. 3. 29.
[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] drop table 처리중 GC 또는 OutOfMemory 오류가 발생하는 경우 테이블 drop 중 OutOfMemory 오류가 발생하는 경우가 있다. 이럴때는 파티션을 먼저 지워주고 drop 하면 된다. java.lang.OutOfMemoryError: GC overhead limit exceeded orjava.lang.OutOfMemoryError: Java heap space 다음과 같이 파티션을 지우고 테이블을 drop 하면 된다. alter table [테이블명] drop partition (파티션명=값);alter table [테이블명] drop partition (파티션명 > 값); 2018. 3. 14.
[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] 정규식을 이용하여 문자열 검색 하이브의 데이터를 처리하다가 보면 문자열이 깨져서 오류가 발생하는 경우가 있다. 이런 경우 원인과 상관없는 오류를 알리면서 죽기 때문에 원인을 확인하기 힘들 경우가 많다. 주로 파티션을 결정하는 칼럼의 데이터가 깨지거나, where 조건문에 = 비교를 하는 데이터가 깨져서 발생하는 경우가 많다. 이런 경우 정규식을 이용하여 오류 데이터를 먼저 검증하여 오류를 해결할 수 있다. 정규식을 이용한 검증은 다음과 같다. hive> SELECT 'abc' RLIKE '^[a-zA-Z0-9]*$';OKtrueTime taken: 0.034 seconds, Fetched: 1 row(s) hive> SELECT '�bc' RLIKE '^[a-zA-Z0-9]*$';OKfalseTime taken: 0.026 secon.. 2017. 12. 14.
[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.
[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] TEZ에서 파일머지를 처리하는 중 App master already running a DAG 오류 처리 방법 TEZ를 이용하면서 파일 머지를 사용하면 다음과 같은 오류가 발생할 경우가 있다. 2017-11-10 05:21:48,998 INFO [Thread-140] org.apache.hadoop.hive.ql.exec.Task: Dag submit failed due to App master already running a DAGat org.apache.tez.dag.app.DAGAppMaster.submitDAGToAppMaster(DAGAppMaster.java:1368)at org.apache.tez.dag.api.client.DAGClientHandler.submitDAG(DAGClientHandler.java:140)at org.apache.tez.dag.api.client.rpc.DAGClientA.. 2017. 11. 10.
[hive] 다이나믹 파티션 처리시 0 byte 파일이 생성될 때 설정 다이나믹 파티션 처리시 매퍼 only 잡으로 처리중 0 byte 파일이 생성되는 경우가 있다. 이럴 경우 다음의 설정을 false 로 설정하면 문제를 해결 할 수 있다. set hive.optimize.sort.dynamic.partition=false; 2017. 10. 27.
[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.
[hive][error] TEZ 사용시 Caused by: java.lang.ArrayIndexOutOfBoundsException: 1024 오류 hive 2.1.0 에서 ORC 파일 포맷 이용중 다음의 오류가 발생하는 경우가 있다. Caused by: java.lang.ArrayIndexOutOfBoundsException: 1024 이 경우 다음의 지라와 같이 Hive 버그일 가능성이 높다. 이럴때는 이런 해결방법이 있다. hive 버전업 또는 패치 적용ORC 말고 다른 포맷으로 데이터를 저장 후 다시 ORC 포맷으로 저장파일 머지중 오류가 발생했다면 머지 기능을 잠시 off 리듀서를 1개로 설정하여 처리 https://issues.apache.org/jira/browse/HIVE-14483 2017. 8. 24.
[hive] 테이블 stat 갱신하기 하이브 테이블의 열 개수(count 정보), 파일개수, 사이즈 등이 메타스토어에 저장된다. 이를 이용하여 count 명령의 실행 속도를 높일 수 있다. 그런데 파일 정보가 갱신 된 것을 하이브가 확인하지 못할 때도 있다. 이럴때는 다음의 명령으로 테이블 정보를 갱신해 준다. ANALYZE TABLE 테이블명 COMPUTE STATISTICS; The first milestone in supporting statistics was to support table and partition level statistics. Table and partition statistics are now stored in the Hive Metastore for either newly created or existing ta.. 2017. 6. 26.
[hive] 하이브 테이블에 struct 같은 복합 데이터 load 하는 법 하이브 테이블에 struct 같은 복합 데이터를 입력하는 방법은,ROW FORMAT의 MAP KEY 딜리미터를 이용하여 값을 구분해주면 된다. 2017. 4. 12.
[hive] UDTF 예제 UDTF는 한행을 입력받아서 여러 행을 반환하는 함수이다. take in a single input row and output a single output row 크게 4가지 종류가 있다. explode, inline, posexplodearray, map, struct 형식의 데이터를 테이블 json_tuplejson 문자열을 파싱하여 반환get_json_object() 와 비슷한데 속도가 빠르다. 대신 xpath를 이용한 처리는 안됨url_tupleurl 문자를 파싱HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE 를 반환stack전달한 데이터를 여러개의 행으로 반환 > select * from employee;OKid-1john["a","b","c","d"]{.. 2017. 4. 12.
[hive][error] hive로 MR 작업중 Illegal mix of collations A and B for operation '=' ... 오류 하이브 처리중 다음과 같은 오류가 발생할 때가 있다. Caused by: org.mariadb.jdbc.internal.util.dao.QueryException: Illegal mix of collations (latin1_bin,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:479)at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executePreparedQuery(AbstractQueryProtocol.ja.. 2017. 4. 11.