spark sql读取hive数据直接写入doris,离线批量导入

本文介绍了如何使用Spark SQL从Hive表中读取数据,并通过自定义输出和stream load方式将数据高效写入Doris。在测试中,即使是包含上百字段、千万级别的数据,也能在本地IDEA环境中稳定运行,避免了OOM问题。相较于通过Flink、HDFS、Kafka的复杂流程,此方法更为简洁。

先简单的贴贴代码,后面会完善一下。

一,spark sql 读取hive表

这里通过catalog查询表的字段信息,然后 查询出来的字段colStr 要给下面的doris使用。

 注意:我这里是直接拿取的hive表所有的字段。

二,spark自定义输出


这里就是简单封装了一下

实现的效果:

三,通过stream load方式数据写入doris


   循环遍历DataFrame之后写入到doris里面:

 val dorisStreamLoader = new DorisStreamLoad("192.168.5.xx:8040", "example_db", "assuer_order_test", "root", "root")
      val cumsArrays = colStr.split(",")
      val fieldDelimiter: String = "\t"
      val lineDelimiter: String = "\n"
      val NULL_VALUE: String = "\\N"
      val maxRowCount = 5000
      val maxRetryTimes = 3
      data.rdd.foreachPartition(partition => {
        val buffer = ListBuffer[String]()

        var jsonArrays = new JSONArray()
        partition.foreach(f = row => {
          //            val value: StringJoiner = new StringJoiner(fieldDelimiter)
          // create one row string
          val json = new JSONObject()
          for (i <- 0 until row.size) {

            val field = row.get(i)
            val fieldName = cumsArrays(i)
            if (field == null) {
              //                value.add(NULL_VALUE)
              json.put(fieldName, NULL_VALUE)
            } else {
              //                value.add(field.toString)
              json.put(fieldName, field.toString)
            }


          }
          jsonArrays.add(json)
          // add one row string to buffer
          // 
<think>我们正在讨论将Hive和Impala的数据同步到Doris的方案。Doris(原ApacheDoris)是一个现代化的MPP(大规模并行处理)分析型数据库产品,支持实时数据分析。以下是一些可能的同步方案:1.**使用DataX进行数据同步**:DataX是阿里巴巴开源的一个异构数据离线同步工具,支持多种数据源。我们可以编写DataX作业,分别从Hive和Impala读取数据,然后写入Doris。对于Hive,可以直接通过HDFS读取数据;对于Impala,由于Impala的数据也存储在HDFS上,所以也可以通过HDFS读取,或者通过JDBC读取(但JDBC方式可能较慢)。2.**使用Spark进行数据同步**:通过Spark读取Hive/Impala表的数据,然后写入DorisSpark提供了强大的分布式计算能力,适合处理大量数据。我们可以使用SparkHiveContext读取Hive表,使用JDBC读取Impala表(或者直接读取HDFS上的数据),然后利用DorisSparkConnector写入Doris。3.**使用Flink进行实时同步**:如果需要实时或准实时同步,可以考虑使用Flink。通过Flink读取Hive/Impala的数据变化(对于Hive,可能需要监控HDFS文件变化;而Impala本身不支持实时数据变更的捕获,所以此方案可能更适用于Hive),然后将数据写入Doris。但注意,Impala通常用于交互式查询,其数据本身是静态的,所以实时同步可能不适用于Impala。4.**使用Doris的BrokerLoad**:Doris提供了BrokerLoad功能,可以直接通过Broker进程访问HDFS上的数据导入Doris中。因为Hive和Impala的数据通常都存储在HDFS上,所以我们可以将Hive/Impala表对应的HDFS文件作为数据源,通过BrokerLoad导入Doris。这种方式需要先将Hive/Impala表的数据导出为文件(如Parquet、ORC等格式),然后使用BrokerLoad导入。5.**使用Sqoop**:Sqoop是一个在Hadoop和关系型数据库之间传输数据的工具。我们可以使用Sqoop从Hive(通过HDFS)或Impala(通过JDBC)导出数据Doris。但是,Sqoop通常用于关系型数据库,而Doris支持MySQL协议,所以可以通过Sqoop的JDBC方式将数据导出Doris。**具体步骤(以BrokerLoad为例)**:1.在Hive/Impala中将表数据导出到HDFS的某个路径(如果已经是HDFS上的外部表,则可以直接使用)。2.在Doris中创建目标表,表结构需要与Hive/Impala表结构一致。3.使用Doris的BrokerLoad命令将HDFS上的数据导入Doris表中。示例BrokerLoad命令:```sqlLOADLABELlabel_name(DATAINFILE("hdfs://path/to/file")INTOTABLEtarget_tableFORMATAS"parquet")WITHBROKERbroker_name("username"="hdfs_user","password"="hdfs_password")PROPERTIES("timeout"="3600");```**注意事项**:-数据格式:需要确保Doris能够正确解析Hive/Impala导出的文件格式(如Parquet、ORC等)。-数据类型映射:注意Hive/Impala和Doris之间数据类型的对应关系。-增量同步:如果需要增量同步,可以考虑在Hive/Impala端记录增量数据(例如通过分区或者时间戳),然后只同步新增的数据。以上方案中,BrokerLoad和DataX是比较常用的离线同步方案,而Spark和Flink适合更复杂的处理场景。§§相关问题§§1.如何实现HiveDoris的增量数据同步?2.使用BrokerLoad从HDFS导入数据Doris时需要注意哪些问题?3.Doris支持哪些数据格式的导入?如何优化导入性能?</think>### Hive/Impala 数据同步到 Doris 的方案 #### 一、核心同步方案 1. **HDFS 文件直连同步**(推荐方案) Doris 支持直接读取 Hive/Impala 存储在 HDFS 上的数据文件: - **操作流程**: ```sql -- 创建 Doris 外部表映射 HDFS 数据 CREATE EXTERNAL TABLE doris_target_table PROPERTIES ( "type" = "HDFS", "path" = "hdfs://namenode:port/impala_data_path", "format" = "parquet" -- 支持 Parquet/ORC/CSV ); -- 通过 Broker Load 导入数据 LOAD LABEL sync_label (DATA INFILE("hdfs_path") INTO TABLE doris_table) WITH BROKER "broker_name"; ``` - **优势**: - 绕过计算层直接访问存储层,避免 Hive/Impala 查询性能瓶颈[^3] - 支持增量同步(通过分区路径过滤) 2. **JDBC 连接器同步** 通过 Doris 的 JDBC Catalog 直接查询 Hive/Impala: ```sql -- 创建 JDBC 数据源 CREATE CATALOG hive_jdbc PROPERTIES ( "type"="jdbc", "url"="jdbc:hive2://hiveserver:10000", "user"="user", "password"="pass" ); -- 定时增量同步 CREATE ROUTINE LOAD doris_load ON target_table PROPERTIES("format"="json") FROM KAFKA ( ... ) -- 或直接 INSERT INTO SELECT ``` #### 二、同步工具链方案 | 工具 | 适用场景 | 关键配置 | |------------|----------------------------|-----------------------------------| | **Apache SeaTunnel** | 大数据量批同步 | HiveSource -> DorisSink | | **DataX** | 结构化数据迁移 | HdfsReader + DorisWriter | | **Flink CDC** | 实时同步(需Hive事务表) | SQL: `INSERT INTO doris SELECT * FROM hive_table` | #### 三、关键注意事项 1. **元数据兼容性** - Doris 1.2+ 支持自动同步 Hive Metastore(通过 `hive.metastore.uris` 参数) - 类型映射需人工校验(如 Impala 的 `TIMESTAMP` 精度问题[^4]) 2. **性能优化建议** - 分区表同步:仅同步新增分区数据 ```sql LOAD LABEL ... (DATA INFILE("/path/date=2023*") ...) -- 通配符匹配分区 ``` - 大表同步:启用 Doris 的 `compaction` 机制预防小文件问题 3. **一致性保障** - 批处理场景:采用 `_success` 标记文件判断 HDFS 数据就绪 - 实时场景:通过 Kafka 中转实现 Exactly-Once 语义 #### 四、方案对比 | 方案 | 延迟 | 数据量上限 | 运维复杂度 | |--------------------|-----------|-----------|-----------| | HDFS 直连同步 | 分钟级 | PB级 | ★★☆☆☆ | | JDBC 查询同步 | 小时级 | TB级 | ★★★☆☆ | | Flink CDC 实时同步 | 秒级 | 百TB级 | ★★★★☆ | > **建议选择**: > - 常规场景:**HDFS 直连同步**(性价比最高) > - 实时分析:**Flink CDC + Doris** 组合方案
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值