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

时间:2017-01-18 11:09:28

标签: apache-spark pyspark apache-spark-sql yarn

我在纱线上运行火花时遇到此错误Container exited with a non-zero exit code 137。经过一段时间后我尝试了几种技术但没有帮助。火花配置如下所示:

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

我在客户端模式下使用yarn。 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

1 个答案:

答案 0 :(得分:9)

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

退出代码137和Java堆空间错误主要与内存w.r.t执行程序和驱动程序有关。这是我做过的事情

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

  • 存储空间fraction spark.storage.memoryFraction 0.8

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

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

正如我上面提到的,我有一个文件(.csv和gzip为3.2GB),解压后变为11.6 GB。 要加载gzip文件,spark始终会启动单个执行程序(对于每个.gzip文件),因为它无法并行化(即使您增加了分区),因为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只需要很少的时间,但整个过程的性能显着提高。