我们有很多时间序列的三分量磁场(北,东,下)在许多不同的站点测量。
我们希望使用Spark with Python来分析这些数据。我们使用Spark 1.6.1和Yarn作为集群管理器。我正在使用纱线client
部署模式运行spark-submit作业。
在我的代码中,我每个月使用sc.binaryFiles
阅读90-93个文件[每月30-31 * 3(北,东和下)]并执行combineByKey
每天将90个文件组合在一起,最终在DataFrame
的所有北方,东方和下方获得30天。在所有月份和所有站点以及所有年份重复此操作,将其加载到HDFS上的蜂巢表中。
我正在尝试将200 GB(10年)的数据(每个日期是一个17 MB的npy
文件)加载到Hive表中以进行数据分析。我们有一个4个节点的集群,122 GB的内存,44个vCores。我在488 GB可用中使用465 GB内存。我使用pyspark
代码将npy
文件作为sc.binaryFiles
读取,每次迭代使用90个文件。我使用以下参数给出spark-submit
--num-executors 16 --driver-memory 2g --executor-memory 26G --executor-cores 10 \
--conf "spark.sql.shuffle.partitions=2048" \
--conf "spark.shuffle.memory.fraction=0.8" \
--conf "spark.storage.memoryFraction=0.2" \
--conf "spark.yarn.executor.memoryOverhead=2600" \
--conf "spark.yarn.nodemanager.resource.memory-mb=123880" \
--conf "spark.yarn.nodemanager.resource.cpu-vcores=43"
但是在大约130次迭代后我总是得到以下错误。
org.apache.spark.storage.ShuffleBlockFetcherIterator.throwFetchFailedException(ShuffleBlockFetcherIterator.scala:323)
另外,我每年都会提交一份新工作。
即使我每次迭代只处理90个文件,为什么会出现此错误?是否可以遍历所有年份,所有工作站和工作中的所有月份?我的迭代逻辑处理所有年份,站点和月份但不能在Spark中运行它而不会失败。
请告诉我如何让火花顺利完成我的工作。