使用 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 连接的主要内容,如果未能解决你的问题,请参考以下文章