Hive 실행
하이브 설정하기
하이브는 하둡과 같이 XML 설정 파일을 사용하여 환경 설정을 한다. 관련 파일은 hive-site.xml 이고 하이브의 conf 디렉터리에 위치한다. 이 파일은 사용자가 하이브를 실행할 때마다 필요한 속성을 설정할 수 있다. 같은 디렉터리에 하이브가 보유하고 있는 속성과 기본값을 기록한 hive-default.xml 파일도 있다.
사용자는 hive 명령어에 –config 옵션을 추가하여 하이브가 hive-site.xml 파일을 찾는 설정 디렉터리를 재정의할 수 있다.
hive --config /Users/tom/dev/hive-conf
이 옵션은 hive-site.xml 파일 자체가 아니라 그것을 포함하고 있는 디렉터리를 지정한다는 사실에 주의하라. 이러한 방식은 여러 개의 클러스터를 위한 각 사이트 파일을 규칙적으로 전환하려 할 때 유용하다. HIVE_CONF_DIR 환경변수에 설정 디렉터리를 지정해도 동일한 효과가 있다.
hive-site.xml 은 클러스터 연결을 위한 세부사항을 정의한 파일이다. 사용자는 일반적인 하둡 속성인 fs.defaultFS 와 yarn.resourcemanager.address에 파일시스템과 자원 관리자를 각각 지정할 수 있다. 별다른 설정을 하지 않으면 기본적으로 로컬 파일시스템과 로컬 프로세스 잡 실행자가 지정되는데, 이것은 작은 실습 데이터셋으로 하이브를 실행하기에 좋은 방법이다. 또한 메타스토어에 대한 환경 설정도 hive-site.xml에 있다.
만일 하둡 클러스터 하나를 여러 명의 사용자가 공유해야 한다면 모든 사용자가 파일을 쓸 수 있는 디렉터리를 만들어야 한다. 아래 일련의 명령은 디렉터리를 생성하고 적절한 권한을 부여하는 예제다.
hadoop fs -mkdir /tmp
hadoop fs -chmod a+w /tmp
hadoop fs -mkdir /user/hive/warehouse
hadoop fs -chmod a+w /user/hive/warehouse
hive 명령과 함께 -hiveconf 옵션을 사용하면 세션 기반의 속성을 설정할 수 있다. 예를 들어 다음 명령어는 세션이 지속되는 동안만 클러스터를 의사 분산 클러스터를 설정한다.
hive -hiveconf fs.defaultFS=hdfs://localhost \
-hiveconf mapreduce.framework.name=yarn \
-hiveconf yarn.resourcemanager.address=localhost:832
또한 사용자는 하나의 세션 내에서 SET 명령어를 사용하여 환경 설정을 변경할 수 있다. 특정 쿼리에 대해 하이브 설정을 변경하는 방식은 매우 유용하다. 예를 들어 다음 명령은 테이블 정의에 따라 버킷의 사용을 보장한다.
hive > SET hive.enforce.bucketing=true;
어떤 속성이든 현재 값을 보고 싶으면 SET 다음에 속성 이름을 입력하면 된다.
hive > SET hive.enforce.bucketing;
hive.enforce.bucketing=true
SET은 하이브에 설정된 모든 속성과 그 값을 출력할 것이다. 이 때 이 절에서 다룬 방식으로 기본 설정된 속성을 재정의하지 않았다면 기본 속성이 출력되지 않는다는 점을 기억하라. 하둡 기본 값을 포함한 시스템의 모든 속성을 출력하려면 SET -v를 사용하라.
속성을 설정할 때는 우선순위가 존재한다. 다음 목록에서 낮은 숫자가 높은 숫자보다 우선순위가 높다.
- 하이브 SET 명령어
- 명령행 -hiveconf 옵션
- hive-site.xml과 하둡 site 파일(core-site.xml, hdfs-site.xml, mapred-site.xml, yarn-site.xml)
- 하이브 기본 파일과 하둡 기본 파일(core-default.xml, hdfs-default.xml, mapred-default.xml, yarn-default.xml)
실행 엔진
하이브는 원래 실행 엔진으로 맵리듀스를 사용하도록 작성되었고, 여전히 기본 엔진은 맵리듀스다. 실행 엔진으로 아파치 테즈(Apache Tez)를 사용해서 하이브를 실행할 수 있으며, 스파크를 지원하는 작업도 현재 진행되고 있다. Tez와 Spark는 맵리듀스보다 더 높은 성능과 유연성을 제공하는 범용 방향성 비순환 그래프(directed acyclic graph | DAG) 엔진이다. 예를 들면 잡의 임시 출력을 HDFS에 저장하는 맵리듀스와 달리 테즈와 스파크는 임시 출력을 로컬 디스크에 기록하거나 하이브 플래너의 요청으로 메모리에 저장하는 방식으로 복제 오버헤드를 피할 수 있다. |
실행 엔진의 종류는 hive.execution.engine 속성으로 제어한다. 기본값은 mr(맵리듀스)이다. 실행 엔진은 쿼리 단위로 쉽게 전환할 수 있기 때문에 특정 쿼리로 다양한 엔진의 성능을 확인할 수 있다.
hive> SET hive.execution.engine=tez;
로깅
하이브의 에러 로그는 로컬 파일시스템의 ${java.io.tmpdir}/${user.name}/hive.log에서 찾을 수 있다. 이 로그는 환경 설정 문제나 다른 유형의 에러를 진단할 때 매우 유용하다. 또한 하둡의 맵리듀스 태스크 로그 역시 문제 해결을 위한 정보로 유용하다.
대부분의 시스템에서 ${java.io.tmpdir}는 /tmp로 되어 있다. 하지만 로깅 디렉터리를 다른 위치로 설정하고 싶다면 아래와 같은 방법을 사용한다.
hive -giveconf hive.log.dir='/tmp/${user.name}'
로깅 설정 파일은 conf/hive-log4j.properties고, 로그 수준과 다른 로깅 관련 설정을 변경하고 싶으면 이 파일을 변경하면 된다. 하지만 가끔은 세션 단위로 로깅을 설정하는 방법이 더 편할 수 있다. 다음과 같이 하이브를 실행하면 디버그 메시지를 콘솔로 보낼 수 있다.
hive -hiveconf hive.root.logger=DEBUG, console
하이브 서비스
하이브 쉘은 hive 명령어를 실행할 수 있는 여러 서비스 중 하나다. 사용자는 –service 옵션으로 실행할 서비스를 지정할 수 있다. 하이브가 제공하는 서비스 목록을 얻고 싶으면 hive –service help를 실행하면 된다.
- cli : 하이브 쉘에 대한 명령행 인터페이스며 기본 서비스다.
- 하이브서버2 : 다른 언어로 개발된 클라이언트와 연동할 수 있도록 하이브를 쓰리프트 서비스로 실행한다. 하이브서버2는 기존 하이브서버를 개선하여 인증과 다중 사용자 동시성을 지원한다. 쓰리프트, JDBC, ODBC 연결자를 사용하는 어플리케이션은 하이브와 통신하기 위해 먼저 하이브 서버를 실행해야 한다. 서버의 수신 포트(기본값은 10000)는 hive.server2.thrift.port 속성에 설정한다.
- hwi : 하이브 웹 인터페이스(Hive Web Interface)다. CLI의 대안으로 클라이언트 소프트웨어를 설치하지 않고 하이브를 접근할 수 있는 간단한 웹 인터페이스다. 또한 하이브 쿼리를 수행하고 하이브 메타스토어를 탐색하는 어플리케이션을 포함한 하둡의 웹 인터페이스인 Hue 참고
- beeline : 일반적인 CLI처럼 내장형 모드로 작동하거나 JDBC로 하이브서버2 프로세스에 접근할 수 있는 하이브의 명령행 인터페이스다.
- jar : hadoop jar와 상응하는 하이브 jar 방식이다. 클래스 경로에 하둡과 하이브 클래스 모두를 포함한 자바 어플리케이션을 실행할 때 편리하다.
- 메타스토어 : 기본적으로 메타스토어는 하이브 서비스와 동일한 프로세스에서 실행된다. 이 서비스는 메타스토어를 독립형 원격 프로세스로 실행한다. 환경변수인 METASTORE_PORT를 설정하거나 -p 명령행 옵션을 서버의 수신 포트를 지정할 수 있다.(기본값은 9083)
하이브 클라이언트
사용자가 hive –service hiveserver2 명령으로 하이브 서버를 실행한 후에는 다양한 방법으로 어플리케이션과 하이브를 연결할 수 있다.
- 쓰리프트 클라이언트 : 하이브 서버는 쓰리프트 서비스를 제공하므로 쓰리프트를 지원하는 프로그래밍 언어는 무엇이든 하이브 서버와 연결할 수 있다. 파이썬과 루비용 클라이언트를 제공하는 서드파티 프로젝트가 있다.
- JDBC 드라이버 : 하이브는 org.apache.hadoop.hive.jdbc.HiveDriver 클래스에 정의된 Type 4(순수 자바) JDBC 드라이버를 제공한다. JDBC URI를 jdbc:hive2://host:port/dbname 형식으로 설정하면 자바 어플리케이션은 지정된 호스트 및 포트에서 별도 프로세스로 실행되는 하이브 서버와 연결할 수 있다. 내부적으로 JDBC 드라이버는 자바 쓰리프트 바인딩으로 하이브 쓰리프트 클라이언트를 구현한 인터페이스를 호출한다. jdbc://hive2:// 형식의 URI를 사용하여 내장형 모드에서 JDBC를 통해 하이브와 연결하는 대안도 있다. 이 모드에서 하이브는 어플리케이션과 동일한 JVM에서 실행된다. 쓰리퓨ㅡ트 서비스나 하이브 쓰리프트를 클라이언트를 사용하지 않으므로 독립형 서버로 시작할 필요는 없다. Beeline CLI는 JDBC 드라이버로 하이브와 통신한다.
- ODBC 드라이버 : BI 소프트웨어처럼 ODBC 프로토콜을 지원하는 어플리케이션은 ODBC 드라이버로 하이브에 접속할 수 있다. 아파치 하이브 배포판은 ODBC 드라이버를 제공하지는 않지만, 무료로 사용할 수 있는 드라이버를 제공하는 몇몇 벤더가 있다. JDBC 드라이버와 마찬가지로 ODBC 드라이버는 하이브 서버와 통신할 때 쓰리프트를 사용한다.
메타스토어
메타스토어는 하이브 메타데이터의 핵심 저장소다. 메타스토어는 서비스와 데이터 보관 저장소로 나누니다. 기본적으로 메타데이터 서비스는 하이브 서비스와 동일한 JVM에서 실행되고 로컬 디스크에 저장되는 내장형 더비(Derby) 데이터베이스 인스턴스를 포함한다. 이를 내장형 메타스토어 설정이라고 한다.
내장형 메타스토어는 하이브를 처음 시작할 때 쉽게 사용할 수 있는 방식이다. 그러나 내장형 더비 데이터베이스 인스턴스는 한번에 디스크에 위치한 데이터베이스 파일 하나에만 접근할 수 있다. 이 것은 사용자가 동일한 메타스토어를 공유하는 그 순간에 단 하나의 하이브 세션만 사용할 수 있다는 의미다. 두 번째 세션을 시작하면 메타스토어와의 연결을 얻기 위한 시도는 실패하고 에러가 발생한다.
다중 세션, 즉 다중 사용자를 지원하는 방법은 독립형 데이터베이스를 사용하는 것이다. 이렇나 설정 방식을 로컬 메타스토어라고 한다. 메타스토어 서비스는 하이브 서비스와 동일한 프로세스에서 실행되지만 동일 머신이나 원격 머신에서 별도의 프로세스로 실행되는 데이터베이스와 연결할 수 있다. JDBC와 호환되는 모든 데이터베이스는 javax.jdo.option.* 속성을 설정하는 방식으로 사용할 수 있다.
조금 더 깊게 들어가 보면 원격 메타스토어라 불리는 다른 메타소트어 설정이 있는데, 하나 이상의 메타스토어 서버가 하이브 서비스와는 별도의 프로세스로 실행된다. 원격 메타스토어를 설정해두면 데이터베이스 계층이 방화벽의 역할을 대신하고, 따라서 클라이언트는 데이터베이스 자격 증명을 더 이상 얻을 필요가 없기 때문에 관리성과 보안성이 더 높아진다.
하이브 서비스는 hive.metastore.uris를 메타스토어 서버 URI로 설정하여 원격 메타스오터를 사용하도록 설정한다. 이 때 다수의 메타스토어 서버를 설정하려면 콤마로 구분하면 된다. 메타스토어 서버 URI는 thrift://host:port 형식으로 지정한다. 영기서 포트는 메타스토어 서버를 구동할 때 METASTORE_PORT에 설정된 포트 중 하나를 지정하면 된다.
속성명 | 형식 | 기본값 | 설명 |
---|---|---|---|
hive.metastore.warehouse.dir | URI | /user/hive/warehouse | 관리 테이블이 저장되는 fs.defaultFS의 디렉터리 |
hive.metastore.uris | 콤마로 구분된 URI | 정해진 값 없음 | 설정하지 않으면(기본) 인-프로세스 메타스토어를 사용한다. 설정하면 URI 목록에 지정한 하나 또는 그 이상의 원격 메타스토어에 연결한다. 여러 원격 서버가 있으면 클라이언트는 순차 순환 방식으로 연결한다. |
javax.jdo.option.ConnectionURL | URI | jdbc:derby:;databaseName=metastore_db;create=true | 메타스토어 데이터베이스의 JDBC URL |
javax.jdo.option.ConnectionDriverName | String | org.apache.derby.jdbc.EmbeddedDriver | JDBC 드라이버 클래스명 |
javax.jdo.option.ConnectionUserName | String | APP | JDBC 사용자명 |
javax.jdo.option.ConnectionPassword | String | mine | JDBC 암호 |