Hive2016. 1. 20. 18:36

날짜계산의 예

set e_dt=from_unixtime(unix_timestamp(),'YYYY-MM-DD');

set yyyy = case when month(${hiveconf:e_dt}) < 4 then year(${hiveconf:e_dt})-1 else year(${hiveconf:e_dt}) end;

set m = case when month(${hiveconf:e_dt}) =1 then 10 

                         when month(${hiveconf:e_dt}) =2 then 11

                         when month(${hiveconf:e_dt}) =3 then 12

                         else month(${hiveconf:e_dt})-3 end;

set mm = case when ${hiveconf:m}<10 then concat('0',${hiveconf:m}) else ${hiveconf:m} end;

set s_dt= concat(${hiveconf:yyyy},'-',${hiveconf:mm},'-01');

Posted by 유나아빠
Hive2015. 3. 11. 18:50

새로운 하둡 클러스터를 구축하게 되어 Hive 데이터도 기존 환경에서 새 환경으로 옮겨야하는 상황

Hive도 다른 RDBMS와 비슷하게 Export/Import기능을 제공한다. 

단지 아직까지는 테이블단위만 가능하지만 DB단위로 Export/Import하기 위해 스크립트를 작성해봤다.

일단 작업의 흐름은 크게 3가지

1. 기존환경에서 Export

2. 새 환경에서 Distcp (기존환경에서 Export해놓은 화일을 새환경으로 카피)

3. 새 환경에서 Import


사전작업으로서 export할 DB의 테이블리스트를 작성한다

hive --database 디비명 -e 'SHOW TABLES' | sed -e '1d' > db_tables_list.txt

기본 환경에서 Export

#!/bin/bash

TBLS=(`cat db_tables_list.txt`)

    for TBL in ${TBLS[@]}

    do

        echo "export start: ${TBL}"

        echo "hive --database 디비명 -e \"export table ${TBL} to '/user/hadoop/xxx_export/${TBL}'\""

        hive --database 디비명 -e "export table ${TBL} to '/user/hadoop/xxx_export/${TBL}'"

        echo "export end: ${TBL}"

        echo

    done

새환경에서 Distcp

#!/bin/bash

        echo "distcp start"

        echo "hadoop distcp hftp://기존환경네임노드의 호스트명:50070/user/hadoop/xxx_export hdfs://새환경의 호스트명:8020/user/hadoop/xxx_import"

        hadoop distcp hftp://기존환경네임노드의 호스트명:50070/user/hadoop/xxx_export hdfs://새환경의 호스트명:8020/user/hadoop/xxx_import

        echo "distcp end"

새환경에서 Import

#!/bin/bash

TBLS=(`cat db_tables_list.txt`)

    for TBL in ${TBLS[@]}

    do

        echo "import start: ${TBL}"

        echo "hive --database 디비명 -e \"import from '/user/hadoop/xxx_import/${TBL}'\""

        hive --database 디비명 -e "import from '/user/hadoop/xxx_import/${TBL}'"

        echo "import end: ${TBL}"

        echo

    done


데이터를 카피할때의 주의점은 

DistCp는 새버전의 하둡환경에서 실행해야한다는 것과 

구환경과 신환경의 하둡 버전이 다른 경우에는 export하는 쪽은 hftp://namenode_hostname:50070을

import하는 쪽은 hdfs://namenode_hostname:8020을 사용해야한다는 것이다.


distcp시의 주의점

http://www.cloudera.com/content/cloudera/en/documentation/core/v5-3-x/topics/cdh_admin_distcp_data_cluster_migrate.html


Posted by 유나아빠
Hive2015. 2. 8. 19:27

오늘은 일요일

아래와 같은 HiveQL 실행에러가 발생했다.

