SET 으로 바꾼 값은 그 세션에만 적용되고 다른 세션에는 영향을 주지 않는다. 서버를 재시작할 필요가 없어 시험에 쓰기 좋다.
SET hive.execution.engine=tez;
SET mapreduce.job.queuename=default;
SET hive.auto.convert.join=true;
SET hive.execution.engine;
SET;
값만 적고 실행하면 현재 값을 보여 준다. 접속할 때 미리 지정하려면 --hiveconf 를 쓴다.
beeline -u "jdbc:hive2://hiveserver01:10000/default" \
--hiveconf hive.execution.engine=tez \
--hiveconf hive.auto.convert.join=true
JDBC URL 뒤에 ? 로 붙여도 된다.
jdbc:hive2://hiveserver01:10000/default?hive.execution.engine=tez
서버가 변경을 금지한 설정은 세션에서 바꿀 수 없다. hive.security.authorization.sqlstd.confwhitelist 로 허용 목록이 관리되므로, 운영 클러스터에서 특정 설정이 먹지 않으면 이 목록을 확인한다.
MapReduce 나 스트리밍 적재의 결과로 작은 파일이 수없이 쌓이면 NameNode 메타데이터가 늘고 쿼리 성능이 떨어진다. ORC · RCFile 테이블은 파일을 합칠 수 있다.
ALTER TABLE sales_data CONCATENATE;
ALTER TABLE sales_data PARTITION (year=2024, month=9) CONCATENATE;
ORC 와 RCFile 에만 동작한다. Parquet 이나 TEXTFILE 테이블에는 쓸 수 없고, 그 경우 INSERT OVERWRITE 로 다시 써서 합친다.
INSERT OVERWRITE TABLE sales_data PARTITION (year=2024, month=9)
SELECT ... FROM sales_data WHERE year=2024 AND month=9;
SET hive.merge.mapfiles=true;
SET hive.merge.mapredfiles=true;
SET hive.merge.tezfiles=true;
SET hive.merge.size.per.task=268435456;
SET hive.merge.smallfiles.avgsize=134217728;
출력 평균 파일 크기가 smallfiles.avgsize 보다 작으면 병합 단계를 추가로 돌려 size.per.task 에 가깝게 맞춘다. 적재 잡에 기본으로 넣어 두면 사후 정리 작업이 줄어든다.
모니터링을 붙이려면 JVM 옵션으로 JMX 를 연다.
export HIVE_SERVER2_OPTS="$HIVE_SERVER2_OPTS \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=10002 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false"
인증과 TLS 를 끈 형태는 폐쇄망 시험용이다. 운영에서는 인증을 켜거나, JMX 포트를 외부에 노출하지 않고 로컬 exporter 만 붙인다. HiveServer2 자체 메트릭은 hive.server2.metrics.enabled 를 켜고 JSON 파일이나 JMX 로 내보내는 방식도 있다.
pip install "pyhive[hive]" thrift
from pyhive import hive
conn = hive.Connection(host='hiveserver01', port=10000,
username='hadoop', database='default')
cur = conn.cursor()
cur.execute("SET hive.execution.engine=tez")
cur.execute("SELECT COUNT(*) FROM mytable")
print(cur.fetchone())
cur.close()
conn.close()
같은 커넥션에서 실행하는 동안에는 SET 값이 유지된다. 커넥션을 새로 만들면 초기화되므로, 커넥션 풀을 쓰는 애플리케이션에서는 매번 필요한 설정을 다시 적용해야 한다.