【发布时间】:2020-01-20 15:47:11
【问题描述】:
由于一系列不幸的事件,我们最终在 s3 上存储了一个非常碎片化的数据集。表元数据存储在 Glue 上,数据使用“bucketBy”写入,并以 parquet 格式存储。因此,文件的发现不是问题,spark 分区的数量等于桶的数量,这提供了良好的并行度。
当我们在 Spark/EMR 上加载这个数据集时,我们最终会让每个 spark 分区从 s3 加载大约 8k 个文件。
由于我们以列格式存储数据;根据我们需要几个字段的用例,我们并没有真正读取所有数据,而是读取存储的一小部分数据。
根据工作节点上的 CPU 利用率,我可以看到每个任务(每个分区运行)几乎使用了大约 20% 的 CPU,我怀疑这是由于每个任务有一个线程顺序从 s3 读取文件,这么多 IOwait...
有没有办法鼓励 EMR 上的 spark 任务多线程从 s3 读取数据,这样我们就可以在一个任务中同时从 s3 读取多个文件?这样,我们可以利用 80% 的空闲 CPU 来加快速度吗?
【问题讨论】:
-
一般情况下,一个vcpu每个任务只能运行1个线程。如果你想为每个任务运行多个线程,你需要设置这个变量:spark.task.cpu,默认为 1,然后你需要在你的代码中进行并行处理,这将在 executor 上运行。
-
这里有一个链接解释了为什么在做 IO 时 cpu 没有被充分利用,stackoverflow.com/questions/13596997/…
-
我认为我可以在 RDD 级别上执行这样的操作,但是我正在处理 Dataset/Dataframe API 级别,因此我需要一个底层级别来读取多线程文件......除非我最终使用内置的多线程从头开始重新实现 Dataframes ;)
-
那么你需要创建多个可以并行读取数据的执行器。这完全取决于您如何编写代码。
-
我不太明白你的意思。能举个例子吗?
标签: multithreading apache-spark amazon-s3 amazon-emr