简述
本文是介绍使用spark on hive的方式读取不同集群hive中的数据并落入本地集群。
一般使用spark on hive的方式操作hive数据的使用场景都是spark任务提交和hive所处的是同一个集群上。如果不同是不同集群就会有诸多限制。
这种方式对集群权限要求比较高,这也是用此方法不太实用的地方,就当作是一个不考虑实用性的小实验。
这种方式算是个野路子,有其他更成熟的产品工具使用,常见的跨集群的数据迁移工具有distcp、sqoop等等。
实现方法
第一步构建SparkSession
val spark = SparkSession.builder()
.master("local[2]")
.appName("test")
.config("hive.metastore.schema.verification", false)
.config("dfs.client.use.datanode.hostname", true)
.config("hive.metastore.uris","thrift://xxx:9083")
.enableHiveSupport()
.config("dfs.client.socket-timeout",300000)
.getOrCreate()
执行报错
val df = spark.sql(
"""
|select * from test.user_info
|""".stripMargin)
df.show()
原因是因为各节点之间会在spark在访问hdfs数据时进行通讯,使用的是/etc/hosts里配置的别名
而我为了模拟不同集群之间的数据迁移,提交的spark命令是在我的电脑本地执行的,而我本地并不知道hdnamenode这个服务器的别名,需要在本地电脑上对hosts进行配置。
vi /etc/hosts
192.xxx hdnamenode
192.xxx hddatanode01
192.xxx hddatanode02
192.xxx hddatanode03
数据读取成功
然后可通过这种方式将数据灌入hive表
df.createOrReplaceTempView("df")
spark.sql(
"""
|insert overwrite table 目标数据库.目标表 partition(分区字段名 ='分区值') select * from df
|""".stripMargin)
还有一种方法就是通过spark jdbc的方式访问
https://blog.csdn.net/qq_42213403/article/details/117557610?spm=1001.2014.3001.5501 第二种方法
https://blog.csdn.net/qq_42213403/article/details/117564393?spm=1001.2014.3001.5501