简单的 textFileStream 输入所有 lines/records 转到单个执行器

Simple textFileStream input all lines/records go to a single executor

我正在使用 python 和 spark streaming,这个想法很简单,让流式监视器成为一个特定的目录,一旦有新的 txt 文件存在一些行,它就会被处理。

问题是每个 txt 文件中的行数很少,但处理每一行将花费大量时间。所以我希望将行发送到不同的执行程序,以便可以并行处理它们。问题是它们都被发送给一个执行者(或两个)...

代码如下所示:

lines = stream_context.textFileStream(monitor_dir).repartition(4)
lines.foreachRDD(process_stream)

def process_stream(time, rdd):
    print('rdd partitions: {}'.format(rdd.getNumPartitions()))
    rdd.map(lambda line: parse_each_line(line, other_params)).count()

我有 4 个执行程序,所以我重新分区为 4,我 运行 它在具有集群模式的真实集群中,当它在 "process_stream" 方法中打印时, rdd.getNumPartitions () == 4.

所以不确定是什么问题,是否是由 Hadoop 文件系统中的 "Input Split" 大小设置引起的?

.repartition(4) 每个 RDD 将由 4 个不同的任务处理。但是用户端没有这样的细粒度控制来强制每个任务在不同的执行器上执行。

我想为了测试,您可以将 spark.task.cpus 值设置为 spark.executor.cores(强制每个任务获取分配给执行程序的所有 cpu 核心)。但这不是你想在真实项目中做的事情。