EMR 5.x|Spark on Yarn |退出代码137和Java堆空间错误



在纱线上运行火花时,我收到了此错误Container exited with a non-zero exit code 137。在经历了这些之后,我尝试了一些技巧,但都无济于事。火花配置如下:

spark.driver.memory 10G
spark.driver.maxResultSize  2G
spark.memory.fraction   0.8

我在客户端模式下使用纱线。spark-submit --packages com.databricks:spark-redshift_2.10:0.5.0 --jars RedshiftJDBC4-1.2.1.1001.jar elevatedailyjob.py > log5.out 2>&1 &

样本代码:

# Load the file (its a single file of 3.2GB)
my_df = spark.read.csv('s3://bucket-name/path/file_additional.txt.gz', schema=MySchema, sep=';', header=True)
# write the de_pulse_ip data into parquet format
my_df = my_df.select("ip_start","ip_end","country_code","region_code","city_code","ip_start_int","ip_end_int","postal_code").repartition(50)
my_df.write.parquet("s3://analyst-adhoc/elevate/tempData/de_pulse_ip1.parquet", mode = "overwrite")
# read my_df data intp dataframe from parquet files
my_df1 = spark.read.parquet("s3://bucket-name/path/my_df.parquet").repartition("ip_start_int","ip_end_int")
#join with another dataset 200 MB
my_df2 = my_df.join(my_df1, [my_df.ip_int_cast > my_df1.ip_start_int,my_df.ip_int_cast <= my_df1.ip_end_int], how='right')

注意:输入文件是一个单独的gzip文件。它的解压缩大小是3.2GB

以下是上述问题的解决方案。

退出代码137和Java堆空间错误主要与内存、执行器和驱动程序有关。这是我做的

  • 增加驱动程序内存spark.driver.memory 16G增加

  • 存储存储器fraction spark.storage.memoryFraction 0.8

  • 增加执行器内存spark.executor.memory 3G

我想分享一件非常重要的事情,它实际上对性能产生了巨大的影响,如下所示:

如上所述,我有一个单独的文件(.csv和3.2GB的gzip),解压缩后变成11.6GB。要加载gzip文件,spark总是启动一个执行器(针对每个.gip文件),因为它不能并行化(即使增加了分区),因为gzip文件是不可拆分的。这阻碍了整个性能,因为spark首先将整个文件(使用一个执行器)读取到主文件中(我在客户端模式下运行spark-submit),然后解压缩,然后重新分区(如果提到重新分区)。

为了解决这个问题,我使用了s3-dist-cp命令,将文件从s3移动到hdfs,并减少了块大小以提高并行性。低于

/usr/bin/s3-dist-cp --src=s3://bucket-name/path/ --dest=/dest_path/  --groupBy='.*(additional).*'  --targetSize=64 --outputCodec=none

尽管将数据从s3移动到HDFS只需很少的时间,但该过程的总体性能显著提高。

相关内容

  • 没有找到相关文章

最新更新