【Spark】Spark 访问连接 HIVE

配置注意点:

1.拷贝mysql-connector-java-5.1.38-bin.jar等相关的jar包到你 s p a r k h o m e / l i b s p a r k 2.0 {spark_home}/lib中(spark2.0之后是 {spark_home}/jars下),不清楚就全部拷贝过去
2.将Hive的配置文件hive-site.xml拷贝到${spark_home}/conf目录下
3.因为使用ThriftJDBC/ODBC Server访问spark SQL,所以要修改hive-site.xml文件

[root@hw1 hive110]# cd lib
[root@hw1 lib]# cp mysql-connector-java-5.1.38.jar /opt/soft/spark234/jars/
[root@hw1 lib]# cd ..
[root@hw1 hive110]# cd conf
[root@hw1 conf]# cp hive-site.xml /opt/soft/spark234/conf/

[root@hw1 soft]# cd spark234/conf/
[root@hw1 conf]# ls
docker.properties.template   slaves
fairscheduler.xml.template   slaves.template
hive-site.xml                spark-defaults.conf.template
log4j.properties.template    spark-env.sh
metrics.properties.template  spark-env.sh.template
[root@hw1 conf]# vi hive-site.xml 
	<property>
           <name>hive.metastore.uris</name>
           <value>thrift://hw1:9083</value>
    </property>

4.启动hivede metastroe后台进程。执行 h i v e h o m e / b i n / h i v e s e r v i c e m e t a s t o r e h i v e s e r v i c e m e t a s t o r e 5. s p a r k s h e l l 访 h i v e {hive_home}/bin/hive --service metastore启动hive的service metastore后台进程。 5.启动spark-shell访问hive上数据。在 {spark_home}/bin下执行./spark-shell --master spark://master:7077 (可添加其他参数rg:–jars等参数)

hive --service metastore
[root@hw1 bin]# cd /opt/soft/spark234/bin/
[root@hw1 bin]# ./spark-shell

//自行创建的 spark 不带hive支持 连接需要停止新建sparkSession
scala> spark.stop
scala> import org.apache.spark.sql.SparkSession

scala> val spark = SparkSession.builder().appName("spark-hive").enableHiveSupport.getOrCreate
scala> spark.sql("select * from student.stu_details").show

数据读取插入

将数据保存到指定路径,可通过format来指定要保存的文件格式,repartition设置输出文件个数

scala> val spk = spark.sql("select * from student.stu_details")
spk: org.apache.spark.sql.DataFrame = [stu_id: string, stu_name: string ... 2 more fields]

scala> spk.repartition
repartition   repartitionByRange

scala> spk.repartition(1).write.format("csv").save("hdfs://192.168.56.122:9000/20200109")
// 保存成表
scala> spk.filter($"stu_name".startsWith("赵雷")).show
+------+--------+----------+--------+
|stu_id|stu_name|  stu_date|stu_male|
+------+--------+----------+--------+
|    01|      赵雷|1990-01-01||
+------+--------+----------+--------+
scala> spk.write.saveAsTable("xx")

scala> spark.sql("insert into xx values('09','guy','1990-01-01','男')")
res19: org.apache.spark.sql.DataFrame = []

出现的错误总结(解决方法仅供参考):

1.error: Error creating transactional connection factory

解决方法:在hive和spark集群都能正常使用情况下,检查一下hive的service metastore后台进程是否已经启动了

2.Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

解决方法:有可能是hive连接数据库部分出现了问题,在hive-site.xml文件中添加hive.metastore.uristhrift://hadoop1:9083,如果配置后执行出现了新的错误:ERROR ObjectStore: Version information not found in metastore,这个新错误可能使用hive的jar包和存储元数据信息版本不一致而抛出的异常,可以在hive-site.xml文件中添加参数跳过版本的问题,hive.metastore.schema.verificationfalse,重启hive服务,如果还是继续报ERROR ObjectStore: Version information not found in metastore这个错误,说明刚刚配置的参数没有生效,接着要把hdfs-site.xml文件拷贝到${spark_home}/conf文件下,这可能是因为环境变量的问题引起的

3.java.io.IOException: java.lang.reflect.InvocationTargetException

解决方法:由于缺少htrace-core-3.1.0-incubating.jar包,引入该包即可。

4.java.lang.ClassNotFoundException Class org.apache.hadoop.hive.hbase.HBaseSerDe not found

解决方法:由于缺少相关的hbase的jar包(hbase-protocol-1.1.2.jar,hbase-client-1.1.2.jar,hbase-common-1.1.2.jar,hbase-server-1.1.2.jar等),可以在启动spark-shell通过–jars来添加。

5.java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/util/Bytes

解决方法:由于缺少guava-12.0.1.jar包,引入该包即可。

发布了94 篇原创文章 · 获赞 110 · 访问量 5043

猜你喜欢

转载自blog.csdn.net/beautiful_huang/article/details/103914707