Spark Thrift Server Configuration & Connection

Spark Thrift Server Configuration & Connection

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)
    

접속 주소 구성

Client 를 통한 접속

문제 해결

  • 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/

  • 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