Spark Thrift Server Configuration
Spark Thrift Server 가 Apache Ambari 로 설치하였다고 가정합니다.
Spark Thrift Server 설정
Spark CONFIGS 로 이동하여 아래와 같이 설정을 합니다.
# Advanced spark2-hive-site-override spark.thrift.server.port: 10015 (Default) hive.server2.transport.mode: binary (Default) # Custom spark2-hive-site-override spark.thrift.server.client.protocol: binary # Custom spark2-thrift-sparkconf, (in Secure Hadoop) spark.thrift.authentication: KERBEROS spark.thrift.server.keytab: /etc/security/keytabs/spark.keytab spark.thrift.server.principal: spark/_HOST@<REALM> spark.thrift.server.transport.mode: binary (Default)
접속 주소 구성
접속 주소는 다음과 같습니다.
jdbc:hive2://<호스트명 또는 IP>:<포트>/
i.e. jdbc:hive2://spark-thrift-host:10015
Client 를 통한 접속
사용자 인증이 어떻게 구성한 것에 따라서 Kerberos, LDAP, NONE 으로 설정합니다.
Kerberos
kinit <user>
beeline -u "jdbc:hive2://spark-thrift-host:10015/default;pri.."
LDAP
- beeline -u "jdbc:hive2://spark-thrift-host:10015" -n -p
NONE
- beeline -u "jdbc:hive2://spark-thrift-host:10015" -n -p
Beeline 사용
- beeline -u "jdbc:hive2://spark-thrift-host:10015" -n 사용자이름 -p 비밀번호
JDBC Client 사용
JDBC Driver 가 필요하며, 일반적으로 Hive JDBC Driver 를 사용
Client 에서 접속 URL, 사용자 이름, 비밀번호를 입력하여 접속
문제 해결
beeline 을 실행할때, 오류 메시지가
Hive JDBC Driver 가 없을 경우
Hive JDBC Driver 를 설치합니다.
Ubuntu, Debian
sudo apt-get install hive-jdbc
Redhat, CentOS
sudo yum install hive-jdbc
Hive JDBC Driver 가 이미 있는 경우에는 Driver 를 명시적으로 지정합니다.
beeline --hiveconf hive.jdbc.driver.path=/usr/lib/hive/lib/hive-jdbc-standalone.jar -u "jdbc:hive2://spark-thrift-host:10015" -n -p
beeline 명령어의 Classpath 설정을 합니다.
Hive JDBC Driver 의 경로를 beeline 의 실행 환경에 설정합니다.
export CLASSPATH=$CLASSPATH:/usr/lib/hive/lib/hive-jdbc-standalone.jar
beeline 을 실행할 때, 아래와 같은 오류 메시지가 나오면서 접속이 안될때
Error: Could not open client transport with JDBC Uri: jdbc:hive2://spark-thrift-host:10015/default;principal=spark/spark-thrift-host@EXAMPLE.COM: Required field 'client_protocol' is unset! Struct:TOpenSessionReq(client_protocol:null, configuration:{...})
원인
Client (Beeline)와 Spark Thrift Server 간의 Protocol version 불일치 또는 호환성 문제로 인해 발생할 수 있습니다.
특히,
client_protocol
필드가 설정되지 않았다는 메시지는 Client 가 서버와 통신할 때 필요한 Protocol 정보를 제공하지 않았음을 나타냅니다.
해결 방안
Spark 2.x 는 Hive 1.2.1 과 호환되는 HiveServer2 Protocol 을 사용
Spark 3.x 는 Hive 2.3.x 와 호환됩니다.
Spark 과 같이 bundle 된 beeline 을 사용합니다.
$SPARK_HOME/bin/beeline -u "jdbc:hive2://spark-thrift-host:10015/default;principal=spark/spark-thrift-host@EXAMPLE.COM
Spark Thrift Server Connection
Beeline 을 사용하여 접속
Spark 에 동봉된 beeline 을 사용
Spark 2.x 는 Hive 1.2.1 과 호환되는 HiveServer2 프로토콜을 사용
접속하기 전에 정해진 인증 방법을 통해서 인증을 진행합니다.
- Kerberos, LDAP, NONE
./beeline -u "jdbc:hive2://spark-thrift-host:10015/default;principal=spark/spark-thrift-host@EXAMPLE.COM"
jdbc:hive2://spark-thrift-host:10015 뒤에 오는 것은 hive DB 를 의미합니다. (default)
필요시 Hive JDBC path 를 명시적으로 주어서 접속을 해야 할수도 있습니다.
./beeline --hiveconf ./hive-jdbc-standalone.jar -u "jdbc:hive2://spark-thrift-host:10015/default;principal=spark/spark-thrift-host@EXAMPLE.COM"
JDBC Client 사용
Hive JDBC Driver 필요 (i.e. hive-jdbc-<version>-standalone.jar)
드라이버는 Hadoop Package 의 Hive 또는 Spark Package 에 포함되어 있으며, 직접 다운로드 하거나 설치할 수 있습니다.
$SPARK_HOME/jars/hive-jdbc-<version>-standalone.jar 에 위치
Java Program 을 작성하시거나, DBeaver, IntelliJ Plugin 등 다양한 방법을 사용하실 수 있습니다.
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class HiveJDBCClient { private static String driverName = "org.apache.hive.jdbc.HiveDriver"; public static void main(String[] args) throws Exception { // Hive JDBC URL (Kerberos 인증) String jdbcURL = "jdbc:hive2://spark-thrift-host/default;principal=spark/spark-thrift-host@EXAMPLE.COM"; // JDBC 드라이버 로드 Class.forName(driverName); // 연결 생성 Connection conn = DriverManager.getConnection(jdbcURL); Statement stmt = conn.createStatement(); // Query 실행 예시 String sql = "SELECT * FROM your_table LIMIT 10"; ResultSet res = stmt.executeQuery(sql); // 결과 출력 while (res.next()) { System.out.println(res.getString(1) + "\t" + res.getString(2)); } // 연결 종료 res.close(); stmt.close(); conn.close(); } }
DBeaver 사용시 설정 방법
DBeaver 에서 새로운 연결을 만들고, 드라이버를 추가합니다.
Hive JDBC Driver JAR 파일을 DBeaver 에 등록합니다.
JDBC URL 입력: jdbc:hive2://<호스트명>:<포트>/default;principal=<Kerberos Principal>
Kerberos 인증을 사용하는 경우 principal parameter 를 입력하고, 별도의 사용자 이름 및 비밀번호를 입력할 필요는 없습니다.
문제 발생시
JDBC Driver 가 없거나 잘못된 경우
JDBC URL 형식이 잘못되었거나, JDBC Driver 가 누락되면 No suitable driver found 오류가 발생할 수 있습니다.
이 경우 Hive JDBC Driver 가 올바르게 Load 되었는지, JDBC URL 이 정확한지 확인합니다.
인증 오류
- Kerberos 인증을 사용 중인데 인증 관련 오류가 발생하면, kinit 으로 Kerberos Ticket 을 다시 획득합니다.
네트워크 문제
- Host 및 Port 가 올바른지, Network 나 방화벽 설정으로 인해 Thrift Server 에 접근이 차단되고 있지 않은지 확인합니다.
ODBC Client 사용
JDBC 와 유사하지만, ODBC Driver 를 사용해 SQL Query 를 실행합니다.
ODBC 는 주로 Windows 환경에서 널리 사용하지만, Mac 과 Linux 에서도 사용가능.
Hive ODBC Driver 를 설치해야 합니다.
Cloudera 에서 주로 download 합니다.
각자의 OS 맞게 적절히 설치를 진행합니다.
Windows 데이터 소스 설정
DSN 이름을 입력합니다.
Host: Spark Thrift Server가 실행 중인 호스트의 IP 또는 Domain 이름
Port: Spark Thrift Server의 포트 번호(기본값은 10015)
Database: 사용할 Database (기본값은 default)
Authentication Mechanism: 인증 메커니즘을 설정합니다
- Kerberos, LDAP, None 등
Kerberos 사용 시: Kerberos Principal 을 설정합니다.
예제
Host: spark-thrift-host
Port: 10015
Database: default
Authentication Mechanism: Kerberos
Kerberos Principal: spark/spark-thrift-host@EXAMPLE.COM
MacOS/Linux 데이터 소스 설정
~/.odbc.ini 파일 또는 /etc/odbc.ini 파일을 수정
예제
[SparkThriftServer] Driver=/usr/local/lib/hiveodbc/lib/universal/libclouderahiveodbc.dylib Host=spark-thrift-host Port=10015 Database=default AuthMech=1 KrbHostFQDN=spark-thrift-host KrbServiceName=spark KrbRealm=EXAMPLE.COM
odbcinst.ini 파일 확인
ODBC 드라이버가 제대로 설치되었는지 확인하기 위해 odbcinst.ini 파일을 확인
[ODBC Drivers] Cloudera Hive ODBC Driver=Installed [Cloudera Hive ODBC Driver] Description=Cloudera ODBC Driver for Apache Hive Driver=/opt/cloudera/hiveodbc/lib/universal/libclouderahiveodbc.dylib
ODBC Client 에서 연결
연결에 앞서 Kerberos 인증을 먼저 수행하도록 합니다.
Windows 에서 연결
Excel 에서 ODBC 연결
Tableau 에서 ODBC 연결
Linux/Mac에서 isql 사용
Linux/Mac 에서
isql
을 설치하여 ODBC 연결을 테스트할 수 있습니다.ODBC 연결 테스트
설정한 DSN 으로 Spark Thrift Server 에 연결합니다
isql SparkThriftServer