基于Java+SparkStreaming整合kafka编程

一、下载依赖jar包

具体可以参考:SparkStreaming整合kafka编程

二、创建Java工程

太简单,略。

三、实际例子

spark的安装包里面有好多例子,具体路径:spark-2.1.1-bin-hadoop2.7\examples。

JavaDirectKafkaWordCount.java

 
  1. package com.spark.test;
  2.  
  3. import java.util.HashMap;
  4. import java.util.HashSet;
  5. import java.util.Arrays;
  6. import java.util.Iterator;
  7. import java.util.Map;
  8. import java.util.Set;
  9. import java.util.regex.Pattern;
  10.  
  11. import scala.Tuple2;
  12.  
  13. import kafka.serializer.StringDecoder;
  14.  
  15. import org.apache.spark.SparkConf;
  16. import org.apache.spark.api.java.function.*;
  17. import org.apache.spark.streaming.api.java.*;
  18. import org.apache.spark.streaming.kafka.KafkaUtils;
  19. import org.apache.spark.streaming.Durations;
  20.  
  21. public class JavaDirectKafkaWordCount {
  22.  
  23. public static void main(String[] args) throws Exception {
  24. //String brokers = args[0];
  25.    // String topics = args[1];
  26.  
  27.     // Create context with a 2 seconds batch interval
  28. /**
  29.  * setMaster("local[2]"),至少要指定两个线程,一条用于用于接收消息,一条线程用于处理消息
  30.  */
  31.     SparkConf sparkConf = new SparkConf().setAppName("JavaDirectKafkaWordCount").setMaster("local[2]");
  32.     JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, Durations.seconds(2));
  33.  
  34.     Set<String> topicsSet = new HashSet<>(Arrays.asList("test"));
  35.     Map<String, String> kafkaParams = new HashMap<>();
  36.     kafkaParams.put("metadata.broker.list", "192.168.168.200:9092");
  37.  
  38.     // Create direct kafka stream with brokers and topics
  39.     JavaPairInputDStream<String, String> messages = KafkaUtils.createDirectStream(
  40.         jssc,
  41.         String.class,
  42.         String.class,
  43.         StringDecoder.class,
  44.         StringDecoder.class,
  45.         kafkaParams,
  46.         topicsSet
  47.     );
  48.  
  49.     // Get the lines, split them into words, count the words and print
  50.     JavaDStream<String> lines = messages.map(new Function<Tuple2<String, String>, String>() {
  51.       @Override
  52.       public String call(Tuple2<String, String> tuple2) {
  53.         return tuple2._2();
  54.       }
  55.     });
  56.     JavaDStream<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
  57.       @Override
  58.       public Iterator<String> call(String line) {
  59.         return Arrays.asList(line.split(" ")).iterator();
  60.       }
  61.     });
  62.     JavaPairDStream<String, Integer> wordCounts = words.mapToPair(
  63.       new PairFunction<String, String, Integer>() {
  64.         @Override
  65.         public Tuple2<String, Integer> call(String s) {
  66.           return new Tuple2<>(s, 1);
  67.         }
  68.       }).reduceByKey(
  69.         new Function2<Integer, Integer, Integer>() {
  70.         @Override
  71.         public Integer call(Integer i1, Integer i2) {
  72.           return i1 + i2;
  73.         }
  74.       });
  75.     wordCounts.print();
  76.  
  77.     // Start the computation
  78.     jssc.start();
  79.     jssc.awaitTermination();
  80. }
  81.  
  82. }

