Spark Streaming几种数据采集方式

本文介绍了Spark Streaming的三种数据采集方式:通过端口接收数据,从文件系统读取数据,以及从Kafka主题中拉取数据。在每个部分,都包含了依赖添加、测试步骤及实例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、添加依赖

创建maven项目添加依赖包

<dependency>
      <groupId>org.apache.kafka</groupId>
      <artifactId>kafka_2.11</artifactId>
      <version>2.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.kafka</groupId>
      <artifactId>kafka-streams</artifactId>
      <version>2.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-core_2.11</artifactId>
      <version>2.4.5</version>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-streaming_2.11</artifactId>
      <version>2.4.5</version>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
      <version>2.4.5</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.6.6</version>
    </dependency>

二、从端口采集

package sparkStreaming

import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}

object sparkStreamDemo {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf()
      .setMaster("local[*]").setAppName("demo")

    //采集周期,指定的5秒为每次采集的时间间隔
    val streamingContext = new StreamingContext(sparkConf,Seconds(5))

    //指定采集的方法
    val socketLineStream =
      streamingContext.socketTextStream("192.168.184.40",7777)

    //将采集的信息进行处理---以wordCount为例,具体可替换业务逻辑
    val sumStream =
      socketLineStream.flatMap(_.split("\\s+"))
        .map(x=>(x,1)).reduceByKey(_+_)

    //打印
    sumStream.print()

    //启动采集器
    streamingContext.start()
    
    streamingContext.awaitTermination()
  }
}

测试:
运行代码后,启动nc后输入数据

nc -lk 7777

三、从文件采集

package sparkStreaming

import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}

object sparkStreamFileDataSourceDemo {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
      .setMaster("local[*]").setAppName("filedemo")
	
	//指定5秒采集一次
    val streamingContext = new StreamingContext(conf,Seconds(5))

	//调用textFileStream()方法生成一个文件流类型的InputStream
    val fileDStream = streamingContext.textFileStream("G:/tmp/")

	//流计算逻辑
    val wordStream = fileDStream.flatMap(_.split("\\s+"))
    val mapStream = wordStream.map(x=>(x,1))
    val sumStream = mapStream.reduceByKey(_+_)

    sumStream.print()

    streamingContext.start()

    streamingContext.awaitTermination()
  }
}

测试:
启动代码后编辑文件拉入指定文件夹

四、从kafka中拉取

package sparkStreaming

import org.apache.kafka.clients.consumer.{ConsumerConfig, ConsumerRecord}
import org.apache.spark.SparkConf
import org.apache.spark.streaming.dstream.InputDStream
import org.apache.spark.streaming.kafka010.{ConsumerStrategies, KafkaUtils, LocationStrategies}
import org.apache.spark.streaming.{Seconds, StreamingContext}

object sparkStreamKafkaSource {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
      .setMaster("local[*]").setAppName("kafkaDemo")

    val streamingContext = new StreamingContext(conf,Seconds(5))

	//kafka配置信息
    val kafkaParams = Map(
      (ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG -> "192.168.184.40:9092"),
      (ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG -> "org.apache.kafka.common.serialization.StringDeserializer"),
      (ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG -> "org.apache.kafka.common.serialization.StringDeserializer"),
      (ConsumerConfig.GROUP_ID_CONFIG, "kafkaGroup1")
    )

    val kafkaStream:InputDStream[ConsumerRecord[String,String]]
    = KafkaUtils.createDirectStream(
      streamingContext,
      //本地策略,在可用的 exec 上均匀分布
      LocationStrategies.PreferConsistent,
      ConsumerStrategies.Subscribe(Set("sparkKafkaDemo"), kafkaParams)
    )

    val wordStream =
      kafkaStream.flatMap(_.value().toString.split("\\s+"))

    val mapStream = wordStream.map((_,1))

    val sumStream = mapStream.reduceByKey(_+_)

    sumStream.print()

    streamingContext.start()

    streamingContext.awaitTermination()
  }
}

测试:
创建topic --> sparkKafkaDemo

kafka-topics.sh --zookeeper 192.168.184.40:2181 --create --topic sparkKafkaDemo --partitions 1 --replication-factor

生产者

kafka-console-producer.sh --topic sparkKafkaDemo --broker-list 192.168.184.40:9092

