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 Apache Spark-shuffle写入的数据比输入数据的大小还要多_Apache Spark_Shuffle - Fatal编程技术网

Apache spark Apache Spark-shuffle写入的数据比输入数据的大小还要多

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

我在本地模式下使用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.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个字节的一个长列行