使用spark-streaming-kafka-0-10_2.11-2.0.0依赖包创建kafka输入流

本文介绍如何使用Apache Spark Streaming从Kafka中消费数据,并演示了如何配置Spark Streaming与Kafka进行集成,包括设置Kafka参数、定义主题订阅策略及偏移量的同步与提交。

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

object DirectStream {

 

  def main(args: Array[String]): Unit = {

 

    //创建SparkConf,如果将任务提交到集群中,那么要去掉.setMaster("local[2]")

    val conf = new SparkConf().setAppName("DirectStream").setMaster("local[2]")

    //创建一个StreamingContext,其里面包含了一个SparkContext

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

 

    //配置kafka的参数

    val kafkaParams = Map[String, Object](

      "bootstrap.servers" -> "node-1.xiaoniu.com:9092,node-2.xiaoniu.com:9092,node-3.xiaoniu.com:9092",

      "key.deserializer" -> classOf[StringDeserializer],

      "value.deserializer" -> classOf[StringDeserializer],

      "group.id" -> "test123",

      "auto.offset.reset" -> "earliest", // lastest

      "enable.auto.commit" -> (false: java.lang.Boolean)

    )

 

    val topics = Array("xiaoniu")

    //在Kafka中记录读取偏移量

    val stream = KafkaUtils.createDirectStream[String, String](

      streamingContext,

      //位置策略(可用的Executor上均匀分配分区)

      LocationStrategies.PreferConsistent,

      //消费策略(订阅固定的主题集合)

      ConsumerStrategies.Subscribe[String, String](topics, kafkaParams)

    )

 

    //迭代DStream中的RDD(KafkaRDD),将每一个时间点对于的RDD拿出来

    stream.foreachRDD { rdd =>

      //获取该RDD对于的偏移量

      val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges

      //拿出对应的数据

      rdd.foreach{ line =>

        println(line.key() + " " + line.value())

      }

      //异步更新偏移量到kafka中

      // some time later, after outputs have completed

      stream.asInstanceOf[CanCommitOffsets].commitAsync(offsetRanges)

    }

    streamingContext.start()

    streamingContext.awaitTermination()

  }

}

项目依赖

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile (group: 'org.apache.spark', name: 'spark-core_2.10', version:'2.1.0')
    compile (group: 'org.apache.spark', name: 'spark-streaming_2.10', version:'2.1.0')
    compile group: 'org.apache.spark', name: 'spark-streaming-kafka-0-10_2.10', version: '2.2.0'
}

详见官网:

http://spark.apache.org/docs/latest/streaming-kafka-0-10-integration.html#storing-offsets

要运行 Flink 示例程序 `WordCount.jar` 并测试其流处理功能,需使用 Flink 的流处理 API(DataStream API),并确保程序运行在支持流处理的环境中。以下是实现步骤和注意事项: ### 环境准备 1. **启动 Flink 集群** 如果尚未启动 Flink 集群,可以使用以下命令启动本地集群: ```bash ./bin/start-cluster.sh ``` 这将启动一个 JobManager 和一个 TaskManager,适合本地测试使用2. **准备输入数据源** 流处理通常依赖于实时数据源,例如通过 `nc`(NetCat)发送的数据。启动一个监听端口的 NetCat 服务: ```bash nc -l 9009 ``` 这将等待用户输入数据,并将其作为流式输入发送到 Flink 程序。 ### 运行流处理 WordCount 示例 Flink 提供了 `SocketWindowWordCount` 示例程序,用于演示如何通过流处理 API 统计单词出现的次数。运行该程序的命令如下: ```bash ./bin/flink run -c com.flink.example.SocketWindowWordCount ./examples/streaming/SocketWindowWordCount.jar --port 9009 ``` 其中 `-c` 指定主类名,`--port` 表示连接的端口号。程序会从指定端口读取数据流,并进行窗口统计。 ### 示例程序代码 以下是一个简化版的 `SocketWindowWordCount` 示例代码,展示了如何通过 DataStream API 实现流式 WordCount: ```java public class SocketWindowWordCount { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<String> text = env.socketTextStream("localhost", 9009); DataStream<WordWithCount> windowCounts = text .flatMap((String value, Collector<WordWithCount> out) -> { for (String word : value.split("\\s")) { out.collect(new WordWithCount(word, 1)); } }) .keyBy("word") .timeWindow(Time.seconds(5)) .sum("count"); windowCounts.print().setParallelism(1); env.execute("Socket Window WordCount"); } public static class WordWithCount { public String word; public long count; public WordWithCount() {} public WordWithCount(String word, long count) { this.word = word; this.count = count; } @Override public String toString() { return word + " : " + count; } } } ``` 该代码通过 `socketTextStream` 方法从指定端口读取数据流,然后使用 `flatMap` 将文本拆分为单词流,再通过 `keyBy` 和 `timeWindow` 进行窗口统计,并最终输出单词计数结果[^4]。 ### 提交任务到 Flink 集群 在 Flink 集群启动后,可以通过 Web UI 或命令行提交任务。命令行方式如下: ```bash ./bin/flink run -m localhost:8081 -c com.flink.example.SocketWindowWordCount ./examples/streaming/SocketWindowWordCount.jar --port 9009 ``` 其中 `-m` 指定 Flink 集群的 JobManager 地址,`-c` 指定主类名,`--port` 为数据源端口号。 ### 测试流处理功能 1. **发送测试数据** 在启动 NetCat 后,手动输入一些文本,例如: ``` hello world flink stream processing hello flink ``` 程序将根据设定的窗口大小(如 5 秒)输出单词计数结果。 2. **查看执行结果** Flink 程序的输出将显示在控制台,例如: ``` hello : 2 world : 1 flink : 2 stream : 1 processing : 1 ``` 这表明程序成功统计了窗口内的单词出现次数。 ### 注意事项 - **端口冲突**:确保使用的端口(如 9009)未被其他程序占用。 - **Flink 集群状态**:确保 Flink 集群正常运行,可以通过 Web UI(默认地址为 `http://localhost:8081`)查看任务状态。 - **依赖库**:如果程序依赖外部库(如 Kafka 连接器),需确保这些库已正确添加到 Flink 的 `lib` 目录或通过命令行指定。 通过以上步骤,可以成功运行 Flink 的流处理示例程序,并验证其功能。如果遇到连接问题或任务失败,可检查日志文件(位于 Flink 的 `log` 目录)以获取详细信息[^4]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值