HDP3 Hive Warehouse connector를 사용하여 Spark에서 Hive 테이블에 액세스

HDP3 환경에서 Spark에서 Hive 테이블에 액세스하는 방법을 소개합니다.

HDP 이전 버전은 Spark HiveContext/SparkSession을 사용하여 Hive 테이블에 액세스하고 있지만 HDP3는 Hortonworks에서 개발 한 Hive Warehouse Connector (HWC)를 사용하여 액세스 할 수 있습니다.
아래 그림과 같이 HDP3에서 Spark와 Hive 각각 Metadata를 가지고 있습니다. 서로에 대한 액세스는 HWC를 통해 이루어집니다.


Hive Warehouse Connector



Hive LLAP을 사용하여 Spark의 DataFrame을 Hive 테이블에 Write, Hive 테이블 데이터를 DataFrame에 Read하기 위한 라이브러리로 되어 있습니다.
Hive LLAP을 활성화해야 합니다.

HWC는 다음 애플리케이션을 지원합니다.
  • Spark-shell
  • Pyspark
  • Spark-submit

  • 사용법은 여기를 참조하십시오.
    HiveWarehouseSession API operations
    htps : // / cs. c우우라. 이 m / HDP Dokumen ts / HDP 3 / HDP - 3.0.1 / Inte g Rachin G-Hi / / Hinten t / Hi-He_Hi-He, 페라치온 s. HTML

    HWC 사용을 위한 설정



    설정 순서는 아래의 링크에 상세하게 써 있습니다.
    htps : // / cs. c우우라. 코 m/HDP 도쿠멘 ts/HDP3/HDP-3. 이런 c 치온. HTML

    기본적으로 Ambari에서 Custom spark-2-defaults에 다음 속성을 설정합니다.


    Property
    Description
    Comments


    spark.sql.hive.hiveserver2.jdbc.url
    URL for HiveServer2 Interactive
    In Ambari, copy the value from Services > Hive > Summary > HIVESERVER2 INTERACTIVE JDBC URL.

    spark.datasource.hive.warehouse.metastoreUri
    URI for metastore
    Copy the value from hive.metastore.uris. For example, thrift://mycluster-1.com:9083.

    spark.datasource.hive.warehouse.load.staging.dir
    HDFS temp directory for batch writes to Hive
    For example,/tmp.

    spark.hadoop.hive.llap.daemon.service.hosts
    Application name for LLAP service
    Copy value from Advanced hive-interactive-site > hive.llap.daemon.service.hosts.

    spark.hadoop.hive.zookeeper.quorum
    Zookeeper hosts used by LLAP
    Copy value from Advanced hive-sitehive.zookeeper.quorum.


    실제 설정 화면입니다.


    그래서주의해야 할 것은 spark.sql.hive.hiveserver2.jdbc.url입니다.
    절차에 따라 Ambari에서 HIVESERVER2 INTERACTIVE JDBC URL을 복사해야 하지만 런타임에 Permission Error 오류가 표시될 수 있습니다.
    예를 들어 Pyspark의 경우
    pyspark --jars /usr/hdp/current/hive_warehouse_connector/hive-warehouse-connector-assembly-1.0.0.3.1.0.0-78.jar --py-files /usr/hdp/current/hive_warehouse_connector/pyspark_hwc-1.0.0.3.1.0.0-78.zip
    
    
    Error
    py4j.protocol.Py4JJavaError: An error occurred while calling o72.executeQuery.
    : java.lang.RuntimeException: java.io.IOException: shadehive.org.apache.hive.service.cli.HiveSQLException: java.io.IOException: org.apache.hadoop.hive.ql.metadata.HiveException: Failed to compile query: org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAccessControlException: Permission denied: user [anonymous] does not have [USE] privilege on [default]
        at com.hortonworks.spark.sql.hive.llap.HiveWarehouseDataSourceReader.readSchema(HiveWarehouseDataSourceReader.java:130)
        at org.apache.spark.sql.execution.datasources.v2.DataSourceV2Relation$.apply(DataSourceV2Relation.scala:56)
    



    두 가지 해결책이 있습니다.
    1, HIVESERVER2 INTERACTIVE JDBC URL 뒤에 사용자를 지정합니다. 예를 들어 user=hive
    jdbc:hive2://hdp-srv2.demotest.com:2181,hdp-srv1.demotest.com:2181,hdp-srv4.demotest.com:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2-interactive;user=hive
    

    2, 코드 안에 HiveWarehouseSession 작성시에 사용자를 지정한다. 예: .userPassword('hive','hive')
    소스 코드에서 힌트를 얻었습니다.
    htps : // 기주 b. 이 m/호 r톤을 rks/히ぇぇㅇㅇㅇㅇㅇ sql/세시온. py
    from pyspark_llap import HiveWarehouseSession
    hive = HiveWarehouseSession.session(spark).userPassword('hive','hive').build()
    hive.setDatabase("default")
    hive.executeQuery("select * from test_table").show()
    hive.showTables().show()
    hive.showDatabases().show()
    

    Zeppelin Spark Interpreter에서 연결할 때 설정



    Zeppelin에서 Hive에 액세스하는 경우에도 Zeppelin 측에서 설정이 필요합니다.
    상세 설정은 이쪽
    htps : // / cs. c우우라. 코 m / HDP Dokumen ts / HDP 3 / HDP - 3.0.1 / Inte g Rachin G-Hi / / Hinten t / Hi-He_Zeppeen_Konfu-Gurachion_Hiゔぇ 받는 호세 콘에 c와 r. HTML

    설정 예


    그러나 실제로 코드를 실행하면 다음과 같이 pyspark_llap 모듈을 찾을 수 없습니다 라는 오류가 출력됩니다.


    조사한 바, Zeppelin 측에서 spark.submit.pyfiles의 설정이 잘 동작하지 않는 버그가 있는 것 같다.
    해결 방법으로 코트에 직접 모듈 파일을 가져옵니다.



    이제 spark-shell, pyspark, zeppelin에서 사용할 수 있습니다.

    좋은 웹페이지 즐겨찾기