본문 바로가기

HIVE126

[hive] tez 실행중 메모리 오류 발생 하이브에서 tez 엔진을 이용하여 작업중 다음과 같은 오류가 발생하는 경우이는 tez의 AM 기본메모리가 1G로 설정되어서 발생하는 오류이다. 기본메모리 이상으로 메모리를 설정하여 진행하면 된다. FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.tez.TezTask. Application application_*** failed 2 times due to AM Container for appattempt_*** exited with exitCode: - ***Current usage: 1.1 GB of 1 GB physical memory used;*** 다음의 옵션을 이용하여 AM의 메모리를 늘려서 처리하면 오류가 해.. 2017. 9. 20.
[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][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.
[oozie] 우지의 hive 액션 예제 우지의 하이브 액션을 이용하는 방법은 다음과 같다. 다음의 파일을 준비필수: workflow.xml, count.hql, job.properties옵션: hive-site.xml생성한 파일을 hdfs에 업로드우지 명령어 실행oozie job --oozie http://localhost:11000/oozie -config ./job.properties -run localhost:8032 hdfs://localhost:8020 hive-site.xml oozie.use.system.libpath true oozie.launcher.mapreduce.job.acl-view-job * oozie.launcher.mapred.job.queue.name q1 mapred.job.queue.name queue ooz.. 2017. 4. 6.
[hive] 하이브의 처리 결과에 칼럼정보 출력 or 추가 하이브에서 결과를 보여줄 때 결과 컬럼 정보를 출력하기 위해서는다음의 설정을 true 로 설정하면 된다. set hive.cli.print.header=true; 쿼리를 이용하여 테이블의 헤더를 출력하기 위해서는 hql 에 해당 옵션을 지정하고 실행하면 된다. 아래와 같이 cli_header.hql 파일을 생성하고, hive -f 를 이용하여 실행하면 query.result 에 칼럼의 헤더와 결과가 함께 입력되는 것을 볼 수 있다. SET hive.cli.print.header=true; SELECT * FROM sample LIMIT 100; > hive -f cli_header.hql >> query.result * INSERT OVERWRITE DIRECTORY 를 이용하여 파일시스템에 데이터를 쓸.. 2017. 4. 6.
[hive] 쿼리를 이용하여 파일시스템에 데이터를 쓰기(INSERT OVERWRITE DIRECTORY) 하이브에서는 쿼리를 이용하여 데이터를 로컬이나 HDFS에 파일을 생성하는 것이 가능하다. Standard syntax:INSERT OVERWRITE [LOCAL] DIRECTORY directory1 [ROW FORMAT row_format] [STORED AS file_format] (Note: Only available starting with Hive 0.11.0) SELECT ... FROM ... Hive extension (multiple inserts):FROM from_statementINSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select.. 2017. 4. 6.
[hive] 문자열을 맵으로 변화하기 위한 str_to_map() 함수 하이브의 기본 함수 중에서 문자열을 맵 형식으로 변환하기 위한 함수로 STR_TO_MAP() 함수가 있다. 사용 방법은 다음과 같다. STR_TO_MAP("변환할 문자열", "리스트 구분자", "키밸류 구분자") 문자열을 맵형식으로 변환하는 방법은 다음과 같다. json 형식의 문자열도 REPLACE() 함수와 함께 사용하여 맵 형식으로 변환이 가능하다. 2017. 4. 5.
[hive] UDAF 구현 예제 UDAF는 AbstractGenericUDAFResolver를 상속하여 구현한다.Resolver 클래스전달파라미터를 체크실제 처리 프로세스 구현체(GenericUDAFEvaluator 구현)를 반환Evaluator 클래스 init(), merge(), terminatePartial() 등의 실제 처리 구현 getNewAggregationBuffer() - 집계에 사용할 AggregationBuffer 반환reset - aggregation 이 재사용될 때의 처리init - 입력 받는 아규먼트와 반환값의 타입을 지정iterate - 매퍼가 동작하는 동안 반복하는 작업terminatePartial - 부분적으로 집계작업을 종류할 때 작업merge - 집계작업의 결과를 머지할 때 terminate - 작업이 .. 2017. 3. 27.
[hive] UDF 구현 예제 하이브의 UDF는 두가지 방법으로 구현할 수 있다. UDF 클래스를 상속evaluate() 함수를 구현하여 처리GenericUDF 클래스를 상속initialize(), evaluate(), getDisplayString() 함수를 구현하여 처리 UDF 클래스를 상속하는 방법이 간단하고 처리하기 쉽다.GenericUDF를 사용하면 다음의 장점이 있다고 한다. A Generic User-defined function (GenericUDF) for the use with Hive. New GenericUDF classes need to inherit from this GenericUDF class. The GenericUDF are superior to normal UDFs in the following wa.. 2017. 3. 23.
[hive] 하이브의 UDF, UDAF, UDTF 하이브의 UDF는 UDF, UDAF, UDTF 로 구분된다. UDF: 한개의 행에서 동작한다. 입력과 출력은 하나이다. ex) TRIM()UDAF: 집계 함수이다. 여러 행의 데이터를 집계하여 하나의 결과를 출력합니다. ex) COUNT(), SUM()UDTF: 하나의 행을 입력으로 받아서 여러행의 데이터를 반환한다. ex) EXPLODE() 하이브에서 제공하는 기본 UDF를 이용할 수 있고, 사용자가 UDF 를 만들어서 적용할 수 도 있다. 사용자가 UDF를 만들어서 적용하는 방법은 다음과 같다. package sdk.hadoop.hive; import org.apache.hadoop.hive.ql.exec.UDF;import org.apache.hadoop.io.Text; public final cl.. 2017. 3. 22.
[hive] 하이브의 CSV 서데 사용 방법 하이브는 CSV 형식의 파일을 효과적으로 적재하기 위한 CSV 서데를 제공한다. * Hive 0.14 버전부터 기본 지원 ** CSV 서데를 이용하면 테이블 칼럼의 타입은 String 으로 고정 - sepratorChar: 칼럼간의 구분자 - quoteChar: 칼럼의 값을 지정한 문자로 묶어준다. - escapeChar: 칼럼에 데이터를 입력할 때 파싱하지 않고 무시 CREATE TABLE my_table( a string, b string)ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'WITH SERDEPROPERTIES ( "separatorChar" = ",", "quoteChar" = "'", "escapeChar" = "\\") S.. 2017. 3. 8.
[hive] 하이브 테이블에 데이터 입력 방법 하이브 테이블에 데이터를 입력하기 위해서는 몇가지 방법이 존재한다. - 테이블 생성시에 LOCATION 을 지정하는 방법CREATE TABLE employee ( id String, name String ) LOCATION 'hdfs://127.0.0.1/user/data/'; - LOAD DATA INPATH 를 이용하여 HDFS 의 파일을 입력하는 방법LOAD DATA INPATH 'hdfs://127.0.0.1/user/data/sample.csv' INTO TABLE tbl;;LOAD DATA INPATH '/user/data/sample.csv' INTO TABLE tbl;; - LOAD DATA LOCAL INPATH 를 이용하여 로컬의 데이터를 입력하는 방법LOAD DATA LOCAL INP.. 2017. 2. 21.
[hive] 하이브 테이블 생성하기 -- 테이블 생성CREATE TABLE employee ( id String, name String, lists ARRAY, maps MAP) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' -- 칼럼을 구분하는 기준 ESCAPED BY '\\' -- 값을 입력하지 않음 COLLECTION ITEMS TERMINATED BY ',' -- 리스트를 구분하는 기준 MAP KEYS TERMINATED BY '=' -- 맵데이터의 키와 밸류를 구분하는 기준 LINES TERMINATED BY '\n' -- 로(row)를 구분하는 기준 NULL DEFINED AS 'null' -- null 값을 표현(0.13 버전에서 추가) ; -- 생성한 테이블에 데이터 입력(hdfs 상의 .. 2017. 2. 21.
[hive] order by, sort by, cluster by 의 차이 Order by- 전체 데이터를 정렬- 하나의 리듀서로 진행- 용량이 커지면 문제가 발생할 가능성이 높음- 용량이 많을 경우 limit 를 이용하여 데이터를 제한해야 함 sort by- 리듀서별로 데이터를 정렬- 즉, 파일별로 정렬되어 생성됨- 보통 distribute by 와 함께 사용하여 처리, - distribute by는 리듀서로 보내는 데이터의 분류 기준 cluster by- distributed by, sort by를 동시에 사용한 것 Hive 입문 발표 자료 from beom kyun choi http://saurzcode.in/2015/01/hive-sort-vs-order-vs-distribute-vs-cluster/ https://cwiki.apache.org/confluence/dis.. 2017. 2. 14.
[hive] 다이나믹 파티션의 __HIVE_DEFAULT_PARTITION__ 하이브에서 다이나믹 파티션으로 데이터를 생성할 때 다이나믹 파티션에 입력되는 이름이 null 이거나 공백이면 하이브에서 지정된(hive.exec.default.partition.name) 이름을 이용하여 파티션을 생성한다. hive-default.xml 에 설정된 기본 이름이 __HIVE_DEFAULT_PARTITION__이다. 아래와 같은 코드에서 country_code 칼럼에 공백이나 null 값이 있으면 기본으로 설정된 이름의 파티션이 생성된다. insert into table partition_sample partition (country_code)select country, country_code from world_name; show partitions partition_sample ;...c.. 2017. 2. 2.
[Hive] transform 으로 파이썬을 이용할 때 exception 출력하기 SELECT TRANSFORM(id, name) USING 'transform.py' as (id, name) FROM tbl; 이렇게 transform.py 를 구성할 때 sys.stderr 을 이용하여 오류를 출력한다. except Exception as err: print >> sys.stderr, err # print to stderr (python 2 syntax) sys.exit(1) 2017. 1. 23.
[Hive] TRANSFORM()을 이용하여 입력데이터 변형(custom mapreduce 사용하기) TRANSFORM() 명령은 하이브에 입력되는 원천로그를 변형해야 할 때 사용하면 된다. 만약 입력되는 로그가 아래와 같은 형식으로 입력된다고 한다면 일반적인 MR로는 처리가 블가능하다. 이때 TRANSFORM() 을 이용하여 출력형식을 아래와 같이 변경하는 것이 가능하다. DATA1Column1-1Column1-2DATA2Column2-1Column2-2 DATA1Column1-1Column1-2DATA2Column2-1Column2-2 #!/usr/bin/python# -*- coding: utf-8 -*-import re, json, sys, time def readFile(): with sys.stdin as lines: #with open("./TEST_DATA.txt") as lines: # .. 2017. 1. 23.
[hive] desc 명령을 이용하여 하이브 테이블, 파티션의 로케이션 확인하기 하이브의 테이블을 EXTERNAL로 설정하면 다른 위치에 있는 파일을테이블의 메타 정보로 읽을 수 있다. 파티션의 위치를 지정하여 파일을 읽는 경우에도 테이블의 메타 정보로 읽을 수 있다. 이런경우 테이블명과 파티션의 이름으로 파일의 물리적인 위치를 확인하기가 힘들다. 이럴때는 desc 명령어를 이용하여 파티션의 위치를 확인할 수 있다. hive> show tables;OKsample_table hive> desc sample_table;일반 정보 확인 hive> desc extended sample_table;확장된 테이블 정보 확인 hive> show partitions sample_table;테이블의 파티션 정보 확인 hive> desc sample_table partition(date_val='2.. 2017. 1. 19.
[hive][error] SemanticException Column "칼럼명" Found in more than One Tables/Subqueries SemanticException Column "칼럼명" Found in more than One Tables/Subqueries 하이브에서 다음과 같은 오류가 발생하는 원인은 조인 테이블이나 서브쿼리의 테이블에 동일한 이름의 칼럼이 있기 때문이다. 이럴때는 테이블의 얼라이어스를 이용하여 어느 테이블의 칼럼인지 명확하게 제시해 주어야 한다. SELECT a.column1, b.column1 FROM aTable a LEFT OUTER JOIN bTable b ON a.column1 = b.column1; 2017. 1. 6.
[hive][hql] hive 2 의 hqlsql 사용해보기 Hive 2.x 버전에서 hpl이 사용가능하다. hql은 Hybrid Procedural SQL 로서 오라클의 프로시저와 동일하다. SQL을 이용하여 IF, FOR 문 등의 절차형 처리를 가능하게 해준다. 여기(http://www.hplsql.org/home)에서 확인이 가능한데, 주의 할 점은 다른 DB의 프로시저에 구현되어 있는 구문들이 모두 구현되어 있지는 않다. 여기(http://www.hplsql.org/doc)에서 각 명령어가 구현되어 있는지 확인해서 처리하면 된다. hive 2.x 에서는 hqlsql이 사용가능하고, 간단하게 다음과 같이 테스트가 가능하다. 다음과 같이 hpl 파일을 저장한다. -- 10까지의 문자 출력 FOR i IN 1..10 LOOP DBMS_OUTPUT.PUT_LINE.. 2017. 1. 3.
[hive] ORC 파일 포맷 ORC(Optimized Row Columnar) 파일 포맷 ORC 파일 포맷은 하이브의 처리 속도를 높이기 위하여 개발 되었다. 하이브가 처음에 사용한 TextFile, SequenceFile 포맷의 처리속도를 높이기 위하여 RCFile 포맷이 개발 되었다. RCFile 포맷은 각 컬럼을 하나의 파일 묶음으로 만들었기 때문에 각 노드에 분산 처리된 데이터를 모으는 비용이 많이 들어가게 된다. 이를 극복하기 위하여 제안된 것이 ORC 파일 포맷이다. ORC 포맷은 칼럼 단위로 데이터를 기록하고, 인덱스를 기록하여 컬럼에 바로 접근할 수 있기 때문에 속도가 빨라진다. ORC 포맷은 호튼웍스의 부사장 오웬오말리가 제안한 것으로 하나의 파일에 칼럼을 json 처럼 중첩구조로 구성할 수 있고, 리스트, 맵과 같.. 2016. 12. 28.
[hive][error] msck repair table 처리시 오류 수정 하이브에서 EXTERNAL 설정으로 생성한 테이블에 디렉토리에 파일을 추가하고 테이블의 파티션 추가를 위해서 "repair table" 명령을 사용하여 처리할 수 있다. 그런데 Hive 1.3 버전 이상에서는 파티션에 허용되지 않는 문자가 있는 디렉토리에 한해서 예외를 반환할 수도 있다. 이럴 때는 다음의 설정을 추가하고 호출하면 된다. set hive.msck.path.validation=ignore;MSCK REPAIR TABLE table_name; 스택오버플로우 - http://stackoverflow.com/questions/40043986/hdinsight-hive-msck-repair-table-table-name-throwing-error하이브문서(Recover Partition 참조) -.. 2016. 12. 20.
[hive] Hive 2의 특징 올해 초 하이브 2가 발표 되었는데 그 내용을 정리해 본다. * 주요 내용은 LLAP의 적용, 기존 MR 엔진이 deprecated 되고 Tez 엔진이 적용, Spakr 지원 강화가 될 것 같다. New Functionality- HBase metastore (HIVE-9452) – alpha- 현재 메타스토어 구현은 테이블과 파티션이 늘어나면 느려진다. - 실행 계획을 짜는 시간이 더 줄어들게 되면서 더 빨라진다. - LLAP(Live Long and Process) (HIVE-7926) – beta- 새로운 하이브리드 실행모델- caching of columnar data, JIT-friendly operator pipelines, - and reduced overhead for multiple qu.. 2016. 12. 8.
[hive][error] java.io.IOException: Not a file 하이브에서 다음과 같이 지정한 경로에 파일이 존재하지 않으면 다음과 같은 오류가 발생한다. Launching Job 1 out of 1Number of reduce tasks is set to 0 since there's no reduce operatorjava.io.IOException: Not a file: hdfs://경로at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:286) 이럴때는 지정한 경로 하위의 디렉토리까지 읽을 수 있게 지정하면 된다. 다음의 프로퍼티를 설정하면 된다. SET mapred.input.dir.recursive=TRUE; 2016. 12. 1.
[hadoop][hive] 맵리듀스 처리시 오류가 발생해도 무시하고 진행하게 하는 프로퍼티 하둡은 형식이 없는 데이터를 처리하다보니 처리중 오류가 발생할 경우가 있다. 예를 들어 텍스트 파싱을 진행하는 매퍼 작업의 경우 10개중 1개가 실패할 경우 성공으로 인식하여 처리하게 할 수 있다. 이런 경우 다음의 설정값을 이용하여 처리하면 된다. 매퍼작업과 리듀스 작업을 나눠서 설정이 가능하다. [신버전]mapreduce.map.failures.maxpercent=10;mapreduce.reduce.failures.maxpercent=10; [구버전 Deprecated]mapred.max.map.failures.percent=10;mapred.max.reduce.failures.percent=10; 하둡의 버전이 달라지면서 기존의 설정과 이름이 바뀌었기 때문에 하둡 버전에 맞게 사용해야 한다. 2016. 11. 24.
[hive] 하이브 테이블의 null 값 표현 하이브의 NULL 값에 대한 기본 표현은 \N 이다. 따라서 하이브로 쓴 파일을 읽어보면 \N으로 표현되어 있어 파일을 열었을 때 헷갈릴 수가 있다. 이는 하이브 테이블 설정의 serialization.null.format 를 이용하여 원하는 형태로 수정할 수 있다. CREATE EXTERNAL TABLE people_v1 ( id INT, username STRING, email_address STRING, phone_number STRING, first_name STRING, last_name STRING, middle_name STRING, sex STRING, birthdate DATE, join_date STRING, previous_logins INT, last_ip STRING)ROW FOR.. 2016. 10. 24.
[hive][error] MetaException(message:Metastore contains multiple versions) 처리 AWS의 EMR에서 하이브를 이용하다 보면 한번씩 이런 오류가 발생할 때가 있다. 원인은 하이브의 메타스토어 중 VERSION 테이블에 여러개의 정보가 들어가 있어서이다. 해당 테이블에는 버전정보가 하나, 다시말해 1row 만 있어야 하는데 하이브 소스에서 해당 정보가 없으면 insert 하는 로직이 있어서 두개의 정보가 들어가서 오류가 발생한다. 이럴경우 VERSION 테이블에 1번 row 의 데이터외에 나머지 정보는 모두 지워버리면 된다. 하이브의 DB 정보는 hive-site.xml 파일을 확인하면 DB 접속 정보를 알 수 있다. 이 정보를 이용하여 DB에 접속하여 VERSION 테이블의 정보를 지우면 된다. http://www.popit.kr/hive-metastore-contains-multip.. 2016. 10. 7.
[hive][EMR] EMR의 하이브 작업이 쓴 파일 확인하기 EMR 하이브 처리결과가 파일로 저장될 때 파일명은 EMR에서 임의의 값으로 설정해 준다. hdfs://location/175508f3-1524-46ee-88c2-24722c5d5749-000XXX 이로 인하여 같은 파티션에 파일이 저장되면 어떤 잡이 해당 파일을 썻는지 알 수가 없다. 이럴때는 하이브 잡로그를 확인하여 결과를 확인해야 한다. 하이브 테이블 로케이션을 s3로 잡은 경우 파일은 최종적으로 'com.amazon.ws.emr.hadoop.fs.s3n.Jets3tNativeFileSystemStore' 클래스를 이용하여 파일이 쓰여진다. 또한 'org.apache.hadoop.hive.ql.exec.FileSinkOperator' 클래스도 파일 쓰기에 관여하기 때문에 이 클래스의 정보를 grep.. 2016. 9. 30.