2017-01-18 34 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的顯著的過程中增加了整體性能的移動數據。