Cannot find hadoop installation: $HADOOP_HOME or $HADOOP_PREFIX must be set
or hadoop must be in the path
Hive 는 Hadoop 을 선택 사항으로 두지 않는다. HiveQL 을 실행하지 않고 Metastore 만 띄우는 경우에도 Hadoop 의 공통 라이브러리와 파일시스템 구현이 필요하다. 기동 스크립트는 $HADOOP_HOME 또는 PATH 에서 hadoop 명령을 찾아 classpath 를 구성한다.
"Hive 를 로컬 모드로 돌리면 Hadoop 없이 쓸 수 있다"는 설명이 돌아다니는데 정확하지 않다. 로컬 모드는 YARN 대신 로컬 JVM 에서 작업을 실행한다는 뜻이지, Hadoop 라이브러리 자체가 없어도 된다는 뜻이 아니다. 최소한 Hadoop 바이너리 배포본은 풀어 두고 경로를 잡아야 한다.
Hadoop 을 설치했다면 환경 변수를 잡는다.
export HADOOP_HOME=/opt/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
hadoop version
which hadoop
서비스로 띄운다면 systemd 유닛의 Environment= 또는 EnvironmentFile= 에 같은 값을 넣는다. 로그인 셸에서만 설정하면 서비스에는 적용되지 않는다.
Hive 를 단독으로 쓰되 클러스터가 없는 시험 환경이라면, Hadoop 바이너리를 받아 풀고 로컬 파일시스템을 기본으로 설정한다.
<property>
<name>fs.defaultFS</name>
<value>file:///</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/opt/hive/warehouse</value>
</property>
schematool -dbType derby -initSchema
hive --service metastore
Derby 는 동시 접속 하나만 처리하므로 시험용으로만 쓴다.
hive --version
hadoop classpath | tr ':' '\n' | head
hadoop classpath 가 정상 출력되는데도 같은 오류가 난다면, Hive 를 실행한 사용자의 환경에 변수가 없는 경우다. sudo 로 실행하면 환경 변수가 초기화되므로 sudo -E 를 쓰거나 서비스 설정에 직접 넣는다.