【发布时间】:2020-06-11 18:40:26
【问题描述】:
我正在尝试在我的胶水 pyspark 作业中从 s3 读取一个大的 json 文件(大约 87GB)。我必须从此文件中删除重复项,将此文件分成多个较小的文件,然后将其保存回 s3。当我试图通过运行以下工作来做到这一点时。我遇到了资源问题。有什么方法可以优化它吗?
提前感谢所有帮助。
from pyspark.sql import SparkSession
if __name__ == '__main__':
app_name = "test"
spark = SparkSession.builder.appName(app_name).getOrCreate()
DATA_FILE_PATH = 's3://test//ids_20200606_173121.gz'
output_FILE_PATH = 's3://output/data/y=2020/m=06/d=10'
device_graph_df = spark.read.json(DATA_FILE_PATH)
distinct_device_graph_df = device_graph_df.dropDuplicates(['ip'])
device_graph_df = distinct_device_graph_df.repartition(40)
distinct_device_graph_df.write.parquet(output_FILE_PATH )
错误
命令失败,退出代码为 1 - Yarn 资源管理器杀死了 Spark 应用程序,请参阅 Spark 驱动程序日志/指标进行诊断。 [任务 5 的执行器任务启动工作人员] client.YarnClient (YarnClient.java:makeRestApiRequest(66)) - URL http://0.0.0.0:8088/ws/v1/cluster/apps/application_1591879099247_0001 的 GET 请求失败 com.amazon.ws.emr.hadoop.fs.shaded.org.apache.http.conn.HttpHostConnectException:连接到 0.0.0.0:8088 [/0.0.0.0] 失败:连接被拒绝(连接被拒绝) 在 com.amazon.ws.emr.hadoop.fs.shaded.org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:158)
【问题讨论】:
-
尝试通过将 spark.sql.shuffle.partitions 设置为 400 来增加 shuffle 分区的数量,然后重新分区文件,使每个文件的大小为 512 mb 块。因此,如果您的文件大小为 87 GB,则重新分区大约 150
-
正如下面@RojoSam 所指出的,问题是由于 GZip 压缩导致的文件,该文件不可拆分,只有一个执行程序正在处理它。可能这就是它陷入资源问题的原因。因此,让我尝试更改输入文件的压缩技术。然后可能不需要重新分区,因为 spark 会在读取时将其加载到多个分区中。
标签: apache-spark pyspark aws-glue