【发布时间】:2017-07-10 03:07:08
【问题描述】:
是否可以使用 spark-streaming-kafka-0-10 库配置 Spark 以使用单个任务读取多个 Kafka 分区或整个 Kafka 主题,而不是创建不同的 Spark 任务每个 Kafka 分区都可用?
请原谅我对这些技术的粗略理解;我想我对 Spark 和 Kafka 还是很陌生。架构和设置主要是为了探索和了解这些技术如何协同工作。
我有四个虚拟主机,一个带有一个 Spark master,每个带有一个 Spark worker。其中一台主机还运行基于Spotify's Docker image 的Kafka 代理。每台主机都有四个内核和大约 8 GB 的未使用 RAM。
Kafka broker有206个topic,每个topic有10个partition。因此,共有 2,060 个分区可供应用程序读取。
我正在使用 spark-streaming-kafka-0-10 库(目前处于试验阶段)从 Spark Streaming 作业订阅 Kafka 中的主题。我正在使用SubscribePattern 类订阅 Spark 的所有 206 个主题:
val stream = KafkaUtils.createDirectStream[String, String](
ssc,
PreferConsistent,
SubscribePattern[String, String](Pattern.compile("(pid\\.)\\d+"),
kafkaParams)
)
当我将此作业提交给 Spark 主服务器时,似乎启动了 16 个执行器,集群中的每个核心一个。看起来每个 Kafka 分区都有自己的任务,总共有 2,060 个任务。我认为我的 16 个执行器集群在处理这么多任务时遇到了麻烦,因为在完成 1500 到 1800 个任务之间的不同点上,这项工作不断失败。
我发现 a tutorial by Michael Noll from 2014 使用 spark-streaming-kafka-0-8 库来控制每个主题的消费者线程数:
val kafkaParams: Map[String, String] = Map("group.id" -> "terran", ...)
val consumerThreadsPerInputDstream = 3
val topics = Map("zerg.hydra" -> consumerThreadsPerInputDstream)
val stream = KafkaUtils.createStream(ssc, kafkaParams, topics, ...)
【问题讨论】:
标签: scala apache-spark apache-kafka spark-streaming kafka-consumer-api