Kafka数据写入Hudi

1.配置pom.xml文件

<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-core_2.12</artifactId>
  <version>2.4.5</version>
</dependency>

<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-streaming-kafka-0-10_2.12</artifactId>
  <version>2.4.5</version>
</dependency>

<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-sql_2.12</artifactId>
  <version>2.4.5</version>
</dependency>

<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-streaming_2.12</artifactId>
  <version>2.4.5</version>
</dependency>

<dependency>
  <groupId>org.apache.hudi</groupId>
  <artifactId>hudi-client</artifactId>
  <version>0.5.3</version>
</dependency>

<dependency>
  <groupId>org.apache.hudi</groupId>
  <artifactId>hudi-spark-bundle_2.12</artifactId>
  <version>0.5.3</version>
</dependency>

<dependency>
  <groupId>org.apache.hudi</groupId>
  <artifactId>hudi-common</artifactId>
  <version>0.5.3</version>
</dependency>

<dependency>
  <groupId>org.apache.hudi</groupId>
  <artifactId>hudi-hadoop-mr-bundle</artifactId>
  <version>0.5.3</version>
</dependency>

<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-hive_2.12</artifactId>
  <version>2.4.5</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-avro -->
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-avro_2.12</artifactId>
  <version>2.4.5</version>
</dependency>

2.main方法入口

数据结构
database:test,table:t_stu,eventType:INSERT,data:id_10-name_zhangsan&id_11-name_lisi
database:test,table:t_stu,eventType:UPDATE,data:id_8-name_xixi id_8-name_new&id_9-name_xixi id_9-name_new
import org.apache.kafka.clients.consumer.ConsumerConfig
import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.sql._
import org.apache.spark.sql.types.{LongType, StringType, StructField, StructType}
import org.apache.spark.streaming.dstream.DStream
import org.apache.spark.streaming.kafka010.{ConsumerStrategies, KafkaUtils, LocationStrategies}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.hudi.QuickstartUtils._
import org.apache.spark.sql.SaveMode._
import org.apache.hudi.DataSourceReadOptions._
import org.apache.hudi.DataSourceWriteOptions._
import org.apache.hudi.config.HoodieWriteConfig._

import scala.collection.mutable.ArrayBuffer

object KafkaToHudi {
  def main(args: Array[String]): Unit = {
    val sc = new SparkConf().setAppName("KafkaToHudi").setMaster("local[*]")
      .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")

    val ssc = new StreamingContext(sc,Seconds(10))
    ssc.checkpoint("/checkPoint");
    val topicsSet = Array("canalDemo")
    val kafkaParams = Map[String, Object](
      ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG -> "slave1:9092,slave2:9092,slave3:9092",
      ConsumerConfig.GROUP_ID_CONFIG -> "test",
      ConsumerConfig.AUTO_OFFSET_RESET_CONFIG -> "latest",
      ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG -> classOf[StringDeserializer],
      ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG -> classOf[StringDeserializer])

    val streams = KafkaUtils.createDirectStream[String, String](
      ssc, LocationStrategies.PreferConsistent,
      ConsumerStrategies.Subscribe[String, String](topicsSet, kafkaParams))

    val message: DStream[(String, String, String, String, String, String, String, String)] = streams.map(_.value()).flatMap(line => {
      val commitTime = System.currentTimeMillis().toString;
      val datas = line.split(",");
      val database = datas(0).split(":")(1);
      val table = datas(1).split(":")(1);
      val eventType = datas(2).split(":")(1);
      val updateStatement = datas(3).split(":")(1).split("&");
      val tuples: Array[(String, String, String)] = updateStatement.map(statement => {
        var beforeData = "";
        var afterData = "";
        var id="";
        val dataArr = statement.split(" ");
        if(dataArr.length>1){
          id = dataArr(1).split("-")(0).split("_")(1);
          beforeData = dataArr(0);
          afterData = dataArr(1);
        }else{
          id = dataArr(0).split("-")(0).split("_")(1);
          afterData = dataArr(0)
        }
        (beforeData, afterData ,id)
      })
      val result = tuples.map(x => {
        val uuid = commitTime+"/"+x._3;
        (database, table, eventType, x._1 , x._2 ,x._3,commitTime,uuid);
      })
      result
    });
    val spark = SparkSession.builder()
      .config(sc)
      .enableHiveSupport()
      .getOrCreate()
    import spark.implicits._
    import org.apache.spark.sql.functions._

    System.setProperty("HADOOP_USER_NAME","root");
    val sparkContext = spark.sparkContext
    sparkContext.hadoopConfiguration.set("fs.defaultFS","hdfs://master")
    sparkContext.hadoopConfiguration.set("dfs.nameservices","master")

    val schema = StructType(Array(StructField("database",StringType,false),
      StructField("table",StringType,false),
      StructField("eventType",StringType,false),
      StructField("beforeData",StringType,false),
      StructField("afterData",StringType,false),
      StructField("id",StringType,false),
      StructField("ts",StringType,false),
      StructField("uuid",StringType,false)));

    message.foreachRDD((rdd) => {
      val res:RDD[Row] = rdd.map { row =>
        val buffer = ArrayBuffer.empty[Any]
        buffer.append(row._1)
        buffer.append(row._2)
        buffer.append(row._3)
        buffer.append(row._4)
        buffer.append(row._5)
        buffer.append(row._6)
        buffer.append(row._7)
        buffer.append(row._8)
        Row.fromSeq(buffer)
      }
      val df = spark.createDataFrame(res, schema)
      df.show();
      if(!df.isEmpty){
        df.write.format("org.apache.hudi")
          .option(PRECOMBINE_FIELD_OPT_KEY, "ts") // 提交时间列
          .option(RECORDKEY_FIELD_OPT_KEY, "uuid") // 指定uuid唯一标示列
          .option(PARTITIONPATH_FIELD_OPT_KEY, "")
          .option(TABLE_NAME, "testTable")
          .mode(SaveMode.Append)
          .save("/sparkHudi")
      }
    })
    ssc.start()
    ssc.awaitTermination()
  }
}