运行代码后生产数据

### Spark 数据采集教程及方法 在大数据处理中,数据采集是整个数据处理流程的重要环节之一。Apache Spark 是一种高效的分布式计算框架,可以用于大规模数据的采集、处理和分析。以下是使用 Spark 进行数据采集的具体方法和教程。 #### 1. 确定数据采集范围和目标 在进行数据采集之前,必须明确以下几点: - 数据来源:例如,文件系统(如 HDFS)、数据库、流式数据源(如 Kafka)等。 - 数据类型:结构化数据(如 CSV、JSON)、半结构化数据(如 XML)、非结构化数据(如文本、图片)。 - 数据格式:确定数据的存储格式(如 Parquet、Avro、ORC)。 - 数据量:评估数据量的大小以选择合适的采集方式[^3]。 #### 2. 配置 Spark 环境 在开始数据采集之前,需要确保 Spark 环境已经正确配置。可以通过修改 `spark-env.sh` 文件来设置必要的环境变量,例如 Hadoop 和 Java 的路径。以下是一个典型的配置示例: ```bash export SPARK_DIST_CLASSPATH=$(/home/spark000/servers/wfb-hadoop/bin/hadoop classpath) export HADOOP_HOME=~/servers/wfb-hadoop export HADOOP_CONF_DIR=~/servers/wfb-hadoop/etc/hadoop export JAVA_HOME=~/servers/jdk ``` 这些配置确保 Spark 能够与 Hadoop 集成,访问 HDFS 中的数据[^4]。 #### 3. 使用 Spark 读取不同数据源 Spark 提供了多种 API 来读取不同类型的文件和数据源。以下是一些常见的数据采集场景及其代码示例。 ##### 3.1 从文件系统读取数据 可以从本地文件系统或 HDFS 中读取数据。例如,读取一个 CSV 文件: ```python from pyspark.sql import SparkSession # 创建 SparkSession spark = SparkSession.builder.appName("DataCollection").getOrCreate() # 读取 CSV 文件 df = spark.read.csv("/path/to/data.csv", header=True, inferSchema=True) # 显示数据框内容 df.show() ``` ##### 3.2 从数据库读取数据 可以通过 JDBC 连接数据库读取数据。例如,连接 MySQL 数据库: ```python jdbc_url = "jdbc:mysql://localhost:3306/database_name" properties = { "user": "username", "password": "password", "driver": "com.mysql.cj.jdbc.Driver" } # 读取数据库表 df = spark.read.jdbc(url=jdbc_url, table="table_name", properties=properties) df.show() ``` ##### 3.3 从 Kafka 流式数据源读取数据 如果需要采集实时数据,可以使用 Spark Streaming 或 Structured Streaming 从 Kafka 中读取数据。以下是一个简单的 Kafka 数据采集示例: ```python # 读取 Kafka 数据 kafka_df = spark.readStream.format("kafka") \ .option("kafka.bootstrap.servers", "localhost:9092") \ .option("subscribe", "topic_name") \ .load() # 将 Kafka 数据转换为字符串格式 value_df = kafka_df.selectExpr("CAST(value AS STRING)") # 启动流式查询 query = value_df.writeStream.outputMode("append").format("console").start() query.awaitTermination() ``` 上述代码展示了如何从 Kafka 主题中读取数据将其打印到控制台[^2]。 #### 4. 数据清洗与预处理 在完成数据采集后,通常需要对数据进行清洗和预处理,以确保数据的质量。常见的操作包括去重、缺失值填充、格式转换等。例如,删除重复记录: ```python # 去重 cleaned_df = df.dropDuplicates() cleaned_df.show() ``` #### 5. 存储采集到的数据 最后,将采集到的数据存储到适当的存储系统中,以便后续分析。例如,将数据保存为 Parquet 格式: ```python # 保存为 Parquet 文件 cleaned_df.write.parquet("/path/to/output") ``` Parquet 是一种列式存储格式,适合大规模数据分析[^3]。 --- ### 性能优化建议 为了提高 Spark 作业的性能,可以考虑以下几点: - 调整分区数以优化行度。 - 使用广播变量减少 Shuffle 操作。 - 启用数据缓存以避免重复计算[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值