当前位置: 首页 > 知识库问答 >
问题:

Spark:加入时设置最大分区大小

许照
2023-03-14

当在火花中进行连接时,或者通常是对于随机操作,我可以设置分区的最大数量,我希望火花在其中执行此操作。

按留档:

火花sql。洗牌分区200配置在为联接或聚合洗牌数据时要使用的分区数。

如果我想减少每个任务中必须完成的工作量,我必须估计数据的总大小并相应地调整此参数(分区越多,意味着单个任务中完成的工作量越少,但任务越多)。

我想知道,我能告诉spark根据数据量简单地调整分区的数量吗?一、 e.在连接操作期间设置最大分区大小?

另外一个问题-spark在将数据集重新划分为200个大致相等的分区时,如何知道要处理的数据集的总大小?

提前感谢!

共有1个答案

戚俊美
2023-03-14

AFAIK,没有这样的选项来针对特定输出大小的混洗分区。所以这个调整留给您...在某些情况下,这在某种程度上可以在下游读取路径上解决。假设您连接数据并通过hdfs将输出写入拼花。您可以将查询结果重新分区为1(或非常少的分区数)。将其视为一个漏斗——与200个分区执行的一些聚合进行连接,然后进一步降低聚合数据的并行度(这应该涉及相对较小的IO)。假设您的目标是256 MB块大小。选项是输出在它周围的某个地方,远低于它或远高于它。对于前两种情况,您基本上实现了您的目标,即避免数据过于碎片化(对于hdfs,namenode中的块过多)。但是如果您的输出远高于目标块大小,这显然会影响下游作业的执行时间,您可以使用spark.sql.files.max分区字节来控制此数据被读取到的分区数量。因此,即使您有2GB的输出,将此参数设置为128MB也会在读取路径上产生16个分区。

关于你的第二个问题,火花只使用哈希分区器,并计算连接列上的哈希。当然,您可以通过使用分发方式来影响分区。

 类似资料:
  • 我有四个问题。假设在spark中有3个worker节点。每个工人节点有3个执行器,每个执行器有3个核心。每个执行器有5 gb内存。(总共6个执行器,27个内核,15GB内存)。如果: > 我有30个数据分区。每个分区的大小为6 GB。最佳情况下,分区的数量必须等于核心的数量,因为每个核心执行一个分区/任务(每个分区执行一个任务)。在这种情况下,由于分区大小大于可用的执行器内存,每个执行器核心将如何

  • 我使用火花处理大文件,我有12个分区。我有rdd1和rdd2,我在它们之间建立了连接,而不是选择(rdd3)。我的问题是,我咨询了最后一个分区比其他分区太大,从分区1到分区11但分区12。所以我划分了。我将我的rdd3重新分区为,但我最后一个分区仍然太大。我如何平衡分区的大小? 我的i编写自己的自定义分区程序?

  • 我使用的是SpringBoot2.0。3释放。我想增加HikariCP的最大池大小,默认情况下为10。 我试着在带有 spring.datasource.hikari.maximum-池-大小=200 但是它不起作用,因为在日志中它仍然显示最大池大小为10。 我想改变的原因是,我不知怎么地达到了登台的极限,我不知道是什么原因造成的。

  • 为什么选择范围错误: 在此.startTime() 中超出了最大调用堆栈大小;

  • 您可以使用基于浏览器的上传(不是多部分上传)中的内容长度范围字段来限制文件大小:http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-HTTPPOSTConstructPolicy.html 你怎么能在多部分上传中限制它?我正在使用EvaporateJS。