如有问题,欢迎一起交流讨论。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
随着互联网的发展,数据的不断膨胀,从刚开始的关系型数据库到非关系型数据库,再到大数据技术,技术的不断演进最终是随着数据膨胀而不断改变,最初的数据仓库能解决我们的问题,但是随着时代发展,企业已经不满足于数据仓库,希望有更强大的技术来支撑数据的存储,包括结构化,非结构化的数据等,希望能够积累企业的数据,从中挖掘出更大的价值。基于这个背景,数据湖的技术应运而生。本课程基于真实的企业数据湖案例进行讲解,结合业务实现数据湖平台,让大家在实践中理解和掌握数据湖技术,未来数据湖的需求也会不断加大,希望同学们抓住这个机遇。项目中将以热门的互联网电商业务场景为案例讲解,具体分析指标包含:流量分析,订单分析,用户行为分析,营销分析,广告分析等,能承载海量数据的实时分析,数据分析涵盖全端(PC、移动、小程序)应用。Apache HudiHadoop Upserts anD Incrementals,管理大型分析数据集在HDFS上的存储。Hudi的主要目的是高效减少摄取过程中的数据延迟。Hudi的出现解决了现有hadoop体系的几个问题:1、HDFS的可伸缩性限制 2、需要在Hadoop中更快地呈现数据 3、没有直接支持对现有数据的更新和删除 4、快速的ETL和建模 5、要检索所有更新的记录,无论这些更新是添加到最近日期分区的新记录还是对旧数据的更新,Hudi都允许用户使用最后一个检查点时间戳,此过程不用执行扫描整个源的查询。 本课程包含的技术: 开发工具为:IDEA、WebStorm Flink1.9.0、HudiClickHouseHadoop2.7.5 Hbase2.2.6Kafka2.1.0 Hive2.2.0HDFS、MapReduceSpark、ZookeeperBinlog、Canal、MySQLSpringBoot2.0.2.RELEASE SpringCloud Finchley.RELEASEVue.js、Nodejs、HighchartsLinux Shell编程课程亮点: 1.与企业接轨、真实工业界产品 2.ClickHouse高性能列式存储数据库 3.大数据热门技术Flink4.Flink join 实战 5.Hudi数据湖技术6.集成指标明细查询 7.主流微服务后端系统 8.数据库实时同步解决方案 9.涵盖主流前端技术VUE+jQuery+Ajax+NodeJS 10.集成SpringCloud实现统一整合方案 11.互联网大数据企业热门技术栈 12.支持海量数据的实时分析 13.支持全端实时数据分析 14.全程代码实操,提供全部代码和资料 15.提供答疑和提供企业技术方案咨询企业一线架构师讲授,代码在老师的指导下企业可以复用,提供企业解决方案。  版权归作者所有,盗版将进行法律维权。  
Kafka数据写入MySQL是指将从Kafka消息队列中获取的数据写入MySQL数据库中。在实际应用中,这种方式常用于数据的实时处理和持久化存储。 在将数据写入MySQL之前,我们需要先搭建好Kafka集群和MySQL数据库,并确保它们的连接和配置正确。接下来,可以采取以下几个步骤将数据Kafka写入MySQL: 1. 创建一个Kafka消费者来消费Kafka消息队列的数据。 2. 接收Kafka消息,将其转换为MySQL数据库所需的格式。这个格式一般是以格的形式组织,并遵循MySQL的数据类型。 3. 连接MySQL数据库,并创建一个MySQL客户端。 4. 在MySQL客户端中执行插入操作,将从Kafka消息队列中获取的数据插入到MySQL数据库的对应中。 5. 确认数据插入成功后,可以关闭与MySQL数据库的连接,释放资源。 在实际操作中,需要注意以下几点: 1. 数据写入MySQL时要保证数据一致性和正确性,可以对数据进行校验和去重,避免重复写入或丢失数据。 2. 可以按批次进行数据写入,提高效率,减少数据库连接和插入操作的次数。 3. 对于大规模的数据写入,可以考虑使用MySQL的批量插入功能,例如使用多值的INSERT语句或LOAD DATA INFILE命令。 4. 需要在代码中处理可能出现的异常情况,例如连接错误、插入失败等,并进行相应的处理和日志记录。 总之,通过合理配置和编程,将Kafka数据写入MySQL可以实现实时数据处理和持久化存储的需求,适用于很多场景,如日志分析、实时计算等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值