小编zav*_*lin的帖子

为什么 Spark 处理相同的数据两次?

当最简单的 Spark 应用程序似乎完成了相同的工作两次时,我陷入了一种奇怪的情况。

我做了什么

应用程序本身执行查询:

SELECT date, field1, field2, ..., field10
FROM table1
WHERE field1 = <some number>
  AND date BETWEEN date('2018-05-01') AND date('2018-05-30')
  ORDER BY 1
Run Code Online (Sandbox Code Playgroud)

并将结果存储到HDFS中。

table1是存储在 HDFS 上的一堆 parquet 文件,分区如下

/root/date=2018-05-01/hour=0/data-1.snappy.parquet
/root/date=2018-05-01/hour=0/data-2.snappy.parquet
...
/root/date=2018-05-01/hour=1/data-1.snappy.parquet
...
/root/date=2018-05-02/hour=0/data-1.snappy.parquet
...
etc.
Run Code Online (Sandbox Code Playgroud)

所有 parquet 文件的大小从 700M 到 2G 不等,并且具有相同的架构:10 个非空字段intbigint类型的非空字段。

应用程序的结果很小——只有几千行。

我的 Spark 应用程序在 YARN 上以集群模式运行。基本火花参数为

spark.driver.memory=2g
spark.executor.memory=4g
spark.executor.cores=4
spark.dynamicAllocation.enabled=true
spark.shuffle.service.enabled=true
spark.submit.deployMode=cluster
Run Code Online (Sandbox Code Playgroud)

在执行过程中,几个容器被抢占,没有发生错误和故障。整个应用程序一次完成。

奇怪的事情

Spark UI 截图:

  • 主屏幕
  • 第二阶段
  • 第四阶段

可以看出,第 2 阶段和第 4 阶段都处理了相同数量的输入行,但第 4 阶段也进行了一些改组(这些是结果行)。失败的任务是容器被抢占的任务。

所以看起来我的应用程序处理了相同的文件两次。 …

apache-spark

5
推荐指数
1
解决办法
3271
查看次数

标签 统计

apache-spark ×1