Hive CLI

Hive CLI

$HIVE_HOME/bin/hive는 Hive 쿼리를 대화형(interactive) 또는 배치(batch) 모드로 실행할 수 있는 셸 유틸리티예요. 다만 최근 개발이 HiveServer2에 집중되면서 Hive CLI는 곧 Beeline을 위해 deprecated될 예정입니다.

출처: 문서

본문

Beeline CLI 대비 deprecation

HiveServer2(Hive 0.11에 도입)에는 Beeline이라는 자체 CLI가 있으며, 이는 SQLLine 기반의 JDBC 클라이언트입니다. HiveServer2에 개발이 집중되므로 Hive CLI는 곧 Beeline을 위해 deprecated될 예정이에요 (HIVE-10511). HiveServer2 문서에서 Replacing the Implementation of Hive CLI Using Beeline과 Beeline – New Command Line Shell을 참고하세요.

Hive 커맨드 라인 옵션 (Hive Command Line Options)

도움말을 보려면 hive -H 또는 hive --help를 실행하세요.

usage: hive
 -d,--define <key=value>          Variable substitution to apply to Hive
                                  commands. e.g. -d A=B or --define A=B
 -e <quoted-query-string>         SQL from command line
 -f <filename>                    SQL from files
 -H,--help                        Print help information
 -h <hostname>                    Connecting to Hive Server on remote host
    --hiveconf <property=value>   Use value for given property
    --hivevar <key=value>         Variable substitution to apply to hive
                                  commands. e.g. --hivevar A=B
 -i <filename>                    Initialization SQL file
 -p <port>                        Connecting to Hive Server on port number
 -S,--silent                      Silent mode in interactive shell
 -v,--verbose                     Verbose mode (echo executed SQL to the
                                  console)

Version information: Hive 0.10.0부터 커맨드 라인 옵션이 하나 더 추가됐습니다.

--database <dbname>      Specify the database to use

참고: -hiveconf 변형도 --hiveconf만큼 지원돼요.

예시 (Examples)

커맨드 라인에서 쿼리 실행:

$HIVE_HOME/bin/hive -e 'select a.col from tab1 a'

Hive 구성 변수 설정:

$HIVE_HOME/bin/hive -e 'select a.col from tab1 a' --hiveconf hive.exec.scratchdir=/home/my/hive_scratch  --hiveconf mapred.reduce.tasks=32

silent 모드로 쿼리 결과를 파일로 덤프:

$HIVE_HOME/bin/hive -S -e 'select a.col from tab1 a' > a.txt

로컬 디스크에서 스크립트 비대화형 실행:

$HIVE_HOME/bin/hive -f /home/my/hive-script.sql

Hadoop 지원 파일시스템에서 스크립트 비대화형 실행 (Hive 0.14부터):

$HIVE_HOME/bin/hive -f hdfs://<namenode>:<port>/hive-script.sql
$HIVE_HOME/bin/hive -f s3://mys3bucket/s3-script.sql 

대화형 모드 진입 전 초기화 스크립트 실행:

$HIVE_HOME/bin/hive -i /home/my/hive-init.sql

hiverc 파일 (The hiverc File)

-i 옵션 없이 호출된 CLI는 $HIVE_HOME/bin/.hiverc$HOME/.hiverc를 초기화 파일로 로드하려 시도해요.

로깅 (Logging)

Hive는 로깅에 log4j를 사용합니다. 이 로그는 기본적으로 표준 출력으로 나가지 않고, Hive의 log4j 속성 파일이 지정한 로그 파일로 캡처돼요. 기본적으로 Hive는 Hive 설치의 conf/ 디렉토리에 있는 hive-log4j.default를 사용하며, /tmp/<userid>/hive.log에 로그를 쓰고 WARN 레벨을 사용합니다.

디버깅을 위해 로그를 표준 출력으로 내보내거나 로깅 레벨을 바꾸고 싶을 때가 많아요. 이는 커맨드 라인에서 다음과 같이 할 수 있습니다.

$HIVE_HOME/bin/hive --hiveconf hive.root.logger=INFO,console

hive.root.logger는 로깅 레벨과 로그 목적지를 지정해요. 목적지를 console로 지정하면 로그가 (로그 파일 대신) 표준 오류로 보내집니다. 자세한 내용은 Getting Started의 Hive Logging을 참고하세요.

Dangling 스크래치 디렉토리 정리 도구 (Tool to Clear Dangling Scratch Directories)

