【发布时间】:2016-10-13 00:58:14
【问题描述】:
我正在尝试最大限度地利用集群来完成一项简单的任务。
集群为 1+2 x m3.xlarge,运行 Spark 1.3.1、Hadoop 2.4、Amazon AMI 3.7
任务读取文本文件的所有行并将它们解析为 csv。
当我以纱线集群模式火花提交任务时,我得到以下结果之一:
- 0 执行者:作业无限等待,直到我手动杀死它
- 1 个执行者:作业正在利用资源,只有 1 台机器在工作
- 当我没有在驱动程序上分配足够的内存时出现 OOM
我的预期:
- Spark 驱动程序在所有可用内存的集群主服务器上运行,外加 2 个 9404MB 的执行程序(由 install-spark 脚本定义)。
有时,当我使用 1 个执行程序“成功”执行时,克隆并重新启动该步骤会以 0 个执行程序结束。
我使用这个命令创建了我的集群:
aws emr --region us-east-1 create-cluster --name "Spark Test"
--ec2-attributes KeyName=mykey
--ami-version 3.7.0
--use-default-roles
--instance-type m3.xlarge
--instance-count 3
--log-uri s3://mybucket/logs/
--bootstrap-actions Path=s3://support.elasticmapreduce/spark/install-spark,Args=["-x"]
--steps Name=Sample,Jar=s3://elasticmapreduce/libs/script-runner/script-runner.jar,Args=[/home/hadoop/spark/bin/spark-submit,--master,yarn,--deploy-mode,cluster,--class,my.sample.spark.Sample,s3://mybucket/test/sample_2.10-1.0.0-SNAPSHOT-shaded.jar,s3://mybucket/data/],ActionOnFailure=CONTINUE
包含一些步骤变化,包括:
--driver-memory 8G --driver-cores 4 --num-executors 2
带有 -x 的 install-spark 脚本会生成以下 spark-defaults.conf:
$ cat spark-defaults.conf
spark.eventLog.enabled false
spark.executor.extraJavaOptions -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:MaxHeapFreeRatio=70
spark.driver.extraJavaOptions -Dspark.driver.log.level=INFO
spark.executor.instances 2
spark.executor.cores 4
spark.executor.memory 9404M
spark.default.parallelism 8
更新 1
我在通用 JavaWordCount 示例中得到了相同的行为:
/home/hadoop/spark/bin/spark-submit --verbose --master yarn --deploy-mode cluster --driver-memory 8G --class org.apache.spark.examples.JavaWordCount /home/hadoop/spark/lib/spark-examples-1.3.1-hadoop2.4.0.jar s3://mybucket/data/
但是,如果我删除“--driver-memory 8G”,任务会被分配 2 个执行程序并正确完成。
那么,驱动程序内存阻止我的任务获取执行程序是怎么回事?
是否应该按照here 的说明在集群的主节点上与 Yarn 主容器一起执行驱动程序?
如何为我的 spark 作业驱动程序提供更多内存? (收集和其他一些有用的操作出现的地方)
【问题讨论】:
标签: apache-spark hadoop-yarn emr