sparkSql和hive的整合(spark on hive)

一、在Spark的安装包下的conf下创建一个文件 hive-site.xml,不需要更新到其他的节点,只需要在客户端有一份hive-site.xml就可以

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
</property>
<property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
</property>
<property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>123456</value>
</property>
</configuration>

二、开启Hive的metaStore服务

hive --service metastore & #后台启动

三、启动spark-shell时指定mysql连接驱动位置

/usr/local/spark/bin/spark-shell \
    --master spark://node1:7077 \
    --executor-memory 512m \
    --total-executor-cores 1 \
    --driver-class-path /usr/local/hive/lib/mysql-connector-java-5.1.32-bin.jar

四、

   import org.apache.spark.sql.hive.HiveContext
   val hc = new HiveContext(sc)
   hc.sql("show databases").show

五、整合可能遇到的问题

1、问题一:
Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

解决方法:

需要格式化mysql元数据库:
schematool -dbType mysql -initSchema
2、问题二:
java.sql.SQLException: Column name pattern can not be NULL or empty  

解决方法:

将 $HIVE_HOME/lib 下 的 mysql-connector-java-6.0.3.jar 替换成 mysql-connector-java-5.1.39.jar。
原因分析:mysql-connector-java 6.x 版本 和 5.1.x 版本不兼容 , nullNamePatternMatchesAll 连接属性的默认值在 mysql-connector-java 5.1 和 6.0 之间发生了改变. 在 5.1 版本中默认值是 true, 而 6.0 版本中默认值是 false。

3、问题三:

2019-07-06T10:01:53,737 ERROR [370c0a81-c922-4c61-8315-264c39b372c3 main] metastore.RetryingHMSHandler: MetaException(message:Hive Schema version 3.1.0 does not match metastore's schema version 1.2.0 Metastore is not upgraded or corrupt)
        at org.apache.hadoop.hive.metastore.ObjectStore.checkSchema(ObjectStore.java:9063)
        at org.apache.hadoop.hive.metastore.ObjectStore.verifySchema(ObjectStore.java:9027)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

这是因为在创建SQLContext实例的时候,要求spark编译的Hive版本和HiveMetaStore里面记录的Hive版本一致
3.1、解决方法一

我们可以通过$HIVE_CONF/confi/hive-site.xml 配置hive.metastore.schema.verification参数来取消这种验证,这个参数的默认值是true,我们可以取消验证,设置为false
<property>
    <name>hive.metastore.schema.verification</name>
    <value>false</value>
</property>

3.2、解决方法2
直接修改存储hive元数据的VERSION表

SELECT * FROM VERSION;
UPDATE VERSION SET SCHEMA_VERSION='3.1.0' WHERE  VER_ID = 1;
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容