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)
 
### 使用 Spark 读取 Hive数据 #### 方法一:直接采用 Spark on Hive 方式读取数据 可以直接利用 `SparkSession` 提供的功能来查询 Hive 中的数据。这种方式下,`SparkSession` 在执行 SQL 查询时会自动访问集群内的 Hive 库表,并加载 HDFS 上存储的实际数据及其元数据到 DataFrame 对象中。 ```scala val df = spark.sql("SELECT * FROM test.user_info")[^1] ``` 这段代码展示了如何创建一个 DataFrame 来保存来自名为 `test.user_info` 的 Hive 表的所有记录。 #### 方法二:通过 HadoopRDD 扫描读取 Hive 数据 另一种方法涉及更底层的操作机制——即借助于 `org.apache.spark.sql.hive.TableReader` 类构建 HadoopRDD 实现对 Hive 表的读取过程。此路径适用于那些希望深入了解内部工作原理或需要定制化处理逻辑的应用场景。 ```java // 构建HadoopRDD的相关Java伪代码示意 TableReader reader = new TableReader(); reader.readTable(); // 此处省略具体实现细节[^2] ``` 需要注意的是,在实际应用开发过程中通常不会直接调用此类接口;而是优先考虑使用更高层次抽象如上述提到的第一种方式。 #### 注意事项 当遇到 ETL 流程中修改 Hive 表结构(例如增加新字段)之后再尝试用 Spark 访问这些变更后的表格时可能出现 Schema 不匹配的问题。为了避免这种情况发生并保持两者之间的一致性,建议在完成任何 DDL 变动后及时运行 `REFRESH TABLE` 命令刷新缓存中的表定义信息[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值