我刚刚开始使用Spark 2+(2.3版本),我在观察Spark UI时发现了一些奇怪的东西。 我有一个HDFS集群中的目录列表,其中包含总共24000个小文件。
当我想对它们运行Spark操作时,Spark 1.5会为每个输入文件生成一个单独的任务,就像我直到现在一样。我知道每个HDFS块(在我的例子中是一个小文件是一个块)在Spark中生成一个分区,每个分区由一个单独的任务处理。
此外,命令my_dataframe.rdd.getNumPartitions()
输出24000。
现在关于Spark 2.3
在相同的输入上,命令my_dataframe.rdd.getNumPartitions()
输出1089.Spark UI还为我的Spark操作生成1089个任务。您还可以看到生成的作业数量在spark 2.3然后1.5
两个Spark版本的代码都相同(我需要更改一些数据框,路径和列名,因为它是来自工作的代码):
%pyspark
dataframe = sqlContext.\
read.\
parquet(path_to_my_files)
dataframe.rdd.getNumPartitions()
dataframe.\
where((col("col1") == 21379051) & (col("col2") == 2281643649) & (col("col3") == 229939942)).\
select("col1", "col2", "col3").\
show(100, False)
以下是
生成的实际计划dataframe.where(...).select(...).explain(True)
Spark 1.5
== Physical Plan ==
Filter (((col1 = 21379051) && (col2 = 2281643649)) && (col3 = 229939942))
Scan ParquetRelation[hdfs://cluster1ns/path_to_file][col1#27,col2#29L,col3#30L]
Code Generation: true
Spark 2.3
== Physical Plan ==
*(1) Project [col1#0, col2#2L, col3#3L]
+- *(1) Filter (((isnotnull(col1#0) && (col1#0 = 21383478)) && (col2 = 2281643641)) && (col3 = 229979603))
+- *(1) FileScan parquet [col1,col2,col3] Batched: false, Format: Parquet, Location: InMemoryFileIndex[hdfs://cluster1ns/path_to_file..., PartitionFilters: [], PushedFilters: [IsNotNull(col1)], ReadSchema: struct<col1:bigint,col2:bigint,col3:bigint>....
上面的工作是使用pyspark从zeppelin生成的。 还有其他人用火花2.3遇到这种情况吗? 我不得不说我喜欢处理多个小文件的新方法,但我也想知道可能的内部Spark更改。
我在互联网上搜索了最新的书“Spark the definitive guide”,但没有找到任何有关Spark的新方法来生成工作实际计划的信息。
如果您有任何链接或信息,请阅读有趣。 谢谢!
答案 0 :(得分:-2)
| spark.files.maxPartitionBytes | 134217728(128 MB)|读取文件时打包到单个分区中的最大字节数。