JavaKafkaWordCount.java

 

 
  1. package com.spark.test;
  2.  
  3. import java.util.Arrays;
  4. import java.util.Iterator;
  5. import java.util.Map;
  6. import java.util.HashMap;
  7. import java.util.regex.Pattern;
  8.  
  9. import scala.Tuple2;
  10.  
  11. import org.apache.spark.SparkConf;
  12. import org.apache.spark.api.java.function.FlatMapFunction;
  13. import org.apache.spark.api.java.function.Function;
  14. import org.apache.spark.api.java.function.Function2;
  15. import org.apache.spark.api.java.function.PairFunction;
  16. import org.apache.spark.streaming.Duration;
  17. import org.apache.spark.streaming.api.java.JavaDStream;
  18. import org.apache.spark.streaming.api.java.JavaPairDStream;
  19. import org.apache.spark.streaming.api.java.JavaPairReceiverInputDStream;
  20. import org.apache.spark.streaming.api.java.JavaStreamingContext;
  21. import org.apache.spark.streaming.kafka.KafkaUtils;
  22.  
  23. public class JavaKafkaWordCount{
  24.  
  25. public static void main(String[] args) throws InterruptedException {
  26. SparkConf sparkConf = new SparkConf().setAppName("JavaKafkaWordCount").setMaster("local[2]");
  27. // Create the context with 2 seconds batch size
  28. JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, new Duration(2000));
  29.  
  30. int numThreads = Integer.parseInt("2");
  31. Map<String, Integer> topicMap = new HashMap<>();
  32. String[] topics = "test".split(",");
  33. for (String topic: topics) {
  34. topicMap.put(topic, numThreads);
  35. }
  36.  
  37. JavaPairReceiverInputDStream<String, String> messages =
  38. KafkaUtils.createStream(jssc, "192.168.168.200:2181", "test-group", topicMap);
  39.  
  40. JavaDStream<String> lines = messages.map(new Function<Tuple2<String, String>, String>() {
  41. @Override
  42. public String call(Tuple2<String, String> tuple2) {
  43. return tuple2._2();
  44. }
  45. });
  46.  
  47. JavaDStream<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
  48. @Override
  49. public Iterator<String> call(String line) {
  50. return Arrays.asList(line.split(" ")).iterator();
  51. }
  52. });
  53.  
  54. JavaPairDStream<String, Integer> wordCounts = words.mapToPair(
  55. new PairFunction<String, String, Integer>() {
  56. @Override
  57. public Tuple2<String, Integer> call(String s) {
  58. return new Tuple2<>(s, 1);
  59. }
  60. }).reduceByKey(new Function2<Integer, Integer, Integer>() {
  61. @Override
  62. public Integer call(Integer i1, Integer i2) {
  63. return i1 + i2;
  64. }
  65. });
  66.  
  67. wordCounts.print();
  68. jssc.start();
  69. jssc.awaitTermination();
  70. }
  71.  
  72. }

 

JavaLocalWordCount.java

 

 
  1. package com.spark.test;
  2.  
  3. import java.util.Arrays;
  4. import java.util.Iterator;
  5.  
  6. import org.apache.spark.SparkConf;
  7. import org.apache.spark.api.java.JavaPairRDD;
  8. import org.apache.spark.api.java.JavaRDD;
  9. import org.apache.spark.api.java.JavaSparkContext;
  10. import org.apache.spark.api.java.function.FlatMapFunction;
  11. import org.apache.spark.api.java.function.Function2;
  12. import org.apache.spark.api.java.function.PairFunction;
  13. import org.apache.spark.api.java.function.VoidFunction;
  14.  
  15. import scala.Tuple2;
  16.  
  17. public class JavaLocalWordCount {
  18.  
  19. public static void main(String[] args) {
  20. /**
  21. * 第一步,创建Spark的配置对象SparkConf,设置Spark程序的运行时的配置信息,
  22. * 例如说通过setMaster来设置程序要链接的Spark集群的Master的URL,
  23. * 如果设置为local,则代表Spark程序在本地运行,特别适合于机器配置较差的情况
  24. */
  25. SparkConf sparkConf = new SparkConf().setAppName("LocalWordCountByJava").setMaster("local");
  26. /**
  27. * 第二步,创建SparkContext对象
  28. * SparkContext是Spark程序所有功能的唯一入口,无论是采用Scala,java,python,R等都
  29. * 必须有一个SparkContext(不同语言具体类名称不同,如果是Java的话,则为JavaSparkContext)
  30. * 同时还会负责Spark程序在Master注册程序等
  31. * SparkContext是整个Spark应用程序至关重要的一个对象
  32. */
  33. JavaSparkContext jsc = new JavaSparkContext(sparkConf);//其底层实际上是Scala的SparkContext
  34. /**
  35. * 第三步,根据具体的数据来源(HDFS,HBase,Local,FS,DB,S3等),通过JavaSparkContext来创建JavaRDD
  36. * JavaRDD的创建方式有三种:根据外部数据来源(例如HDFS),
  37. * 根据Scala集合,由其他的RDD操作数据会将RDD划分成一系列Partition,
  38. * 分配到每个Partition的数据属于一个Task处理范畴
  39. */
  40. JavaRDD<String> lines = jsc.textFile("words.txt");
  41.  
  42. //如果是Scala,由于SAM转化,所以可以写成val words=lines.flatMap{line =>line.split(" ")}
  43. JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
  44. @Override
  45. public Iterator<String> call(String line) {
  46. return Arrays.asList(line.split(" ")).iterator();
  47. }
  48. });
  49.  
  50. /**
  51. * 第4步:对初始的JavaRDD进行Transformation级别的处理,例如map,filter等高阶函数等的编程,来进行具体的数据计算
  52. * 第4.1步:在单词拆分的基础上对每个单词实例进行计数为1,也就是word =>(word,1)
  53. */
  54. JavaPairRDD<String, Integer> pairs = words.mapToPair(new PairFunction<String, String, Integer>() {
  55. public Tuple2<String, Integer> call(String word) throws Exception{
  56. return new Tuple2<String, Integer>(word, 1);
  57. }
  58. });
  59. /**
  60. * 统计总次数
  61. */
  62. JavaPairRDD<String,Integer> wordCount=pairs.reduceByKey(new Function2<Integer,Integer,Integer>()
  63. {
  64. public Integer call(Integer v1,Integer v2)throws Exception
  65. {
  66. return v1+v2;
  67.  
  68. }
  69. });
  70.  
  71. wordCount.foreach(new VoidFunction<Tuple2<String,Integer>>(){
  72. public void call(Tuple2<String,Integer> pairs) throws Exception {
  73. System.out.println(pairs._1()+":"+pairs._2());
  74. }
  75. });
  76.  
  77. jsc.close();
  78. }
  79.  
  80. }

 

