【问题标题】:How to load Impala table directly to Spark using JDBC?如何使用 JDBC 将 Impala 表直接加载到 Spark?
【发布时间】:2017-01-16 22:15:23
【问题描述】:

我正在尝试使用 Python 编写一个 spark 作业,该作业将打开与 Impala 的 jdbc 连接并将 VIEW 直接从 Impala 加载到 Dataframe 中。这个问题非常接近,但在 scala 中:Calling JDBC to impala/hive from within a spark job and creating a table

我该怎么做?有很多其他数据源的示例,例如 MySQL、PostgreSQL 等,但我还没有看到 Impala + Python + Kerberos 的示例。一个例子会有很大帮助。谢谢!

用网络上的信息试过了,但没有用。

SPARK 笔记本

#!/bin/bash
export PYSPARK_PYTHON=/home/anave/anaconda2/bin/python
export HADOOP_CONF_DIR=/etc/hive/conf
export PYSPARK_DRIVER_PYTHON=/home/anave/anaconda2/bin/ipython
export PYSPARK_DRIVER_PYTHON_OPTS='notebook --ip=* --no-browser'

# use Java8
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH

# JDBC Drivers for Impala
export CLASSPATH=/home/anave/impala_jdbc_2.5.30.1049/Cloudera_ImpalaJDBC41_2.5.30/*.jar:$CLASSPATH
export JDBC_PATH=/home/anave/impala_jdbc_2.5.30.1049/Cloudera_ImpalaJDBC41_2.5.30

# --jars $SRCDIR/spark-csv-assembly-1.4.0-SNAPSHOT.jar \
# --conf spark.sql.parquet.binaryAsString=true \
# --conf spark.sql.hive.convertMetastoreParquet=false

pyspark --master yarn-client \
        --driver-memory 4G \
        --executor-memory 2G \
        # --num-executors 10 \
        --jars /home/anave/spark-csv_2.11-1.4.0.jar $JDBC_PATH/*.jar
        --driver-class-path $JDBC_PATH/*.jar

Python 代码

properties = {
    "driver": "com.cloudera.impala.jdbc41.Driver",
    "AuthMech": "1",
#     "KrbRealm": "EXAMPLE.COM",
#     "KrbHostFQDN": "impala.example.com",
    "KrbServiceName": "impala"
}

# imp_env is the hostname of the db, works with other impala queries ran inside python
url = "jdbc:impala:imp_env;auth=noSasl"

db_df = sqlContext.read.jdbc(url=url, table='summary', properties=properties)

我收到此错误消息 (Full Error Log):
Py4JJavaError:调用 o42.jdbc 时出错。 : java.lang.ClassNotFoundException: com.cloudera.impala.jdbc41.Driver

【问题讨论】:

  • 好的,对于初学者--jarsshould be comma separated list。对于 Java 8,您可能应该寻找 JDBC 4.2。我这里可能还缺少其他东西。
  • @alfredox:请。检查我的答案,让我知道它是否有效。
  • @RamPrasadG:我刚刚发现我的公司没有这些驱动程序可用,而且他们实际上没有配置内部环境甚至可以通过 jdbc 进行访问,所以很遗憾我不能测试它了。事实证明,他们确实通过简单地执行 df = sqlContext.sql(query) 将 Spark 配置为直接从 Impala 读取

标签: jdbc apache-spark pyspark kerberos impala


【解决方案1】:

你可以使用

--jars $(echo /dir/of/jars/*.jar | tr ' ' ',') 

而不是

--jars /home/anave/spark-csv_2.11-1.4.0.jar $JDBC_PATH/*.jar

或者其他方法请看我的answer

【讨论】:

    【解决方案2】:

    第一种方法是在下面的 impala_jdbc_connection.py 脚本上使用 spark-submit,例如 spark-submit --driver-class-path /opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/jars/ImpalaJDBC41.jar --jars /opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/jars/ImpalaJDBC41.jar --class com.cloudera.impala.jdbc41.Driver impala_jdbc_connection.py

    impala_jdbc_connection.py

    properties = {
    "drivers": "com.cloudera.impala.jdbc41.Driver"
    }
    
    #initalize the spark session
    spark = (
            SparkSession.builder
            .config("spark.jars.packages", "jar-packages-list")
            .config("spark.sql.warehouse.dir","hdfs://dwh-hdp-node01.dev.ergo.liferunoffinsuranceplatform.com:8020/user/hive/warehouse")
            .enableHiveSupport()
            .getOrCreate() 
            )
    
    db_df = spark.read.jdbc(url= 'jdbc:impala://host_ip_address:21050/database_name', table ='table_name', properties = properties)
    
    db_df.show()
    

    第二种方法不是从 impala 直接导入到 spark 而是将结果转换为 spark 数据帧

    pip install impyla来源:https://github.com/cloudera/impyla

    连接到 impala 并从 impala 数据库中获取结果并将结果转换为 spark 数据帧

    from impala.dbapi import connect
    
    conn = connect(host = 'IP_ADDRESS_OF_HOST', port=21050)
    
    cursor = conn.cursor()
    
    cursor.execute('select * from database.table')
    
    res= cursor.fetchall() # convert res to spark dataframe
    
    for data in res:
            print(data)
    

    【讨论】:

      【解决方案3】:

      在群集库中设置 jar 后,在 Azure Databricks 笔记本中执行此操作。除了 d 是 Driver config 的大写字母外,一般遵循上一篇文章。效果很好。

      properties = {
      "Driver": "com.cloudera.impala.jdbc41.Driver"
      }
      
      
      db_df = spark.read.jdbc(url= 'jdbc:impala://hostname.domain.net:21050/dbname;AuthMech=3;UID=xxxx;PWD=xxxx', table ='product', properties = properties)
      
      db_df.show()
      

      【讨论】:

        【解决方案4】:

        这对我有用:

        spark-shell --driver-class-path ImpalaJDBC41.jar --jars ImpalaJDBC41.jar 
        
        val jdbcURL = s"jdbc:impala://192.168.56.101:21050;AuthMech=0"
        
        val connectionProperties = new java.util.Properties()
        
        val hbaseDF = sqlContext.read.jdbc(jdbcURL, "impala_table", connectionProperties)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-07-29
          • 2014-12-25
          • 2021-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-29
          相关资源
          最近更新 更多