Spark分区的困境

Posted

技术标签:

【中文标题】Spark分区的困境【英文标题】:Dilemma about Spark partitions 【发布时间】:2020-02-14 17:56:31 【问题描述】:

我正在做一个项目,我必须使用 boto3 读取 S3 文件(每个压缩后大约 3MB)。我有一个小的 pyspark 脚本,每小时运行一次来​​处理文件并生成 2 种类型的输出数据,这些数据写回 S3。 pyspark 脚本使用“xmltodict”python 库将一些静态数据读入文件处理所需的字典对象中。我有一个运行 1 个 Master 和 1 个 Core 的小型 Amazon EMR 集群 v5.28。这可能是多余的,但不是我现在主要关心的问题。

问题: 1. 我怎么知道“如果”我应该对数据进行分区?我已阅读有关要创建多少个分区等的文章,但在 IF 和 WHEN 上找不到任何内容。驱动分区的标准是什么——源数据文件中的行数、列数、数据类型、脚本中执行的操作等?我将源文件读入 RDD 并将其转换为 DF 并通过添加列、分组数据、计数数据等来执行各种操作。Spark 如何处理幕后的分区? 2.目前我手动执行pyspark脚本如下:

spark-submit --master spark://x.x.x.x:7077 --deploy-mode client test.py

在主节点上,因为我决定坚持使用独立 CM。 'xmltodict' 安装在此节点上,但未安装在核心节点上。似乎不需要在核心节点上安装甚至配置 python3,因为我没有看到任何错误。这是正确的吗?有人可以解释一下这种混乱吗?我尝试通过 shell 文件安装 python 库作为引导程序 当我创建集群时,它失败了,坦率地说,在尝试了几次之后,我放弃了。 3. 基于分区我想我对是否使用coalesce() 或collect() 有点困惑。同样,问题是何时使用,何时不使用?

抱歉,问题太多了。现在,我已经编写了 pyspark 脚本,我正在努力提高效率。 谢谢

【问题讨论】:

一口气三个问题:)让我试着回答一个关于分区的问题。 这里有一些资源可能有助于理解分区Top 5 Mistakes When Writing Spark Apps、Tune Apache Spark Jobs、Executors, Cores and Memory 和last one。顺便说一句,您应该避免在一个问题中发布 5 个或更多问题 【参考方案1】:

分区是一种将数据划分为最佳大小块的机制,并基于运行多个tasks,每个处理一个数据。如您所见,这是并行性的核心,没有这个,Spark(或任何大数据处理框架)就没有重要用途。大多数文件格式是可拆分的,有些文件格式在压缩时是可拆分的,如 Avro、parquet、orc 等。有些文件格式在压缩时不可拆分,如 zip、gzip 等。根据正在处理的文件的大小及其被处理的能力split 时,Spark 会自动创建多个分区并并行处理数据。在您的情况下,数据是 zip,一个文件将是一个分区,一次最多可以有 1 个 CPU 处理它。如果这个 zip 很小,那么它可以,但如果它很大,那么它的处理会很慢。

【讨论】:

以上是关于Spark分区的困境的主要内容,如果未能解决你的问题,请参考以下文章

动态驱动困境

博弈论——囚犯困境

NLP技巧:如何摆脱目前的困境

域名劫持的破解困境

囚徒困境

深度学习的困境