【问题标题】:Apache Kafka + Spark Integration (REST API is needed?)Apache Kafka + Spark 集成(需要 REST API?)
【发布时间】:2017-11-27 01:01:01
【问题描述】:

遇到一些基本问题,希望有人能解决。

所以我想在我的应用程序中使用 Apache Kafka 和 Apache spark。我已经阅读了许多教程,并大致了解了它是什么以及它是如何工作的。

用例:

数据将从移动设备(多个设备,比如说 1000 个)以 40 秒的间隔生成,我需要处理该数据并将值添加到数据库中,然后这些值将反映在仪表板中。

我想做的是使用 Apache Streams 并从 android 本身发出一个 post 请求,然后这些数据将由 spark 应用程序处理,就是这样。

问题:

  • Apache Spark

我正在按照本教程启动并运行它。(我使用的是 JAVA,而不是 scala) 链接:https://www.santoshsrinivas.com/installing-apache-spark-on-ubuntu-16-04/

一切完成后,我执行 spark-shell 并启动。我还在服务器上安装了 zookeeper 和 kafka,并在后台启动了 Kafka,所以这不是问题。

当我运行http://161.xxx.xxx.xxx:4040/jobs/ 时,我得到了这个页面

在我浏览过的所有教程中,都有这样的页面:https://i.stack.imgur.com/gF1fN.png 但我不明白。是不是spark没有正确安装?

现在,当我想部署一个独立的 jar 来触发时,(使用此链接:http://data-scientist-in-training.blogspot.in/2015/03/apache-spark-cluster-deployment-part-1.html)可以运行它。 即使用命令:spark-submit --class SimpleApp.SimpleApp --master spark://http://161.xxx.xxx.xxx:7077 --name "try" /opt/spark/bin/try-0.0.1-SNAPSHOT.jar,我得到输出。

如果我想使用它,我是否需要每次都提交申请?

这是我的程序:

package SimpleApp;

/* SimpleApp.java */
import org.apache.spark.api.java.*;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.function.Function;

public class SimpleApp {
  public static void main(String[] args) {
    String logFile = "/opt/spark/README.md"; // Should be some file on your system
    SparkConf conf = new SparkConf().setAppName("Simple Application").setMaster("local[*]");
    JavaSparkContext sc = new JavaSparkContext(conf);
    //System.setProperty("hadoop.home.dir", "C:/winutil");
    sc.setLogLevel("ERROR"); // Don't want the INFO stuff
    JavaRDD<String> logData = sc.textFile(logFile).cache();

    long numAs = logData.filter(new Function<String, Boolean>() {
      public Boolean call(String s) { return s.contains("a"); }
    }).count();

    long numBs = logData.filter(new Function<String, Boolean>() {
      public Boolean call(String s) { return s.contains("b"); }
    }).count();

    System.out.println("Lines with a: " + numAs + ", lines with b: " + numBs);
    System.out.println("word count : "+logData.first());
    sc.stop();
  }
}
  • 现在如何将 Kafka 集成到其中?

  • 如何配置应用程序,使其每次都能执行 kafka收到消息了吗?

  • 此外,我是否需要制作一个 REST API,我需要通过它发送 kafka 的数据,即 REST api 将用作生产者? spark Java 框架之类的东西? http://sparkjava.com/

  • 如果是,瓶颈将再次发生在 REST api 级别,即如何 许多请求它可以处理或不能处理,因为我到处都读到 Kafka 的吞吐量非常高。

  • 最终的结构是否会像 SPARK JAVA -> KAFKA -> APACHE 火花?

  • 最后如何在本地设置开发结构 设备?我安装了 kafka/apache spark。我正在使用 Eclipse。

谢谢

【问题讨论】:

    标签: apache-spark apache-kafka


    【解决方案1】:

    嗯,

    您在理解 Spark 如何与 Kafka 配合使用时遇到了一些问题。

    首先让我们了解一些事情:

    1. Kafka 是一个低延迟和高吞吐量的流处理平台。这将使您能够非常快速地存储和读取大量数据。
    2. Spark 有两种处理方式,Spark Ba​​tch 和 Spark Streaming。您正在研究的是批处理,对于您的问题,我建议您查看 apache streaming。

    什么是流媒体?

    流式传输是一种实时或接近实时传输和转换数据的方式。不必创建需要每 10 分钟或每 10 秒调用一次的进程。您将开始工作,它将消耗源并在接收器中发布。

    Kafka 是一个被动平台,因此 Kafka 可以是流进程的源或汇。

    就你而言,我的建议是:

    1. 为您的 Kafka 创建一个流生产者,您将在 Web 服务器中读取您的移动应用程序的日志。因此,您需要在 Web 服务器上插入一些东西来开始使用数据。我给你的建议是Fluentd是一个非常强大的流式应用程序,它是在 Ruby 中但非常易于使用。如果您想要更强大且更专注于 BigData,我建议 Apache Nifi 这很难工作,这并不容易,但您可以创建数据流管道以将信息传输到集群。 Apache Flume 真的很简单,可以解决您的问题。
    2. 启动你的Kafka,你可以使用Docker来使用它。这将保留您的数据一段时间,并允许您在需要非常快速且包含大量信息时获取数据。请阅读docs 以了解其工作原理。
    3. Spark 流式处理 - 如果您没有流式处理,那么使用 Kafka 是没有意义的,您在 Kafka 上生成数据的 Rest 解决方案很慢,而且如果是批处理则没有意义。因此,如果您以流的形式写作,那么您也应该以流的形式进行分析。我建议您阅读有关 Spark Streaming here 的信息。以及如何将 Spark 与 Kafka 集成here

    所以,正如你所问:

    我需要 REST API 吗? 答案是否定的。

    架构将是这样的:

    Web 服务器 -> Fluentd -> Apache Kafka -> Spark Streaming -> 输出

    希望对你有帮助

    【讨论】:

    • 感谢您的回答,对您有很大帮助。用外行的话来说,您是在建议在制作 post req 时,我只是将它存储在服务器上的某个位置(使用 fluentd/Flume),这将提供给 kafka 并且从那里火花流将摄取这些数据并给出输出?它会启用高吞吐量系统吗? 1000 ping/秒?
    • 两者都可以,Spark 将使用 Kafka 作为 Source,并且 spark 可以在关系数据库中提供输出。 Spark 具有非常高的吞吐量,1000 pings/sec 很容易解决。我有一个火花流,可以每秒处理 20k 个事件,没有问题。在此处查看此演示文稿:spark-summit.org/eu-2015/events/…
    • 谢谢。我将尝试实施,看看它是如何工作的。每秒可以处理 20k 个事件的服务器的配置是什么?
    • 在我的例子中,我有一个从 IBM MQ 获取数据的 Flume,它将数据存储在具有 4 个代理和 16 个分区的 Kafka 中。我有一个 Spark Streaming,有 16 个执行器支持这个。
    • 你能分享一些关于火花流的帖子吗?我的 Zookeeper 正在运行,kafka 启动了。我创建了一个主题,在 cmd 上启动了一个生产者,在 cmd 上启动了一个消费者。我可以在 cmd 上接收消息,但是如何在 spark 上接收它们?任何文件都会有很大帮助。
    猜你喜欢
    • 2021-01-11
    • 1970-01-01
    • 2018-01-09
    • 2019-09-18
    • 2015-07-29
    • 2020-10-14
    • 2011-08-24
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多