본문 바로가기

빅데이터/hive127

[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][tez] tez 처리중 tez.lib.uris is not defined in the configuration 오류 수정 2017-02-06 02:11:55,396 ERROR [Thread-117] org.apache.hadoop.yarn.YarnUncaughtExceptionHandler: Thread Thread[Thread-117,5,main] threw an Exception.java.lang.RuntimeException: org.apache.tez.dag.api.TezUncheckedException: Invalid configuration of tez jars, tez.lib.uris is not defined in the configurationat org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:604)at org.apache.h.. 2017. 2. 7.
[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][tez][mr] 하이브 처리중 매퍼의 개수 설정하는 벙법 하이브의 맵리듀스 처리중 속도가 너무 느리다면 매퍼의 개수를 늘려서 처리를 해볼 수 있다. 이럴때 매퍼의 개수를 늘이기 위한 설정은 다음과 같다. * MR 엔진일때와 Tez 엔진일때 다른 설정을 이용한다. SET hive.exec.reducers.bytes.per.reducer=67108864;SET mapreduce.input.fileinputformat.split.minsize.per.node=134217728;SET mapreduce.input.fileinputformat.split.minsize.per.rack=134217728;SET mapreduce.input.fileinputformat.split.minsize=67108864;SET mapreduce.input.fileinputformat... 2017. 1. 17.
[hive] java.net.URISyntaxException: Relative path in absolute URI: file:./tmp/yarn 오류 처리 하이브 처리중 다음과 같은 오류가 발생하는 경우는 scratchdir 를 설정해 주면된다. 아래의 오류는 getScratchDir() 메소드를 호출하다가 오류가 발생한것을 알 수 있다. 따라서 아래의 설정을 해주면 된다. hive.exec.scratchdir/tmp/hivehive.exec.local.scratchdir/tmp/hive 위의 설정은 하이브 처리중 사용하는 플랜 파일이나, 임시 파일들을 저장하기 위하여 사용한다. 2017-01-13 07:33:08,521 INFO [hive-job uber-SubtaskRunner] org.apache.hadoop.hive.ql.exec.SerializationUtilities: Serializing MapredWork using kryo2017-01-13.. 2017. 1. 17.
[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.
[hive][error] 하이브의 mysql 커넥터 오류 수정 우지를 이용하여 하이브 액션 처리시 다음의 오류가 발생한다. Caused by: MetaException(message:For direct MetaStore DB connections, we don't support retries at the client level.)at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.reconnect(HiveMetaStoreClient.java:263)at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.invoke(RetryingMetaStoreClient.java:88)at com.sun.proxy.$Proxy40.alter_partitions(Unknown Sou.. 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.
[hive] 하이브의 가상 컬럼(virtual column)을 이용하여 파일 내용 삭제 하이브는 0.8.0 버전부터 가상칼럼을 제공한다. - INPUT__FILE__NAME: 파일명- BLOCK__OFFSET__INSIDE__FILE: 파일에서의 offset 이는 다음과 같이 사용하면 된다. SELECT INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE, column1, column2 FROM table; 가상칼럼을 이용하여 하이브 테이블엥 로드된 파일의 이름을 알 수 있다. AWS는 S3에서의 하이브 delete 명령은 아직 지원하고 있지 않기 때문에,잘 못 입력된 내용을 지우고 싶다면 가상컬럼을 이용하여 파일을 확인하고, 오프셋을 이용하여 위치를 확인한 후 개별적으로 지워야 한다. 2016. 9. 30.
[하이브] 매니지드 테이블과 익스터널 테이블 변경하기 하이브의 테이블은 매니지드(MANAGED) 테이블과 익스터널(EXTERNAL) 테이블 타입이 존재한다. 매니지드 테이블은 테이블을 drop 하면 관리하는 파일도 삭제가 되고, 익스터널 테이블은 파일은 보관된다. 중요한 파일을 저장하는 테이블은 익스터널로 설정하여 실수로 파일이 삭제 되는 것을 막는 것이 좋다. 매니지드 테이블을 익스터널로 수정하는 방법은 다음과 같다. ALTER TABLE 테이블명 SET TBLPROPERTIES('EXTERNAL'='TRUE');ALTER TABLE 테이블명 SET TBLPROPERTIES('EXTERNAL'='FALSE'); 2016. 9. 23.
[hive] skewed 테이블 하이브의 성능을 높이기 위해서 스큐드 테이블을 이용할 수 있다. 스큐드(skewed)란 사전적으로 비스듬하다는 뜻이다. 하이브에서 스큐드 테이블을 선언하면 해당 컬럼으로 많이 들어오는 데이터는 따로 파일을 만들어서 보관하게 된다. 칼럼의 특정 값으로 데이터가 많을때 선언하게 되면 따로 파일을 만들어 주게 되어 성능을 올릴 수 있게 된다. 하이브 매뉴얼에 다음과 같은 내용이 존재한다. 스큐드 테이블을 이용하면 파일을 따로 생성하여 주고, 거기에 리스트 버켓팅까지 추가하면 따로 디렉토리로 만들어 준다고 한다. Skewed Table vs. List Bucketing TableSkewed Table is a table which has skewed information.List Bucketing Table i.. 2016. 9. 12.