史上最简单的spark教程第二十一章-Spark实时处理kafka消息实现wordCount案例

7 篇文章 0 订阅

[提前声明]
文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章
写作不易,转载请注明,谢谢!
代码案例地址: ?https://github.com/Mydreamandreality/sparkResearch


数据输入源

  • 之前已经了解如何把处理完的数据写入到MySQL,ES,Redis等等,那我们现在该搞一下不同数据源是如何和sparkStreaming完美融合的
  • 哦,大胸弟们,在第十七章-快速开发部署第一个sparkStreaming+Java流处理程序这个里面我们已经使用过一个外部源,是服务器端口发送数据的方式

streaming整合kafka案例

代码案例:

spark是默认支持很多的一些数据源,一些不支持的
比如kafka,这种就需要我们额外引用maven

        <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming-kafka -->
       <dependency>
           <groupId>org.apache.spark</groupId>
           <artifactId>spark-streaming-kafka_2.11</artifactId>
           <version>1.6.2</version>
       </dependency>
       

业务代码

使用内置的KafkaUtils.createStream即可获取指定主题的消息,
如有多个主题,可用逗号进行分割

package v1;


import lombok.extern.slf4j.Slf4j;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaPairDStream;
import org.apache.spark.streaming.api.java.JavaPairInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import org.apache.spark.streaming.kafka.KafkaUtils;
import scala.Tuple2;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * Created by 張燿峰
 * sparkStreaming消费kafka消息,实现wordCount
 *
 * @author 孤
 * @date 2019/4/28
 * @Varsion 1.0
 */
@Slf4j
public class KafkaStreaming {

    /**
     * 数据分割的规则
     */
    private static final Pattern SPACE = Pattern.compile(" ");

    /**
     * kafka地址和端口
     */
    private static final String HOST = "192.168.253.132:9092";

    /**
     * 分组ID
     */
    private static final String GROP = "test-consumer-group";

    /**
     * 主题ID
     */
    private static final String TOPIC = "JavaKafka";

    /**
     * 分片
     */
    private static final Integer THREAD = 1;

    public static void main(String[] args) {
        SparkConf sparkConf = new SparkConf().setAppName("KafkaWordCount").setMaster("local[2]");
        JavaStreamingContext streamingContext = new JavaStreamingContext(sparkConf, Durations.seconds(10000));
        //设置检查点
        streamingContext.checkpoint("HDFS URL");
        Map<String, Integer> topicThread = new HashMap<>(1);
        topicThread.put(TOPIC, THREAD);
        JavaPairInputDStream<String, String> dStream = KafkaUtils.createStream(streamingContext, HOST, GROP, topicThread);

        JavaDStream<String> words = dStream.flatMap(new FlatMapFunction<Tuple2<String, String>, String>() {
            @Override
            public Iterator<String> call(Tuple2<String, String> stringStringTuple2) {
                return Arrays.asList(SPACE.split(stringStringTuple2._2)).iterator();
            }
        });

        //统计
        JavaPairDStream<String, Integer> result = words.mapToPair(new PairFunction<String, String, Integer>() {
            @Override
            public Tuple2<String, Integer> call(String s) {
                return new Tuple2<>(s, 1);
            }
        }).reduceByKey(new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer v1, Integer v2) {
                return v1 + v2;
            }
        });

        try {
            result.print();
            streamingContext.start();
            streamingContext.awaitTermination();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

案例总结

Apache Kafka因其速度与弹性成为了一个流行的输入源,[kafka的具体教程可以看之前的博客]
在工程中需要引入 Maven 工件 sparkstreaming-kafka来使用
包内提供的 KafkaUtils对象可以在 StreamingContext 和 JavaStreamingContext 中以你的 Kafka 消息创建出 DStream
由于 KafkaUtils 可以订阅多 个主题,因此它创建出的 DStream 由成对的主题和消息组成
要创建出一个流数据,需要使用JavaStreamingContext,zookeeper主机列表[集群列表使用逗号分隔],分组ID[唯一的],以及一组主题ID和接收器线程数组成的map集合


sparkStreaming支持的数据源还有很多,
目前kafka是我们业务中较为常用的一种,其他的数据源可以参考官方的文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值