Glue PySpark 作业因资源问题而失败

Glue PySpark job failing with resource issues

我试图在我的胶水 pyspark 作业(大约 87GB)中从 s3 读取一个大 json 文件。我必须从此文件中删除重复项,将此文件分成多个较小的文件,然后将其保存回 s3。当我尝试通过 运行 执行以下作业时。我正在进入资源 issues.Is 有什么方法可以优化它?

提前感谢大家的帮助。

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 )

错误

Command failed with exit code 1 - Yarn resource manager killed the Spark application, please refer to Spark driver logs/metrics for the diagnosis. [Executor task launch worker for task 5] client.YarnClient (YarnClient.java:makeRestApiRequest(66)) - The GET request failed for the URL http://0.0.0.0:8088/ws/v1/cluster/apps/application_1591879099247_0001 com.amazon.ws.emr.hadoop.fs.shaded.org.apache.http.conn.HttpHostConnectException: Connect to 0.0.0.0:8088 [/0.0.0.0] failed: Connection refused (Connection refused) at com.amazon.ws.emr.hadoop.fs.shaded.org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:158)

您可以尝试 2 个选项

  1. 使用合并而不是重新分区。
  2. 先对ip做repartition,再做dedup
df.repartition(40,'ip').dropDuplicates(['ip'])

您有几个问题:

  1. 你的非常大的 JSON 文件是用 GZip 压缩的,这使得文件不可分割,所有文件只需要一个执行者处理(无论你的工作是否配置有更多工人)。要解决此问题,您可以解压缩文件。如果您需要压缩文件以便能够处理它,那么您可以尝试 BZIP2 或 LZO,它们在 hadoop 中是标准的,但我没有在 Glue 中使用它们。为了能够读取数据,这几乎是强制性的(仅在一个节点中处理 87 GB 的压缩数据将需要 Glue 无法提供的大量内存)。

  2. Spark 需要读取 JSON 文件两次,一次是推断模式,第二次是处理数据,87 GB 的数据分布不均,这可能是一个挑战。为了尽量减少这种情况,您有两个选择:

a) 如果您知道 JSON 条记录的架构,那么您可以提供架构:

device_graph_df = spark.read.schema(<your schema).json(DATA_FILE_PATH)

b) 只读取一小部分数据来推断模式(例如 1/10):

device_graph_df = spark.read.option("samplingRatio", "0.1").json(DATA_FILE_PATH)