一、在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;