Apache spark Apache Spark-shuffle写入的数据比输入数据的大小还要多
我在本地模式下使用Spark 2.1,我正在运行这个简单的应用程序Apache spark Apache Spark-shuffle写入的数据比输入数据的大小还要多,apache-spark,shuffle,Apache Spark,Shuffle,我在本地模式下使用Spark 2.1,我正在运行这个简单的应用程序 val N = 10 << 20 sparkSession.conf.set("spark.sql.shuffle.partitions", "5") sparkSession.conf.set("spark.sql.autoBroadcastJoinThreshold", (N + 1).toString) sparkSession.conf.set("spark.sql.join.preferSortMerge
val N = 10 << 20
sparkSession.conf.set("spark.sql.shuffle.partitions", "5")
sparkSession.conf.set("spark.sql.autoBroadcastJoinThreshold", (N + 1).toString)
sparkSession.conf.set("spark.sql.join.preferSortMergeJoin", "false")
val df1 = sparkSession.range(N).selectExpr(s"id as k1")
val df2 = sparkSession.range(N / 5).selectExpr(s"id * 3 as k2")
df1.join(df2, col("k1") === col("k2")).count()
val N=10首先,让我们看看数据大小总和(最小值、中间值、最大值)
的含义:
根据和,我们看到的数据大小总计(min,med,max)
是shuffle的dataSize
度量的最终值。那么,它是如何更新的呢?每次序列化记录时都会更新它:通过dataSize.add(row.getSizeInBytes)
(UnsafeRow
是Spark SQL中记录的内部表示形式)
在内部,UnsafeRow
由一个字节[]
支持,并在序列化过程中直接复制到底层输出流,其getSizeInBytes()
方法只返回字节[]
的长度。因此,最初的问题被转化为:为什么字节表示是记录中唯一的长列的两倍?这份文件给了我们答案:
每个元组有三个部分:[空位集][值][可变长度部分]
位集用于空跟踪,并与8字节字边界对齐。它每个字段存储一位
因为它是8字节字对齐的,所以只有1个空位需要另一个8字节,与长列的宽度相同。因此,每个UnsafeRow
表示使用16个字节的一个长列行