如何通过Spark SQL作为JDBC分布式查询引擎访问RDD表?

时间:2015-07-18 16:08:03

标签: apache-spark apache-spark-sql

stackoverflow上的几个帖子都有响应,其中包含有关如何通过Spark SQL作为JDBC分布式查询引擎访问RDD表的部分信息。因此,我想提出以下问题,以获取有关如何执行此操作的完整信息:

  1. 在Spark SQL应用程序中,我们是否需要使用HiveContext来注册表?或者我们可以只使用SQL上下文吗?

  2. 我们在哪里以及如何使用HiveThriftServer2.startWithContext?

  3. 当我们在

  4. 中运行start-thriftserver.sh
      

    /opt/mapr/spark/spark-1.3.1/sbin/start-thriftserver.sh --master spark:// spark-master:7077 --hiveconf hive.server2.thrift.bind.host spark-master --hiveconf hive.server2.trift.port 10001

    除了指定Spark SQL应用程序的jar和主类之外,我们还需要指定任何其他参数吗?

    1. 我们还需要做其他事吗?
    2. 感谢。

2 个答案:

答案 0 :(得分:6)

要通过HiveThriftServer2.startWithContext()公开DataFrame临时表,您可能需要编写并运行一个简单的应用程序,可能不需要运行start-thriftserver.sh

问题:

  1. HiveContext是必需的; sqlContext隐式地在spark-shell

  2. 中转换为HiveContext
  3. 编写一个简单的应用程序,例如:

  4.     import  org.apache.spark.sql.hive.thriftserver._  
        val  hiveContext  =  new  HiveContext(sparkContext)
        hiveContext.parquetFile(path).registerTempTable("my_table1")
          HiveThriftServer2.startWithContext(hiveContext)
    
    1. 无需运行start-thriftserver.sh,而是运行您自己的应用程序,例如:
    2.   

      spark-submit --class com.xxx.MyJdbcApp ./package_with_my_app.jar

      1. 服务器端没有其他任何东西应该在默认端口10000上启动; 您可以通过直线连接到服务器进行验证。

答案 1 :(得分:1)

在Java中,我能够将数据框作为临时表公开,并通过直线读取表内容(就像常规的hive表一样)

我还没有发布整个程序(假设你已经知道如何创建数据帧)

import org.apache.spark.sql.hive.thriftserver.*;

HiveContext sqlContext = new org.apache.spark.sql.hive.HiveContext(sc.sc());
DataFrame orgDf = sqlContext.createDataFrame(orgPairRdd.values(), OrgMaster.class);

orgPairRdd是一个JavaPairRDD,orgPairRdd.values() - >包含整个类值(从Hbase获取的行)

OrgMaster是一个java bean可序列化的类

orgDf.registerTempTable("spark_org_master_table");

HiveThriftServer2.startWithContext(sqlContext);

我在本地提交了程序(因为Hive thrift服务器没有在该机器的端口10000中运行)

hadoop_classpath=$(hadoop classpath)
HBASE_CLASSPATH=$(hbase classpath)

spark-1.5.2/bin/spark-submit   --name tempSparkTable     --class packageName.SparkCreateOrgMasterTableFile  --master local[4]   --num-executors 4    --executor-cores 4    --executor-memory 8G   --conf "spark.executor.extraClassPath=${HBASE_CLASSPATH}"   --conf "spark.driver.extraClassPath=${HBASE_CLASSPATH}"    --conf "spark.executor.extraClassPath=${hadoop_classpath}"  --conf  --jars /path/programName-SNAPSHOT-jar-with-dependencies.jar  
    /path/programName-SNAPSHOT.jar

在另一个终端开始直线指向这个节俭服务开始使用这个火花程序

/opt/hive/hive-1.2/bin/beeline -u jdbc:hive2://<ipaddressofMachineWhereSparkPgmRunninglocally>:10000 -n anyUsername

显示表格 - &gt;命令将显示您在Spark中注册的表

您也可以进行描述

在这个例子中

describe spark_org_master_table;

然后您可以直接针对此表运行常规查询。 (直到你杀死火花程序执行)