OOM 从镶木地板加载数据
OOM loading data from parquet
我们有一个 Apache Spark 1.4.0 集群,我们想从 HDFS 的一组 350 个镶木地板文件中加载数据。目前,当我们尝试 运行 我们的程序时,我们得到一个 "OutOfMemory Error" 驱动端。
分析执行器和驱动程序时,我们注意到在操作期间,当驱动程序内存不断增加时,执行程序内存保持不变。
对于每个镶木地板文件,我们按如下方式加载数据:
sqlContext.read().format(PARQUET_OUT_TYPE).load("path").toJavaRDD(mappingFunction)
然后,我们通过 "union" 连接 RDD,然后合并它们
partitions.reduce((r1,r2) -> r1.union(r2).coalesce(PARTITION_COUNT))
对我来说真正奇怪的是执行程序内存在加载阶段保持不变(当我期望看到它增加时因为节点读取的数据)并且驱动程序内存不断增加(当我期望看到它保持不变,因为它不应该加载到驱动程序内存中)。
我们加载数据的方式有问题吗?你能解释一下如何从 parquet 中并行读取数据吗?
谢谢
OOM 是由 parquet 元数据而非数据引起的。
谢谢
我们有一个 Apache Spark 1.4.0 集群,我们想从 HDFS 的一组 350 个镶木地板文件中加载数据。目前,当我们尝试 运行 我们的程序时,我们得到一个 "OutOfMemory Error" 驱动端。 分析执行器和驱动程序时,我们注意到在操作期间,当驱动程序内存不断增加时,执行程序内存保持不变。 对于每个镶木地板文件,我们按如下方式加载数据:
sqlContext.read().format(PARQUET_OUT_TYPE).load("path").toJavaRDD(mappingFunction)
然后,我们通过 "union" 连接 RDD,然后合并它们
partitions.reduce((r1,r2) -> r1.union(r2).coalesce(PARTITION_COUNT))
对我来说真正奇怪的是执行程序内存在加载阶段保持不变(当我期望看到它增加时因为节点读取的数据)并且驱动程序内存不断增加(当我期望看到它保持不变,因为它不应该加载到驱动程序内存中)。
我们加载数据的方式有问题吗?你能解释一下如何从 parquet 中并行读取数据吗?
谢谢
OOM 是由 parquet 元数据而非数据引起的。
谢谢