JavaClusterWordCount.java

 

 
  1. package com.spark.test;
  2.  
  3. import java.util.Arrays;
  4. import java.util.Iterator;
  5.  
  6. import org.apache.spark.SparkConf;
  7. import org.apache.spark.api.java.JavaPairRDD;
  8. import org.apache.spark.api.java.JavaRDD;
  9. import org.apache.spark.api.java.JavaSparkContext;
  10. import org.apache.spark.api.java.function.FlatMapFunction;
  11. import org.apache.spark.api.java.function.Function2;
  12. import org.apache.spark.api.java.function.PairFunction;
  13. import org.apache.spark.api.java.function.VoidFunction;
  14.  
  15. import scala.Tuple2;
  16.  
  17. public class JavaClusterWordCount {
  18.  
  19. public static void main(String[] args) {
  20. /**
  21. * 第一步,创建Spark的配置对象SparkConf,设置Spark程序的运行时的配置信息,
  22. * 例如说通过setMaster来设置程序要链接的Spark集群的Master的URL,
  23. * 如果设置为local,则代表Spark程序在本地运行,特别适合于机器配置较差的情况
  24. */
  25. SparkConf sparkConf = new SparkConf().setAppName("LocalWordCountByJava").setMaster("local");
  26. /**
  27. * 第二步,创建SparkContext对象
  28. * SparkContext是Spark程序所有功能的唯一入口,无论是采用Scala,java,python,R等都
  29. * 必须有一个SparkContext(不同语言具体类名称不同,如果是Java的话,则为JavaSparkContext)
  30. * 同时还会负责Spark程序在Master注册程序等
  31. * SparkContext是整个Spark应用程序至关重要的一个对象
  32. */
  33. JavaSparkContext jsc = new JavaSparkContext(sparkConf);//其底层实际上是Scala的SparkContext
  34. /**
  35. * 第三步,根据具体的数据来源(HDFS,HBase,Local,FS,DB,S3等),通过JavaSparkContext来创建JavaRDD
  36. * JavaRDD的创建方式有三种:根据外部数据来源(例如HDFS),
  37. * 根据Scala集合,由其他的RDD操作数据会将RDD划分成一系列Partition,
  38. * 分配到每个Partition的数据属于一个Task处理范畴
  39. */
  40. JavaRDD<String> lines = jsc.textFile("hdfs://192.168.168.200:9000/input/words.txt");
  41.  
  42. //如果是Scala,由于SAM转化,所以可以写成val words=lines.flatMap{line =>line.split(" ")}
  43. JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
  44. @Override
  45. public Iterator<String> call(String line) {
  46. return Arrays.asList(line.split(" ")).iterator();
  47. }
  48. });
  49.  
  50. /**
  51. * 第4步:对初始的JavaRDD进行Transformation级别的处理,例如map,filter等高阶函数等的编程,来进行具体的数据计算
  52. * 第4.1步:在单词拆分的基础上对每个单词实例进行计数为1,也就是word =>(word,1)
  53. */
  54. JavaPairRDD<String, Integer> pairs = words.mapToPair(new PairFunction<String, String, Integer>() {
  55. public Tuple2<String, Integer> call(String word) throws Exception{
  56. return new Tuple2<String, Integer>(word, 1);
  57. }
  58. });
  59. /**
  60. * 统计总次数
  61. */
  62. JavaPairRDD<String,Integer> wordCount=pairs.reduceByKey(new Function2<Integer,Integer,Integer>()
  63. {
  64. public Integer call(Integer v1,Integer v2)throws Exception
  65. {
  66. return v1+v2;
  67.  
  68. }
  69. });
  70.  
  71. wordCount.foreach(new VoidFunction<Tuple2<String,Integer>>(){
  72. public void call(Tuple2<String,Integer> pairs) throws Exception {
  73. System.out.println(pairs._1()+":"+pairs._2());
  74. }
  75. });
  76.  
  77. jsc.close();
  78. }
  79.  
  80. }

 

