2017-01-18 15 views
1

我在纱线上运行spark时遇到此错误Container exited with a non-zero exit code 137。我经历了几项技术,但没有帮助。火花配置如下所示:EMR 5.x |在纱线上的火花|退出代码137和Java堆空间错误

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) 

de_pulse_ip = spark.read.csv('s3://aiqdatabucket/aiq-inputfiles/de_pulse_ip/latest/de_pulse_additional.txt.gz', schema=ipAadditionalPulseSchema, sep=';', header=True) 

# write the de_pulse_ip data into parquet format 
de_pulse_ip = de_pulse_ip.select("ip_start","ip_end","country_code","region_code","city_code","ip_start_int","ip_end_int","postal_code").repartition(50) 
de_pulse_ip.write.parquet("s3://analyst-adhoc/elevate/tempData/de_pulse_ip1.parquet", mode = "overwrite") 

# read de_pulse_ip data intp dataframe from parquet files 
de_pulse_ip = spark.read.parquet("s3://analyst-adhoc/elevate/tempData/de_pulse_ip1.parquet").repartition("ip_start_int","ip_end_int") 

#join with another dataset 200 MB 
brandsurvey_feed = de_pulse_ip.join(vdna_bs_feed_ip_int, [vdna_bs_feed_ip_int.ip_int_cast > de_pulse_ip.ip_start_int,vdna_bs_feed_ip_int.ip_int_cast <= de_pulse_ip.ip_end_int], how='right') 

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

+0

你有多少执行者?你为每个执行器分配了多少内存?解压缩的输入文件的大小是多少? – Yaron

+0

解压缩的文件是3.2 GB。为了分配内存,我尝试了几个选项1.我没有做任何内存,只使用了默认值2.然后我为每个执行程序使用了6GB,但仍然失败。 – braj259

+0

您使用了多少个6GB RAM的执行器? – Yaron

回答

4

这是上述问题的解决方案。

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

  • 增加驾驶员记忆spark.driver.memory 16G增加

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

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

一个我想非常重要的事情喜欢分享其中究竟对性能产生了巨大影响如下图:

正如我上面提到的,我有一个文件(.csv和3.2GB的gzip),它在解压缩后变为11.6 GB。 要加载gzip文件,spark总是会启动一个执行器(对于每个.gzip文件),因为gzip文件不可拆分,因此无法并行(即使您增加分区)。这阻碍了整个性能,因为spark首先将整个文件(使用一个执行程序)读入master(我正在以客户端模式运行spark-submit),然后解压缩,然后重新分区(如果提到要重新分区)。

为了解决这个问题,我使用s3-dist-cp命令并将文件从s3移动到hdfs,并且还减小了块大小以增加并行性。类似下面

/usr/bin/s3-dist-cp --src=s3://aiqdatabucket/aiq-inputfiles/de_pulse_ip/latest/ --dest=/de_pulse/ --groupBy='.*(additional).*' --targetSize=64 --outputCodec=none 

虽然,它需要一点时间来从S3到HDFS的显著的过程中增加了整体性能的移动数据。