spark跨集群读取hive数据

简述

本文是介绍使用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

 

 

欢迎留言讨论和指正

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值