转载于:https://my.oschina.net/u/3616609/blog/1475132

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大数据实时计算系统是如今互联网行业中非常重要的一个领域,本篇文章将介绍一个基于JavaKafkaSpark Streaming大数据实时计算系统,该系统能够实时地处理海量的数据,并且对数据进行实时分析和处理,从而为用户提供有价值的数据分析和预测服务。 一、系统架构设计 系统的整体架构如下图所示: ![系统架构设计图](https://img-blog.csdnimg.cn/20220105104312759.png) 从上图可以看出,整个系统分为四个主要模块: 1. 数据采集模块:该模块负责采集用户的行为数据,并将数据发送到Kafka消息队列中。 2. 数据处理模块:该模块负责从Kafka消息队列中读取数据,并对数据进行实时处理和分析,从而生成有价值的数据。 3. 数据存储模块:该模块负责将处理后的数据存储到HDFS分布式文件系统中,以便后续进行离线分析和处理。 4. 数据展示模块:该模块负责将处理后的数据展示给用户,提供数据分析和预测服务。 二、系统模块详细设计 1. 数据采集模块 数据采集模块主要负责采集用户的行为数据,并将数据发送到Kafka消息队列中。采集模块使用Java编写,主要包括以下几个模块: - 数据采集模块:负责采集用户的行为数据,并将数据发送到Kafka消息队列中。 - 数据发送模块:负责将采集到的数据发送到Kafka消息队列中。 - 配置文件模块:负责读取系统配置文件,包括Kafka消息队列的配置信息等。 2. 数据处理模块 数据处理模块主要负责从Kafka消息队列中读取数据,并对数据进行实时处理和分析,从而生成有价值的数据。数据处理模块使用Spark Streaming框架编写,主要包括以下几个模块: - 数据读取模块:负责从Kafka消息队列中读取数据,并转化为Spark Streaming中的DStream数据结构。 - 数据处理模块:负责对DStream数据进行实时处理和分析,从而生成有价值的数据。 - 数据输出模块:负责将处理后的数据输出到HDFS分布式文件系统中。 - 配置文件模块:负责读取系统配置文件,包括Kafka消息队列的配置信息、Spark Streaming框架的配置信息等。 3. 数据存储模块 数据存储模块主要负责将处理后的数据存储到HDFS分布式文件系统中,以便后续进行离线分析和处理。数据存储模块使用Hadoop HDFS编写,主要包括以下几个模块: - 数据写入模块:负责将处理后的数据写入到HDFS分布式文件系统中。 - 数据读取模块:负责从HDFS分布式文件系统中读取数据进行离线分析和处理。 - 配置文件模块:负责读取系统配置文件,包括HDFS的配置信息等。 4. 数据展示模块 数据展示模块主要负责将处理后的数据展示给用户,提供数据分析和预测服务。数据展示模块使用Web开发技术编写,主要包括以下几个模块: - 数据展示模块:负责将处理后的数据展示给用户,提供数据分析和预测服务。 - 数据查询模块:负责从HDFS分布式文件系统中查询数据进行展示。 - 配置文件模块:负责读取系统配置文件,包括Web服务的配置信息等。 三、系统运行流程 1. 数据采集模块从用户端采集数据,并将数据发送到Kafka消息队列中。 2. 数据处理模块从Kafka消息队列中读取数据,并进行实时处理和分析。 3. 数据处理模块将处理后的数据输出到HDFS分布式文件系统中。 4. 数据展示模块从HDFS分布式文件系统中读取数据进行展示,提供数据分析和预测服务。 四、系统优化 为了提高系统的性能和稳定性,我们可以采取以下几个优化措施: 1. 数据处理模块使用Spark Streaming框架,能够实现高效的实时数据处理和分析。 2. 数据存储模块使用Hadoop HDFS分布式文件系统,具有高可靠性和高扩展性。 3. 数据展示模块可以采用分布式Web服务架构,提高系统的并发处理能力。 4. 系统的各个模块之间采用异步通信机制,能够提高系统的并发性和响应速度。 五、总结 本文简要介绍了一个基于JavaKafkaSpark Streaming大数据实时计算系统,该系统能够实时地处理海量的数据,并且对数据进行实时分析和处理,从而为用户提供有价值的数据分析和预测服务。通过优化系统架构和技术选型,能够提高系统的性能和稳定性,为用户提供更好的服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值