Setting Up HiveServer2의 Scratch Directory Management에서 스크래치 디렉토리와 dangling 스크래치 디렉토리를 제거하는 커맨드 라인 도구에 대해 설명해요. Hive CLI와 HiveServer2 모두에서 사용할 수 있습니다.

Hive 배치 모드 명령 (Hive Batch Mode Commands)

$HIVE_HOME/bin/hive-e 또는 -f 옵션으로 실행되면 SQL 명령을 배치 모드로 실행합니다.

  • hive -e '<query-string>'은 쿼리 문자열을 실행해요.
  • hive -f <filepath>는 파일의 하나 이상의 SQL 쿼리를 실행합니다.

Version 0.14: Hive 0.14부터 <filepath>는 Hadoop 지원 파일시스템(HDFS, S3 등)의 것일 수도 있어요.

$HIVE_HOME/bin/hive -f hdfs://<namenode>:<port>/hive-script.sql
$HIVE_HOME/bin/hive -f s3://mys3bucket/s3-script.sql

자세한 내용은 HIVE-7136을 참고하세요.

Hive 인터랙티브 셸 명령 (Hive Interactive Shell Commands)

$HIVE_HOME/bin/hive-e-f 옵션 없이 실행되면 인터랙티브 셸 모드로 들어가요. 명령 종료에는 ;(세미콜론)을 사용하고, 스크립트의 주석은 - 접두사로 지정할 수 있습니다.

Command Description
quit, exit 인터랙티브 셸을 종료
reset 설정을 기본값으로 재설정 (Hive 0.10 기준: HIVE-3202)
set <key>=<value> 특정 구성 변수(key)의 값을 설정. 참고: 변수 이름을 잘못 입력해도 CLI는 에러를 표시하지 않아요
set 사용자나 Hive가 오버라이드한 구성 변수 목록 출력
set -v 모든 Hadoop과 Hive 구성 변수 출력
add FILE[S]/JAR[S]/ARCHIVE[S] <filepath>* 분산 캐시의 리소스 목록에 하나 이상의 파일, jar, 아카이브 추가. Hive Resources 참고
list FILE[S]/JAR[S]/ARCHIVE[S] 분산 캐시에 이미 추가된 리소스 출력
delete FILE[S]/JAR[S]/ARCHIVE[S] <filepath>* 분산 캐시에서 리소스 제거
! <command> Hive 셸에서 셸 명령 실행
dfs <dfs command> Hive 셸에서 dfs 명령 실행
<query string> Hive 쿼리를 실행하고 결과를 표준 출력으로 출력
source <filepath> CLI 안에서 스크립트 파일 실행

샘플 사용법:

  hive> set mapred.reduce.tasks=32;
  hive> set;
  hive> select a.* from tab1;
  hive> !ls;
  hive> dfs -ls;

Hive 리소스 (Hive Resources)

Hive는 쿼리 실행 시점에 필요한 리소스를 세션에 추가하는 것을 관리할 수 있어요. 리소스는 파일, jar, 아카이브가 될 수 있으며, 로컬에서 접근 가능한 어떤 파일이든 세션에 추가할 수 있습니다. 세션에 리소스가 추가되면 Hive 쿼리는 그 이름으로(map/reduce/transform 절에서) 참조할 수 있고, 실행 시점에 리소스는 전체 Hadoop 클러스터에서 로컬로 사용 가능해요. Hive는 Hadoop의 Distributed Cache를 사용해 추가된 리소스를 쿼리 실행 시점에 클러스터의 모든 머신으로 분배합니다.

   ADD { FILE[S] | JAR[S] | ARCHIVE[S] } <filepath1> [<filepath2>]*
   LIST { FILE[S] | JAR[S] | ARCHIVE[S] } [<filepath1> <filepath2> ..]
   DELETE { FILE[S] | JAR[S] | ARCHIVE[S] } [<filepath1> <filepath2> ..] 
  • FILE 리소스는 분산 캐시에 추가만 됩니다. 보통 실행할 transform 스크립트 같은 것입니다.
  • JAR 리소스는 Java 클래스패스에도 추가돼요. UDF 같은 객체를 참조하려면 필요합니다. (커스텀 UDF: Hive Plugins 참고)
  • ARCHIVE 리소스는 분배되는 일부로 자동으로 압축이 풀립니다.

예:

  hive> add FILE /tmp/tt.py;
  hive> list FILES;
  /tmp/tt.py
  hive> select from networks a 
               MAP a.networkid 
               USING 'python tt.py' as nn where a.ds = '2009-01-04' limit 10;