2015-02-08 07:17:36,494 ERROR metadata.Hive (Hive.java:getTable(931)) - NoSuchObjectException(message:xxxx table not found)

        at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.get_table(HiveMetaStore.java:1351)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:606)

        at org.apache.hadoop.hive.metastore.RetryingHMSHandler.invoke(RetryingHMSHandler.java:105)

        at com.sun.proxy.$Proxy10.get_table(Unknown Source)

        at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.getTable(HiveMetaStoreClient.java:780)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:606)

        at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.invoke(RetryingMetaStoreClient.java:89)

        at com.sun.proxy.$Proxy11.getTable(Unknown Source)

        at org.apache.hadoop.hive.ql.metadata.Hive.getTable(Hive.java:928)

        at org.apache.hadoop.hive.ql.metadata.Hive.getTable(Hive.java:870)

        at org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.getMetaData(SemanticAnalyzer.java:968)

        at org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.getMetaData(SemanticAnalyzer.java:936)

        at org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.getMetaData(SemanticAnalyzer.java:1046)

        at org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.getMetaData(SemanticAnalyzer.java:944)

        at org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.analyzeInternal(SemanticAnalyzer.java:8217)

        at org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.analyze(BaseSemanticAnalyzer.java:258)

        at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:459)

        at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:349)

        at org.apache.hadoop.hive.ql.Driver.run(Driver.java:938)

        at org.apache.hadoop.hive.ql.Driver.run(Driver.java:902)

        at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:259)

        at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:216)

        at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:412)

        at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:347)

        at org.apache.hadoop.hive.cli.CliDriver.processReader(CliDriver.java:445)

        at org.apache.hadoop.hive.cli.CliDriver.processFile(CliDriver.java:455)

        at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:713)

        at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:613)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:606)

        at org.apache.hadoop.util.RunJar.main(RunJar.java:208)

없다고하는 테이블 확인해 보니 있다. 그리고 재실행하니 문제 없이 돌아간다.

이건 어떤 경우에 발생하는 에러일까?

내일 출근해서 조사해봐야겠다.

Posted by 유나아빠
Hive2015. 1. 15. 18:33

요즘 처음 보는 에러가 자구 발생하네 헙헙!

메터스토어의 버젼이 여러개 있다는 에러메세지

2015-01-14 15:08:04,329 ERROR metastore.HiveMetaStore (HiveMetaStore.java:startMetaStore(4323)) - MetaException(message:Metastore contains multiple versions)

        at org.apache.hadoop.hive.metastore.ObjectStore.getMSchemaVersion(ObjectStore.java:5861)

        at org.apache.hadoop.hive.metastore.ObjectStore.getMetaStoreSchemaVersion(ObjectStore.java:5823)

        at org.apache.hadoop.hive.metastore.ObjectStore.checkSchema(ObjectStore.java:5782)

        at org.apache.hadoop.hive.metastore.ObjectStore.verifySchema(ObjectStore.java:5770)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:606)

        at org.apache.hadoop.hive.metastore.RawStoreProxy.invoke(RawStoreProxy.java:108)

        at com.sun.proxy.$Proxy0.verifySchema(Unknown Source)

        at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.getMS(HiveMetaStore.java:408)

        at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.createDefaultDB(HiveMetaStore.java:446)

        at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.init(HiveMetaStore.java:333)

        at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.<init>(HiveMetaStore.java:293)

        at org.apache.hadoop.hive.metastore.RetryingHMSHandler.<init>(RetryingHMSHandler.java:54)

        at org.apache.hadoop.hive.metastore.RetryingHMSHandler.getProxy(RetryingHMSHandler.java:59)

        at org.apache.hadoop.hive.metastore.HiveMetaStore.newHMSHandler(HiveMetaStore.java:4085)

        at org.apache.hadoop.hive.metastore.HiveMetaStore.startMetaStore(HiveMetaStore.java:4287)

        at org.apache.hadoop.hive.metastore.HiveMetaStore.main(HiveMetaStore.java:4221)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:606)

        at org.apache.hadoop.util.RunJar.main(RunJar.java:212)


2015-01-14 15:08:04,330 ERROR metastore.HiveMetaStore (HiveMetaStore.java:main(4224)) - Metastore Thrift Server threw an exception...

MetaException(message:Metastore contains multiple versions)

        at org.apache.hadoop.hive.metastore.ObjectStore.getMSchemaVersion(ObjectStore.java:5861)

        at org.apache.hadoop.hive.metastore.ObjectStore.getMetaStoreSchemaVersion(ObjectStore.java:5823)

        at org.apache.hadoop.hive.metastore.ObjectStore.checkSchema(ObjectStore.java:5782)

        at org.apache.hadoop.hive.metastore.ObjectStore.verifySchema(ObjectStore.java:5770)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:606)

        at org.apache.hadoop.hive.metastore.RawStoreProxy.invoke(RawStoreProxy.java:108)

        at com.sun.proxy.$Proxy0.verifySchema(Unknown Source)

        at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.getMS(HiveMetaStore.java:408)

        at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.createDefaultDB(HiveMetaStore.java:446)

        at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.init(HiveMetaStore.java:333)

        at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.<init>(HiveMetaStore.java:293)

        at org.apache.hadoop.hive.metastore.RetryingHMSHandler.<init>(RetryingHMSHandler.java:54)

        at org.apache.hadoop.hive.metastore.RetryingHMSHandler.getProxy(RetryingHMSHandler.java:59)

        at org.apache.hadoop.hive.metastore.HiveMetaStore.newHMSHandler(HiveMetaStore.java:4085)

        at org.apache.hadoop.hive.metastore.HiveMetaStore.startMetaStore(HiveMetaStore.java:4287)

        at org.apache.hadoop.hive.metastore.HiveMetaStore.main(HiveMetaStore.java:4221)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:606)

        at org.apache.hadoop.util.RunJar.main(RunJar.java:212)


