[提前声明]
文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章
写作不易,转载请注明,谢谢!
代码案例地址: ?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是我们业务中较为常用的一种,其他的数据源可以参考官方的文档