Derby를 서버 모드로 사용하기
Derby를 서버 모드로 사용하기 (Using Derby in Server Mode)
Hive는 임베디드(embedded) 모드에서 한 번에 한 명의 활성 사용자만 사용할 수 있는 제약이 있어요. Derby를 네트워크 서버(Network Server)로 실행하면 여러 사용자가 서로 다른 시스템에서 동시에 접근할 수 있답니다. 이 글에서는 Derby 네트워크 서버를 내려받고 Hive를 그 서버에 연결하는 과정을 다룹니다.
출처: 문서
본문
Derby 다운로드 (Download Derby)
Hive에 포함된 버전의 Derby를 내려받는 것을 권장해요. 이미 Hive를 임베디드 모드로 실행했다면 derby.log의 첫 줄에 버전이 있어요.
디렉토리 구조는 이런 식이에요:
/opt/hadoop/hadoop-0.17.2.1
/opt/hadoop/db-derby-10.4.1.3-bin
/opt/hadoop/hive
cd /opt/hadoop
<download>
tar -xzf db-derby-10.4.1.3-bin.tar.gz
mkdir db-derby-10.4.1.3-bin/data
환경 설정 (Set Environment)
설정할 변수는 시간이 지나며 바뀌었어요. 이제 정식 이름은 DERBY_HOME이에요. 이 값과 예전 이름을 함께 설정해요.
/etc/profile.d/derby.sh
DERBY_INSTALL=/opt/hadoop/db-derby-10.4.1.3-bin
DERBY_HOME=/opt/hadoop/db-derby-10.4.1.3-bin
export DERBY_INSTALL
export DERBY_HOME
Hive는 Hadoop이 어디에 설치되어 있는지도 알아야 해요:
/etc/profile.d/hive.sh
HADOOP=/opt/hadoop/hadoop-0.17.2.1/bin/hadoop
export HADOOP
Derby 시작하기 (Starting Derby)
아마 Hadoop이 시작될 때 Derby도 함께 실행되길 원할 거예요. lsb-init-script 대신 start-dfs 같은 Hadoop 스크립트 옆에 두는 것도 좋은 위치예요. 기본적으로 Derby는 시작된 디렉토리에 데이터베이스를 생성해요.
cd /opt/hadoop/db-derby-10.4.1.3-bin/data
# JDK 1.7u51+를 사용한다면 일시적 포트(보통 49152~65535 사이)를 지정하거나
# JDK 버전의 java.policy 파일에 grant를 추가해야 합니다.
# 자세한 내용: http://stackoverflow.com/questions/21154400/unable-to-start-derby-database-from-netbeans-7-4
nohup /opt/hadoop/db-derby-10.4.1.3-bin/startNetworkServer -h 0.0.0.0 &
네트워크 Derby를 사용하도록 Hive 구성
/opt/hadoop/hive/conf/hive-site.xml을 다음과 같이 편집해요. "hadoop1"은 Derby 네트워크 서버가 있는 호스트 이름 또는 IP 주소로 바꿔야 해요.
/opt/hadoop/hive/conf/hive-site.xml
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby://hadoop1:1527/metastore_db;create=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.apache.derby.jdbc.ClientDriver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
/opt/hadoop/hive/conf/jpox.properties
버전 (Version): JPOX 속성은 Hive 5.0 이상에서 사용되지 않아요.
JPOX 속성은 hive-site.xml에 지정할 수 있어요. 보통 jpox.properties 변경은 필요하지 않아요.
javax.jdo.PersistenceManagerFactoryClass=org.jpox.PersistenceManagerFactoryImpl
org.jpox.autoCreateSchema=false
org.jpox.validateTables=false
org.jpox.validateColumns=false
org.jpox.validateConstraints=false
org.jpox.storeManagerType=rdbms
org.jpox.autoCreateSchema=true
org.jpox.autoStartMechanismMode=checked
org.jpox.transactionIsolation=read_committed
javax.jdo.option.DetachAllOnCommit=true
javax.jdo.option.NontransactionalRead=true
javax.jdo.option.ConnectionDriverName=org.apache.derby.jdbc.ClientDriver
javax.jdo.option.ConnectionURL=jdbc:derby://hadoop1:1527/metastore_db;create=true
javax.jdo.option.ConnectionUserName=APP
javax.jdo.option.ConnectionPassword=mine
Derby Jar 파일 복사하기 (Copy Derby Jar Files)
새 클라이언트가 생겼으므로 Hive의 lib 디렉토리 또는 클래스패스에 이 jar 파일들이 있는지 반드시 확인해야 해요. MySQL이나 다른 DB를 사용해도 마찬가지예요.
cp /opt/hadoop/db-derby-10.4.1.3-bin/lib/derbyclient.jar /opt/hadoop/hive/lib
cp /opt/hadoop/db-derby-10.4.1.3-bin/lib/derbytools.jar /opt/hadoop/hive/lib
"javax.jdo.JDOFatalInternalException: Error creating transactional connection factory" 오류가 발생하고 스택 트레이스가 "org.datanucleus.exceptions.ClassNotResolvedException: Class 'org.apache.derby.jdbc.ClientDriver' was not found in the CLASSPATH. Please check your specification and your CLASSPATH"에서 시작된다면, Derby jar 파일을 Hadoop lib 디렉토리에 직접 넣는 것이 도움이 될 수 있어요:
cp /opt/hadoop/db-derby-10.4.1.3-bin/lib/derbyclient.jar /opt/hadoop/hadoop-0.17.2.1/lib
cp /opt/hadoop/db-derby-10.4.1.3-bin/lib/derbytools.jar /opt/hadoop/hadoop-0.17.2.1/lib
Hive 시작하기 (Start Up Hive)
첫 번째 쿼리가 metastore에 도달할 때까지 metastore는 생성되지 않아요.
cd /opt/hadoop/hive
bin/hive
hive> show tables;
/opt/hadoop/db-derby-10.4.1.3-bin/data/metastore_db 디렉토리가 생성되어야 해요.
결과 (The Result)
이제 여러 Hive 인스턴스를 동시에 그리고 원격으로 같은 데이터에 대해 실행할 수 있어요.
더 알아보기 (Learn more)
- Metadata Store 및 Embedded Metastore에서 Hive metastore 구성에 대해 더 자세히 알 수 있어요.
- Derby 공식 문서에서 네트워크 서버 옵션을 확인할 수 있어요.