메터스토어의 VERSION테이블을 보니 에러메세지 대로 2개의 레코드가 존재....왜일까?

원인 파악중...

mysql> select * from VERSION;
+--------+----------------+------------------+
| VER_ID | SCHEMA_VERSION | VERSION_COMMENT  |
+--------+----------------+------------------+
|      1 | 0.12.0         | Set by MetaStore |
|     17 | 0.12.0         | Set by MetaStore |
+--------+----------------+------------------+
2 rows in set (0.00 sec)


Posted by 유나아빠
Hive2015. 1. 8. 17:42

HiveQL실행시 발생하는 Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient 에러

DB의 데이터를 Sqoop을 이용하여 Hive에 저장한후 HiveQL로 집계처리를 하고 있는데

지금까지 본적이 없는 에러가 발생했다.

일단 HiveQL실행 로그는 아래와 같다.

Logging initialized using configuration in jar:file:/usr/local/hive-0.10.0-cdh4.4.0/lib/hive-common-0.10.0-cdh4.4.0.jar!/hive-log4j.properties
Hive history file=/tmp/hadoop/hive_job_log_bf8c091b-94ff-4668-94bb-8d3c6d56c49f_329759612.txt
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hadoop-2.0.0-cdh4.4.0/share/hadoop/common/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hive-0.10.0-cdh4.4.0/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
FAILED: Error in metadata: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask


좀더 자세히 보기위해 hive로그를 보니 아래와 같은 에러가 발행했다.

/tmp/hadoop/hive.log

2015-01-08 06:06:18,537 ERROR metastore.RetryingRawStore
(RetryingRawStore.java:invoke(133)) - JDO datastore error. Retrying metastore command
after 1000 ms (attempt 1 of 1)
2015-01-08 06:06:19,610 ERROR exec.Task (SessionState.java:printError(427)) - FAILED:
Error in metadata: java.lang.RuntimeException: Unable to instantiate
org.apache.hadoop.hive.metastore.HiveMetaStoreClient
org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to
instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient

Caused by: javax.jdo.JDODataStoreException: Exception thrown flushing changes to datastore
NestedThrowables:
java.sql.BatchUpdateException: Duplicate entry 'default' for key 'UNIQUE_DATABASE'


에러내용으로 Google검색 결과, Hive버그 리스트에 등록 되어있는것을 알았다.

https://issues.apache.org/jira/browse/HIVE-6113 

http://mail-archives.apache.org/mod_mbox/hive-dev/201404.mbox/%3CJIRA.12686504.1388128020165.79687.1396968915264@arcas%3E


Hive metastore 정보를 여러군데서 동시에 요청할 경우에 발생한다는 거다. 아니, 발생할 수도 있다는 거다.

오늘의 에러는 이 발생할 수도 있는 경우에 해당된 것같다. 

일단 이 버그가 고쳐지기 전까지는 될 수 있는한 Hive metastore 가 동시에 요청되지 않도록 잡스케쥴을 조정해야겠다.


2015/02/13 추가

며칠동안은 괜찮은듯 보였으나 이번주 내내 동일한 에러가 발생

hive-site.xml의 설정을 바꿔보기로 함.

메타스토어에 자동으로 스키마생성을 하지 않고 고정 데이터스토어를 유지하겠다는 내용

며칠동안 상황을 지켜봐야겠다.

<property>

  <name>datanucleus.autoCreateSchema</name>
  <value>false</value>
  <description>creates necessary schema on a startup if one doesn't exist. set this to false, after creating it once</description>
</property>
<property>
  <name>datanucleus.fixedDatastore</name>
  <value>true</value>
</property> 


'Hive' 카테고리의 다른 글

Hive 변수 사용  (0) 2016.01.20
Hive migration (Export / Import)  (0) 2015.03.11
HiveQL Table not found 에러  (0) 2015.02.08
Hive Metastore 에러  (0) 2015.01.15
Posted by 유나아빠