使用Apache Spark从MySQL到Kafka再到HDFS的数据转移

使用Apache Spark从MySQL到Kafka再到HDFS的数据转移

在本文中,将介绍如何构建一个实时数据pipeline,从MySQL数据库读取数据,通过Kafka传输数据,最终将数据存储到HDFS中。我们将使用Apache Spark的结构化流处理和流处理功能,以及Kafka和HDFS作为我们的数据传输和存储工具。
1、环境设置:
首先,确保在您的环境中正确安装并配置了mysql、Kafka和HDFS。同时需要在idea中构建依赖配置的pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spark_project</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <scala.version>2.12.12</scala.version>
        <spark.version>3.2.0</spark.version>
        <kafka.version>2.8.1</kafka.version>
    </properties>

    <dependencies>
        <!-- Spark dependencies -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.12</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql-kafka-0-10_2.12</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_2.12</artifactId>
            <version>${spark.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming-kafka-0-10_2.12</artifactId>
            <version>${spark.version}</version>
        </dependency>

        <!-- Kafka dependencies -->
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>${kafka.version}</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

        <!-- Scala library -->
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${scala.version}</version>
        </dependency>   
    </dependencies>
</project>

mysql中表结构:
在这里插入图片描述

2、从MySQL读取数据到Kafka:
我们将使用Spark的结构化流处理功能从MySQL数据库中读取数据,并将其转换为JSON格式,然后将数据写入到Kafka主题中。以下是相应的Scala代码:

package org.example.mysql2kafka2hdfs

import org.apache.spark.sql.SparkSession

import java.util.Properties

object Mysql2Kafka {

  def main(args: Array[String]): Unit = {
    // 创建 SparkSession
    val spark = SparkSession.builder()
      .appName("MySQLToKafka")
      .master("local[*]")
      .getOrCreate()

    // 设置 MySQL 连接属性
    val mysqlProps = new Properties()
    mysqlProps.setProperty("user", "root")
    mysqlProps.setProperty("password", "12345678")
    mysqlProps.setProperty("driver", "com.mysql.jdbc.Driver")

    // 从 MySQL 数据库中读取数据
    val jdbcDF = spark.read.jdbc("jdbc:mysql://localhost:3306/mydb", "comment", mysqlProps)

    // 将 DataFrame 转换为 JSON 字符串
    val jsonDF = jdbcDF.selectExpr("to_json(struct(*)) AS value")


    // 将数据写入 Kafka
    jsonDF.show()
    jsonDF
      .write
      .format("kafka")
      .option("kafka.bootstrap.servers", "localhost:9092")
      .option("topic", "comment")
      .save()

    // 停止 SparkSession
    spark.stop()
  }

}

以上代码首先创建了一个SparkSession,然后设置了连接MySQL所需的属性。接着,它使用jdbc.read从MySQL数据库中读取数据,并将数据转换为JSON格式,最后将数据写入到名为"comment"的Kafka主题中。提示:topic主题会被自动创建。

从Kafka消费数据并写入HDFS:
接下来,我们将设置Spark Streaming来消费Kafka中的数据,并将数据保存到HDFS中。以下是相应的Scala代码:

package org.example.mysql2kafka2hdfs

import com.alibaba.fastjson.JSON
import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.SparkConf
import org.apache.spark.streaming.kafka010.{ConsumerStrategies, KafkaUtils, LocationStrategies}
import org.apache.spark.streaming.{Seconds, StreamingContext}

case class Comment(author_name:String,
                   fans:String,
                   comment_text:String,
                   comment_time:String,
                   location:String,
                   user_gender:String)

object kafka2Hdfs {
  def main(args: Array[String]): Unit = {
    // 设置 SparkConf
    val sparkConf = new SparkConf()
      .setAppName("KafkaToHDFS")
      .setMaster("local[*]")

    // 创建 StreamingContext,每秒处理一次
    val ssc = new StreamingContext(sparkConf, Seconds(1))

    // 设置 Kafka 相关参数
    val kafkaParams = Map[String, Object](
      "bootstrap.servers" -> "localhost:9092", // Kafka broker 地址
      "key.deserializer" -> classOf[StringDeserializer],
      "value.deserializer" -> classOf[StringDeserializer],
      "group.id" -> "spark-consumer-group", // Spark 消费者组
      "auto.offset.reset" -> "earliest", // 从最新的偏移量开始消费
      "enable.auto.commit" -> (false: java.lang.Boolean) // 不自动提交偏移量
    )

    // 设置要订阅的 Kafka 主题
    val topics = Array("comment")

    // 创建 Kafka Direct Stream
    val stream = KafkaUtils.createDirectStream[String, String](
      ssc,
      LocationStrategies.PreferConsistent,
      ConsumerStrategies.Subscribe[String, String](topics, kafkaParams)
    )


    // 从 Kafka 中读取消息,然后将其写入 HDFS
    stream.map({rdd=>
      val comment = JSON.parseObject(rdd.toString(), classOf[Comment])
      comment.author_name+","+comment.comment_text+","+comment.comment_time+","+comment.fans+","+comment.location+","+comment.user_gender
    }).foreachRDD { rdd =>
      if (!rdd.isEmpty()) {
        println(rdd)
        rdd.saveAsTextFile("hdfs://hadoop101:8020/tmp/")
      }
    }

    // 启动 Spark Streaming
    ssc.start()
    ssc.awaitTermination()
  }

}

以上代码设置了Spark Streaming来消费Kafka中的数据。它将JSON格式的数据解析为Comment类对象,并将其保存为逗号分隔的文本文件,最终存储在HDFS的/tmp目录中。
在这里插入图片描述

结论:
通过本文的介绍和示例代码,您现在应该了解如何使用Apache Spark构建一个实时数据流水线,从MySQL数据库读取数据,通过Kafka传输数据,最终将数据保存到HDFS中。这个流水线可以应用于各种实时数据处理和分析场景中。

**如有遇到问题可以找小编沟通交流哦。另外小编帮忙辅导大课作业,学生毕设等。不限于python,java,大数据,模型训练等。 hadoop hdfs yarn spark Django flask flink kafka flume datax sqoop seatunnel echart可视化 机器学习等 **
在这里插入图片描述

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Sqoop是一个用于在Hadoop生态系统和关系型数据库之间进行数据传输的工具。Kafka是一个分布式流处理平台,用于高吞吐量的实时数据Spark是一个基于内存的大数据处理框架,用于快速和高效地处理和分析大规模数据。 以下是关于Sqoop/Kafka/Spark的一些选择题及答案: 1. Sqoop的主要功能是什么? 答案:将关系型数据库中的数据导入到Hadoop中,或将Hadoop中的数据导出到关系型数据库。 2. Kafka的主要特点是什么? 答案:高吞吐量、低延迟、可持久化的分布式流处理平台。 3. Spark的主要特点是什么? 答案:快速、灵活、可扩展的大数据处理框架,具有内置的支持多种数据处理任务的API。 4. Sqoop与Kafka的主要区别是什么? 答案:Sqoop是用于数据传输的工具,而Kafka是一个流处理平台,具有高吞吐量和低延迟的特点。 5. KafkaSpark的主要区别是什么? 答案:Kafka用于实时流处理,而Spark用于大数据处理和分析,具有更丰富的数据处理功能。 6. 使用Sqoop时,你需要提供哪些参数? 答案:数据库连接信息、表名、Hadoop集群信息等。 7. 使用Kafka时,你需要提供哪些参数? 答案:Kafka集群的地址、主题名称等。 8. 使用Spark时,你需要提供哪些参数? 答案:应用程序名称、数据源的路径等。 9. Sqoop支持哪些数据库? 答案:Sqoop支持大多数主流的关系型数据库,如MySQL、Oracle、SQL Server等。 10. KafkaSpark可以结合使用吗? 答案:是的,Kafka可以作为Spark Streaming的数据源,提供实时流数据。 ### 回答2: 1. Sqoop是什么? Sqoop是一个用于将关系型数据库(如MySQL、Oracle等)中的数据导入到Hadoop集群中的工具。它可以自动将数据库表结构映射为Hadoop中的数据模型,并利用MapReduce进行数据传输。 Sqoop还支持将Hadoop中的数据导出到关系型数据库中。答案:将关系型数据数据导入和导出到Hadoop集群。 2. Kafka是什么? Kafka是一个分布式的、基于发布-订阅模式的消息队列系统。它具有高吞吐量、可容错性和扩展性的特点。Kafka可以用于实时流式数据处理、日志收集、消息传递等场景。答案:一个分布式的、基于发布-订阅模式的消息队列系统。 3. Spark是什么? Spark是一个快速、通用的大数据处理引擎,它支持分布式数据处理、机器学习、图计算等多种任务。Spark提供了内存计算的功能,比传统的MapReduce模型更高效。利用Spark可以实现实时数据处理、批处理、交互式查询等功能。答案:一个快速、通用的大数据处理引擎。 4. 对于数据实时处理的场景,使用哪种工具合适? 对于数据实时处理的场景,KafkaSpark是两种常用的工具。Kafka作为消息队列系统可以实时接收和传输大量的数据,并提供高吞吐量。而Spark则可以借助其分布式计算引擎,实现对接收到的实时数据进行处理和分析。答案:KafkaSpark。 5. 如何将关系数据库中的数据导入到Hadoop集群中? 要将关系数据库中的数据导入到Hadoop集群中,可以使用Sqoop工具。Sqoop可以通过命令行或者脚本方式,自动将数据库中的数据导入到Hadoop中的文件系统(如HDFS)或者Hive中。答案:使用Sqoop工具进行导入。 总结:Sqoop用于将关系型数据库导入到Hadoop集群,Kafka用于消息传递和流式数据处理,Spark是一个通用的大数据处理引擎。对于实时数据处理的场景,可选择KafkaSpark进行数据接收和处理。当需要将关系数据库的数据导入到Hadoop集群中时,可使用Sqoop工具。 ### 回答3: 题目:sqoop/kafka/spark相关选择题及答案 1. Sqoop主要用于什么? 答案:Sqoop是一个用于在Hadoop与关系型数据库之间传输数据的工具。它能够将关系型数据库中的数据导入到Hadoop中的HDFS(Hadoop分布式文件系统)中,也可以将HDFS中的数据导出到关系型数据库中。 2. Kafka的主要特点是什么? 答案:Kafka是一个分布式流式平台,具有以下主要特点: - 高吞吐量:Kafka能够处理大量的实时数据,并保证低延迟。 - 可扩展性:Kafka能够通过简单地增加节点来扩展其处理能力。 - 高可靠性:Kafka采用分布式、多副本的方式来保证数据的可靠性和持久化。 - 消息传送一次语义:Kafka保证每个消息只会被传递一次,不会丢失。 - 支持发布/订阅模式:Kafka支持发布者和订阅者之间的松耦合通信模式。 3. Spark Streaming的主要特点是什么? 答案:Spark Streaming是Apache Spark提供的实时流处理框架,具有以下主要特点: - 高吞吐量和低延迟:Spark Streaming能够实时处理和分析大规模数据,并保证低延迟。 - 容错机制:Spark Streaming能够自动从故障中恢复,并保持完整的状态信息。 - 扩展性:Spark Streaming能够通过增加更多的计算节点来实现实时流处理的横向扩展。 - 高级别的抽象:Spark Streaming提供了类似于批处理的高级别API,使得开发者可以使用批处理和实时处理相同的编程模型。 希望以上答案对您有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值