Spark Streaming和Flink的Word Count对比

博客介绍了通过netcat构造流输入,创建Spark DStream和Flink DataSream进行处理。对比了Spark和Flink,二者都运行在Hadoop YARN上,性能上Flink最优,迭代次数越多越明显。在流式计算、SQL支持等方面,二者各有优劣,Spark在sql方面有优势,Flink在流式和迭代计算支持力度将增强。

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

准备:

nccat for windows/linux 都可以 通过 TCP 套接字连接,从流数据中创建了一个 Spark DStream/ Flink DataSream, 然后进行处理, 时间窗口大小为10s 
因为 示例需要, 所以 需要下载一个netcat, 来构造流的输入。

代码:

spark streaming

  1. package cn.kee.spark;
  2. public final class JavaNetworkWordCount {
  3. private static final Pattern SPACE = Pattern.compile(” “);
  4. public static void main(String[] args) throws Exception {
  5. if (args.length < 2) {
  6. System.err.println(“Usage: JavaNetworkWordCount <hostname> <port>”);
  7. System.exit(1);
  8. }
  9. StreamingExamples.setStreamingLogLevels();
  10. SparkConf sparkConf = new SparkConf().setAppName(“JavaNetworkWordCount”);
  11. JavaStreamingContext ssc = new JavaStreamingContext(sparkConf, Durations.seconds(1));
  12. JavaReceiverInputDStream<String> lines = ssc.socketTextStream(
  13. args[0], Integer.parseInt(args[1]), StorageLevels.MEMORY_AND_DISK_SER);
  14. JavaDStream<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
  15. @Override
  16. public Iterator<String> call(String x) {
  17. return Arrays.asList(SPACE.split(x)).iterator();
  18. }
  19. });
  20. JavaPairDStream<String, Integer> wordCounts = words.mapToPair(
  21. new PairFunction<String, String, Integer>() {
  22. @Override
  23. public Tuple2<String, Integer> call(String s) {
  24. return new Tuple2<>(s, 1);
  25. }
  26. }).reduceByKey(new Function2<Integer, Integer, Integer>() {
  27. @Override
  28. public Integer call(Integer i1, Integer i2) {
  29. return i1 + i2;
  30. }
  31. });
  32. wordCounts.print();
  33. ssc.start();
  34. ssc.awaitTermination();
  35. }
  36. }




Flink DataSream


  1. package cn.kee.flink;
  2. import org.apache.flink.api.common.functions.FlatMapFunction;
  3. import org.apache.flink.api.common.functions.ReduceFunction;
  4. import org.apache.flink.api.java.utils.ParameterTool;
  5. import org.apache.flink.streaming.api.datastream.DataStream;
  6. import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
  7. import org.apache.flink.streaming.api.windowing.time.Time;
  8. import org.apache.flink.util.Collector;
  9. /**
  10. * Example :SocketWindowWordCount
  11. * @author keehang
  12. *
  13. */
  14. public class SocketWindowWordCount {
  15. public static void main(String[] args) throws Exception {
  16. // the port to connect to
  17. final int port = 9999;
  18. /*try {
  19. final ParameterTool params = ParameterTool.fromArgs(args);
  20. port = params.getInt("port");
  21. } catch (Exception e) {
  22. System.err.println("No port specified. Please run 'SocketWindowWordCount --port <port>'");
  23. return;
  24. }*/
  25. // get the execution environment
  26. final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
  27. // get input data by connecting to the socket
  28. DataStream<String> text = env.socketTextStream("localhost", port, "\n");
  29. // parse the data, group it, window it, and aggregate the counts
  30. DataStream<WordWithCount> windowCounts = text
  31. .flatMap(new FlatMapFunction<String, WordWithCount>() {
  32. @Override
  33. public void flatMap(String value, Collector<WordWithCount> out) {
  34. for (String word : value.split("\\s")) {
  35. out.collect(new WordWithCount(word, 1L));
  36. }
  37. }
  38. })
  39. .keyBy("word")
  40. .timeWindow(Time.seconds(5), Time.seconds(1))
  41. .reduce(new ReduceFunction<WordWithCount>() {
  42. @Override
  43. public WordWithCount reduce(WordWithCount a, WordWithCount b) {
  44. return new WordWithCount(a.word, a.count + b.count);
  45. }
  46. });
  47. // print the results with a single thread, rather than in parallel
  48. windowCounts.print().setParallelism(1);
  49. env.execute("Socket Window WordCount");
  50. }
  51. }


结果:





Spark是一种快速、通用的计算集群系统,Spark提出的最主要抽象概念是弹性分布式数据集(RDD),它是一个元素集合,划分到集群的各个节点上,可以被并行操作。用户也可以让Spark保留一个RDD在内存中,使其能在并行操作中被有效的重复使用。

Flink是可扩展的批处理和流式数据处理的数据处理平台,设计思想主要来源于Hadoop、MPP数据库、流式计算系统等,支持增量迭代计算。

总结:Spark和Flink全部都运行在Hadoop YARN上,性能为Flink > Spark > Hadoop(MR),迭代次数越多越明显,性能上,Flink优于Spark和Hadoop最主要的原因是Flink支持增量迭代,具有对迭代自动优化的功能

流式计算比较

它们都支持流式计算,Flink是一行一行处理,而Spark是基于数据片集合(RDD)进行小批量处理,所以Spark在流式处理方面,不可避免增加一些延时。Flink的流式计算跟Storm性能差不多,支持毫秒级计算,而Spark则只能支持秒级计算。

SQL支持

都支持,Spark对SQL的支持比Flink支持的范围要大一些,另外Spark支持对SQL的优化,而Flink支持主要是对API级的优化。


Spark 感觉2.x 后主要在spark sql 这里发展优势,快速Join操作,以及继续扩展sql支持。至于Flink,其对于流式计算和迭代计算支持力度将会更加增强。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值