【问题标题】:Scaling with Apache Spark/Apache Flink使用 Apache Spark/Apache Flink 进行扩展
【发布时间】:2018-03-01 18:33:06
【问题描述】:

我计划一个从 Apache Kafka 读取数据并在(可能很耗时)处理后将数据保存到数据库的应用程序。

我的案例是消息,而不是流,但为了可扩展性,我正在考虑将其插入 Spark 或 Flink,但无法掌握这些扩展的方式:当我的应用程序作为 Spark/Flink 的一部分时,是否应该读取一些数据从 Kafka 然后退出还是继续阅读?

Spark/Flink 将如何决定它们必须生成更多我的应用实例以提高吞吐量?

谢谢!

【问题讨论】:

  • Spark 具有动态分配功能,它会在我记得微批处理持续时间接近微批处理间隔时创建新的执行程序
  • 我对这两个都是新手 - 我的应用程序应该如何运行?它应该只从 Kafka 读取一次并退出吗?如果队列中有更多数据,Spark/Flink 如何知道它需要创建新作业来读取?
  • 只需创建流式作业,Spark 会自动扩展执行器的数量
  • 我不了解 Flink,所以我不想写它,但是 - AFAIK - 它也有一些自动缩放功能

标签: apache-spark apache-kafka apache-flink


【解决方案1】:

在 Apache Flink 中,您可以通过设置 env.setParallelism(#parallelism) 来定义操作的并行性,以使所有操作符与 #parallelism 并行实例一起运行,或者您甚至可以为每个操作符定义/覆盖它,例如 dataStream.map(...).setParallelism(#parallelism);

更多信息请查看 Flink 文档https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/parallel.html

关于从 Kafa 读取,您可以定义并行接收器(同一组)以使用 Kafka 主题分区进行扩展/缩减:env.addSource(kafkaConsumer).setParallelism(#topicPartitions)

查看 Kafka 文档以获取有关 Kafka 主题和分区以及消费者组的更多信息:https://kafka.apache.org/documentation/

请注意,如果您没有在 Flink 程序内部指定并行级别,而是将其部署在本地 Flink 集群上。将使用配置文件flinkDir/conf/flink-conf.yaml 中的parallelism.default 参数的值。除非您通过-p 指定它,例如./bin/flink run .... -p #parallelism。检查Flink cli options

【讨论】:

  • 谢谢,Ehab,我通过 cmdline 中的“flink run”创建了一个作业,但是我应该在每台服务器上运行它,还是 Flink 会以某种方式负责“分发”这个作业?我对作业的并行性感兴趣,而不是操作员,所以我想这可以通过 Task Slots 来解决?
  • @estoy 您只需指定运算符的并行度,其余的由 Flink 处理。程序代码被转换为链式子任务的数据流图。检查here了解更多详情。增加作业的并行性是什么意思?
  • 我要确保的是:一份发布到 kafka 的文档-> 一个 flink 作业处理它。发布到 kafa 的两个文档-> 两个 flink 作业并行处理它们。没有第二个等待第一个完成
  • 好的,所以如果你在你的 Flink 程序中设置正确的操作符的并行度,你就可以做到这一点。如果您有具体的程序,我可以为您检查。
  • 因为您没有在程序中指定并行级别。尝试更新配置文件flinkDir/conf/flink-conf.yamlparallelism.default 参数的值。或通过 'bin/flink run -c jobClass -p 5` 也更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
相关资源
最近更新 更多