使用 Spark JobServer spark 不使用 hive-site.xml 上配置的 mysql 连接

Posted

技术标签:

【中文标题】使用 Spark JobServer spark 不使用 hive-site.xml 上配置的 mysql 连接【英文标题】:Using Spark JobServer spark doesn't use the configured mysql connection on hive-site.xml 【发布时间】:2016-12-01 14:12:26 【问题描述】:

使用 Spark 2.0.2 我有一个与 spark-submit 配合使用的 jar。现在我想从 Spark JobServer 使用它。

第一个问题是方法:

public SparkJobValidation validate(SparkContext sc, Config config) 
    return SparkJobValid$.MODULE$; 


@Override
public Object runJob(SparkContext jsc, Config jobConfig) 
//code

将已弃用的 SparkContext 改为 SparkSession 作为参数。我的解决方案是执行以下操作:

@Override
public Object runJob(SparkContext jsc, Config jobConfig) 
    SparkSession ss = SparkSession.builder()
            .sparkContext(jsc)
            .enableHiveSupport()
            .getOrCreate();

return ss.table("purchases").showString(20, true);

我没有安装 Hive,我只是使用 Spark 附带的 HiveSupport,我将 hive-site.xml 放在 $SPARK_HOME/conf 下,这与 spark-submit 一起使用。

hive-site.xml

    <?xml version="1.0"?>
        <configuration>
         <property>
          <name>javax.jdo.option.ConnectionURL</name>
          <value>jdbc:mysql://localhost:3306/metastore_db?createDatabaseIfNotExist=true</value>
          <description>JDBC connect string for a JDBC metastore</description>
         </property>

         <property>
          <name>javax.jdo.option.ConnectionDriverName</name>
           <value>com.mysql.jdbc.Driver</value>
      <description>Driver class name for a JDBC metastore</description>
    </property>

    <property>
      <name>javax.jdo.option.ConnectionUserName</name>
      <value>user</value>
      <description>username to use against metastore database</description>
    </property>

    <property>
      <name>javax.jdo.option.ConnectionPassword</name>
      <value>password</value>
      <description>password to use against metastore database</description>
    </property>

    <property>
      <name>hive.metastore.warehouse.dir</name>
      <value>/spark-warehouse/</value>
      <description>Warehouse Location</description>
    </property>
    </configuration>

但是当我将此 jar 作为来自 Spark JobServer 的作业从这个配置文件执行时,只需要 hive.metastore.warehouse.dir 。不与 MySQL db 建立任何连接来读取/保存 Hive metastore_db,当然,它看不到默认 db 上的表。我在 $SPARK_HOME/jars 文件夹中有 mysql-connector-java-5.1.40-bin.jar。

如何才能连接到位于我的 MySQL 数据库中的 Hive metastore_db?

【问题讨论】:

你想从本地文件系统还是 hdfs 读取?据我所知,您必须为本地文件系统编写 file:///data/spark-warehouse/,为 hdfs 编写 hdfs://host:port/data/spark-warehouse/ @SimonSchiff 我想从本地文件中读取,我接受了你的建议,但仍然失败。 【参考方案1】:

使用 Hive 上下文而不是基本上下文,因为我使用的是 java,所以我必须在创建上下文时使用 context-factory=spark.jobserver.context.JavaHiveContextFactory,并且我已经实现了如下类:

public class My_SparkHIVEJob implements JHiveJob<String> 


@Override
    public String run(HiveContext c, JobEnvironment je, Config config) 
        /*
            JOB CODE...
        */
    

    @Override
    public Config verify(HiveContext c, JobEnvironment je, Config config) 
        return config;
    

看起来很简单,但几个月前当我开始使用 Spark - Spark Jobserver 时,情况并非如此 :-)

【讨论】:

以上是关于使用 Spark JobServer spark 不使用 hive-site.xml 上配置的 mysql 连接的主要内容,如果未能解决你的问题,请参考以下文章

Spark job server原理初探

使用 Spark 作业服务器的 Spark SQL 作业中的错误“此上下文的作业类型无效”

科普Spark,Spark是什么,如何使用Spark

科普Spark,Spark是啥,如何使用Spark

科普Spark,Spark是什么,如何使用Spark

手把手带你玩转Spark机器学习-使用Spark进行文本处理