在纱线上运行火花时,我收到了此错误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只需很少的时间,但该过程的总体性能显著提高。