Version 1.2.0: Hive 1.2.0부터 ivy://group:module:version?query_string 형태의 Ivy URL로 리소스를 추가·삭제할 수 있어요.

  • group – 모듈이 속한 모듈 그룹. Maven groupId 또는 Ivy Organization으로 직접 변환됩니다.
  • module – 로드할 모듈의 이름. Maven artifactId 또는 Ivy artifact로 변환됩니다.
  • version – 사용할 모듈 버전. 어떤 버전이나 *(최신), 또는 Ivy Range를 쓸 수 있습니다.
  • query_string – 다양한 파라미터를 전달해 어떤 jar가 어떻게 아티팩토리에 추가되는지 구성할 수 있어요. 파라미터는 &로 구분된 키-값 쌍 형식입니다.
ADD { FILE[S] | JAR[S] | ARCHIVE[S] } <ivy://org:module:version?key=value&key=value&...> <ivy://org:module:version?key=value&key1=value1&...>*
DELETE { FILE[S] | JAR[S] | ARCHIVE[S] } <ivy://org:module:version> <ivy://org:module:version>*

또한 같은 ADD, DELETE 명령에서 <ivyurl><filepath>를 섞을 수 있습니다.

ADD { FILE[S] | JAR[S] | ARCHIVE[S] } { <ivyurl> | <filepath> } <ivyurl>* <filepath>* 
DELETE { FILE[S] | JAR[S] | ARCHIVE[S] } { <ivyurl> | <filepath> } <ivyurl>* <filepath>*

전달할 수 있는 서로 다른 파라미터는 다음과 같습니다.

  • excludeorg:module 형태의 쉼표 구분 값을 받습니다.
  • transitivetrue 또는 false. 기본값은 true. transitive=true면 모든 전이적(transitive) 의존성이 다운로드되어 클래스패스에 추가됩니다.
  • ext – 추가할 파일의 확장자. 기본값은 'jar'.
  • classifier – 해석할 maven classifier.

예:

hive>ADD JAR ivy://org.apache.pig:pig:0.10.0?exclude=org.apache.hadoop:avro;
hive>ADD JAR ivy://org.apache.pig:pig:0.10.0?exclude=org.apache.hadoop:avro&transitive=false;

DELETE 명령은 리소스와 모든 전이적 의존성을 삭제하며, 일부 의존성이 다른 리소스와 공유되는 경우는 예외입니다. 두 리소스가 어떤 전이적 의존성 집합을 공유하고, 그중 하나가 DELETE 구문으로 삭제되면, 공유된 것들을 제외한 모든 전이적 의존성이 삭제돼요.

예:

hive>ADD JAR ivy://org.apache.pig:pig:0.10.0
hive>ADD JAR ivy://org.apache.pig:pig:0.11.1.15
hive>DELETE JAR ivy://org.apache.pig:pig:0.10.0

A를 pig-0.10.0의 전이적 의존성 집합, B를 pig-0.11.1.15의 전이적 의존성 집합이라고 하면, 위 명령 실행 후 A - (A ∩ B)가 삭제됩니다. 자세한 내용은 HIVE-9664를 참고하세요.

transform 스크립트에 사용하는 파일이 이미 Hadoop 클러스터의 모든 머신에 같은 경로 이름으로 있다면 세션에 파일을 추가할 필요가 없어요. 예:

  • ... MAP a.networkid USING 'wc -l' ... – 여기서 wc는 모든 머신에서 사용 가능한 실행 파일.
  • ... MAP a.networkid USING '/home/nfsserv1/hadoopscripts/tt.py' ... – 여기서 tt.py는 모든 클러스터 노드에 동일하게 구성된 NFS 마운트 포인트로 접근 가능.

참고로 Hive 구성 파라미터도 jar, 파일, 아카이브를 지정할 수 있어요. (Configuration Variables 참고)

HCatalog CLI 버전

HCatalog는 Hive 0.11.0 릴리스부터 Hive와 함께 설치됩니다. 많은(전부는 아닌) hcat 명령을 hive 명령으로 실행할 수 있고 그 반대도 가능해요. 자세한 내용은 HCatalog 매뉴얼의 HCatalog Command Line Interface 문서를 참고하세요.

더 알아보기 (Learn more)

Hive CLI는 배치(-e/-f)와 인터랙티브 모드를 모두 지원해요. 다만 신규 개발은 Beeline(HiveServer2) 쪽으로 옮겨가고 있으니, 새 프로젝트에서는 Beeline 사용을 권장합니다.