【问题标题】:How to get use data that coming from Kafka using Spark如何使用 Spark 获取来自 Kafka 的使用数据
【发布时间】:2017-03-28 22:43:23
【问题描述】:

我编写了以下代码来使用 Spark Job 使用数据,

检索后是否缺少流式 kafka 或处理数据的内容?如何测试数据是否被检索?

// StreamingExamples.setStreamingLogLevels();
        SparkConf sparkConf = new SparkConf().setAppName("JavaKafkaWordCount").setMaster("local[*]");
        ;
        // Create the context with 2 seconds batch size
        JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, new Duration(1000));

        Map<String, Integer> topicMap = new HashMap<>();
        topicMap.put("Ptopic", 1);

        JavaPairReceiverInputDStream<String, String> messages = KafkaUtils.createStream(jssc, "localhost:2181", "5",
                topicMap);

        /*messages.foreach(new Function<JavaRDD<String, String>, Void>() {
            public Void call(JavaRDD<String, String> accessLogs) {
                  return null;
                }}
              );*/

        JavaDStream<String> lines = messages.map(new Function<Tuple2<String, String>, String>() {
            @Override
            public String call(Tuple2<String, String> tuple2) {
                /*System.out.println(tuple2._1().toString());
                System.out.println(tuple2._2().toString());*/
                return tuple2._2();
            }
        });

        lines.print();
        jssc.start();
        jssc.awaitTermination();

这里的结果只是打印..

【问题讨论】:

  • 你检查过这个:spark.apache.org/docs/1.6.1/streaming-kafka-integration.html 吗?也许首先通过终端创建一个 kafka 生产者和消费者是一个好主意。如果可行,您应该开始尝试集成 spark。
  • 是的。我试过了。在这段代码中,我可以在“lines”变量中得到结果,但是现在如何使用 forEachRDD 获取检索字符串?这样我就可以对这个字符串执行一些操作
  • 你可以使用后面的数据库来下沉你的 RDD。如图所示:spark.apache.org/docs/latest/img/streaming-arch.png之后就可以加载数据并进行一些操作了
  • 我有两种需求,有时需要与数据库同步,有时需要存储到另一个 kafka 队列中

标签: java apache-spark apache-kafka distributed-computing


【解决方案1】:

您可以使用基本的大数据功能,如 map、reduce、flatmap 等。

更新 1:

    JavaDStream<String> lines = messages.map(new Function<Tuple2<String, String>, String>() {
        @Override
        public String call(Tuple2<String, String> tuple2) {
            /*System.out.println(tuple2._1().toString());
            System.out.println(tuple2._2().toString());*/
            return tuple2._2();
        }
    });

    // TODO: make some transformation here:
    lines = lines.map(x -> { // clean data
        String callType = x.getCallType().replaceAll("\"", "").replaceAll("[-|,]", ""); // here some operations
        x.setCallType(callType);
        return x;
    }).filter(pair -> { // filter data
        return !isFilteredOnFire || pair.getCallType().matches("(?i).*\\bFire\\b.*"); // here so filters
    });

    lines.print();
    jssc.start();
    jssc.awaitTermination(); 

完整的例子在this blog post中描述

【讨论】:

  • 代码在问题中可用,对于“行”变量,此代码将如何工作以及我可以从哪里将数据发送到 kafka?
  • 基本上你想要一种将火花流下沉到kafka的方法,对吧?
猜你喜欢
  • 2019-01-23
  • 1970-01-01
  • 2016-05-27
  • 2019-04-23
  • 1970-01-01
  • 2017-10-24
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多