我知道我可以重新分区
一个RDD来增加它的分区,并使用coalesce来减少它的分区。关于这一点,我有两个问题,在阅读了不同的资源后,我无法完全理解。
当生成RDD时,Spark将使用合理的默认值(每个块1个分区,最初的版本是64MB,现在是128MB)。但是我也读到建议使用2到3倍于运行作业的内核数量。所以问题来了:
>
一个给定的文件应该使用多少个分区?例如,假设我有一个10GB。拼花文件,3个执行器,每个执行器有2个内核和3gb内存。我应该重新分区吗?我应该使用多少分区?做出选择的更好方式是什么?
如果没有提供分区,所有数据类型(即. txt
,. parket
等)是否默认重新分区?
Spark可以为RDD的每个分区运行单个并发任务,最多可达集群中的内核总数。
例如:
val rdd= sc.textFile ("file.txt", 5)
上面的代码行将创建一个RDD,名为文本文件,有5个分区。
假设您有一个具有4个内核的集群,并且假设每个分区需要处理5分钟。如果上面的RDD有5个分区,4个分区进程将并行运行,因为有4个内核,当4个内核中的一个空闲时,第5个分区进程将在5分钟后处理。
整个处理过程将在10分钟内完成,在第5次分区过程中,资源(剩余的3个内核)将保持空闲。
决定RDD
中分区数量的最佳方法是使分区数量等于集群中的核心数量,这样所有分区都将并行处理,资源将以最佳方式利用。
问题:所有数据类型(例如.txt、.parquet等)都是吗如果没有提供分区,默认情况下是否重新分区?
每个rdd将默认没有分区。要检查,您可以在rdd创建后立即使用rdd.partitions.length
。
为了以最佳方式使用现有的集群资源并加快速度,我们必须考虑重新分区,以确保所有核心都被利用,并且所有分区都有足够数量的均匀分布的记录。
为了更好的理解,也看看https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-rdd-partitions.html
(numOf执行器*核数)*复制因子(可能是2倍或3倍以上)
问题内容: 有什么区别?什么时候应该使用容量为1的对抗? 问题答案: SynchronousQueue更像是一个传递,而LinkedBlockingQueue仅允许单个元素。区别在于对SynchronousQueue的put()调用直到有相应的take()调用 才返回 ,但LinkedBlockingQueue的大小为1,则put()调用(对空队列)将立即返回。 我不能说自己曾经直接使用过Sync
问题内容: 我对使用和翻译有疑问。我了解到,在模型中,我应该使用。但是还有其他地方我也应该使用吗?表单定义呢?它们之间是否存在性能差异? 编辑: 还有一件事。有时候,代替被使用。正如文档所述,仅在将字符串显示给用户之前,才将字符串标记为要翻译,并在可能的最新情况下进行翻译,但是我在这里有点困惑,这与功能相似吗?我仍然很难决定在模型和表格中应该使用哪个。 问题答案: ugettext() 与 uge
问题内容: 我知道他们两个都禁用了Nagle的算法。 我什么时候应该/不应该使用它们中的每一个? 问题答案: 首先,不是所有人都禁用Nagle的算法。 Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等待直到收到先前发送的数据包的ACK,同时累积用户的数据。然后发送累积的数据。 这将对telnet等应用程序有所帮助。但是,在发送流数据时,等待A
问题内容: 在该类中,有两个字符串,和。 有什么不同?我什么时候应该使用另一个? 问题答案: 如果你的意思是和则: 用于在文件路径列表中分隔各个文件路径。考虑在上的环境变量。您使用a分隔文件路径,因此在上将是;。 是或用于拆分到特定文件的路径。例如在上,或
问题内容: 我在ORM上还很新。我刚刚开始阅读有关使用Hibernate的Java Persistence API的书籍和文档。 我只是想知道,关闭EntityManagerFactory与jdbc数据库连接关闭类似吗? 我们是否应该在每次持久/更新/删除后关闭它?如果我们不关闭它,数据库连接会保持打开状态吗? 问题答案: 我只是想知道,关闭与jdbc数据库连接关闭类似吗? 这并非完全正确,但关闭
问题内容: 我正在使用’multiprocess.Pool.imap_unordered’如下 我需要打电话或之后的for循环? 问题答案: 不,您没有,但是如果您不再使用游泳池,那可能是个好主意。 Tim Peters在此SO帖子中致电或致电的理由很明确: 至于Pool.close(),您应该在永远不会将更多工作提交给Pool实例的情况下(且仅在)进行调用。因此,通常在主程序的可并行化部分完成时