Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 关于RDD的最佳分区数及其元素数,有什么经验法则吗?_Apache Spark_Apache Spark Sql_Partitioning - Fatal编程技术网

Apache spark 关于RDD的最佳分区数及其元素数,有什么经验法则吗?

Apache spark 关于RDD的最佳分区数及其元素数,有什么经验法则吗?,apache-spark,apache-spark-sql,partitioning,Apache Spark,Apache Spark Sql,Partitioning,RDD包含的元素数量与其理想的分区数量之间是否存在关系 我有一个RDD,它有数千个分区(因为我从由多个小文件组成的源文件加载它,这是一个我无法修复的约束,所以我必须处理它)。我想重新划分它(或者使用coalesce方法)。但我事先不知道RDD将包含的事件的确切数量。 所以我想用一种自动化的方式。看起来像: val numberOfElements=rdd.count() val magicNumber=100000 rdd.合并(numberOfElements/magicNumber) 关于

RDD包含的元素数量与其理想的分区数量之间是否存在关系

我有一个RDD,它有数千个分区(因为我从由多个小文件组成的源文件加载它,这是一个我无法修复的约束,所以我必须处理它)。我想重新划分它(或者使用
coalesce
方法)。但我事先不知道RDD将包含的事件的确切数量。
所以我想用一种自动化的方式。看起来像:

val numberOfElements=rdd.count()
val magicNumber=100000
rdd.合并(numberOfElements/magicNumber)
关于RDD的最佳分区数及其元素数,有什么经验法则吗


谢谢。

没有,因为它高度依赖于应用程序、资源和数据。存在一些硬限制(),但其余的限制必须根据任务对任务进行调整。需要考虑的一些因素:

  • 单个行/元素的大小
  • 典型操作的成本。如果具有较小的分区且操作成本较低,那么调度成本可能比数据处理成本高得多
  • 执行分区操作(例如排序)时处理分区的成本
如果这里的核心问题是许多初始文件,那么使用某种变体的
CombineFileInputFormat
可能比重新分区/合并更好。例如:

sc.hadoop文件(
路径
[CombineTextInputFormat]的类别,
classOf[LongWritable],classOf[Text]
).map(u._2.toString)

另请参见

虽然我完全同意zero323,但您仍然可以实现某种启发式。在内部,我们将存储的数据大小作为avro键值,并对分区数进行压缩和计算,这样每个分区都不会超过64MB(totalVolume/64MB~分区数)。偶尔,我们会运行自动作业来重新计算每种类型输入的“最佳”分区数等。在我们的例子中,这很容易做到,因为输入来自hdfs(s3很可能会工作)


同样,这取决于您的计算和数据,因此您的数字可能会完全不同。

@zero323@Igor Berman如何衡量
分区
s对
Spark
性能的调整:按记录数还是按字节数?我的
Spark
工作从
MySQL
并行读取数据,我怀疑分区的大小可能是罪魁祸首。表示
分区
s应为~128MB(未提及行数),但我的分区(将)达到~10GB,记录数为~15m(如果读取成功)@y2k shubham这取决于它。您可以应用两种方法中的任何一种。我在一些项目中看到了计数,在另一个项目中看到了字节。10GB对于1个分区来说太大了…关于最佳大小(64MB,128MB左右-您需要测试,在任何情况下,它都低于1GB imo)@Igor Berman我承认~10GB对于
分区
s来说太大了,但这取决于
数据帧
的创建方式。我正在使用
Spark
Jdbc
MySQL
读取表。基于我的
MySQL
实例大小,我只能将读取操作并行化多达40个连接(
numPartitions=40
)。因此,所创建的
数据帧的某些分区最终会变得那么大。我总是可以
在以后将其重新分区
为更小的大小,但它们在创建时仍然会有这么大的大小。由于我无法控制MySQL
,因此我无法想出解决方案。@y2k shubham您熟悉吗?我没有太多地使用jdbc,所以我不能在这方面给你任何建议。如果您将创建1000个分区,但将以40的并行度运行它,会发生什么情况?(您将拥有相对较小的分区,但由于并行度为40(或最大内核数),您不会超过连接使用率)。它并不完美,但mysql并不是为大数据处理而构建的。您可以分两步完成,使用parallelism 40选择并将其存储到hdfs/s3中,然后使用普通并行运行