我在纱线上运行火花时遇到了这个错误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
以下是上述问题的解决方案。
退出代码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只需要很少的时间,但是整个过程的性能显着提高。