- 配置 spark-env.sh
JAVA_HOME=/usr/java/jdk1.8.0_172
HADOOP_CONF_DIR=/usr/lib/hadoop/
SPARK_MASTER_HOST=node202.hmbank.com
SPARK_EXECUTOR_CORES=1
SPARK_EXECUTOR_MEMORY=1g
- 配置 slaves
- 配置 spark-default.sh
spark.master spark://node202.hmbank.com:7077
spark.eventLog.enabled true
spark.eventLog.dir hdfs://hmcluster/user/spark/eventLog
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.driver.memory 1g
上述配置的问题
- env中的配置参数 SPARK_WORKER_CORES 、SPARK_WORKER_MEMORY 指的是一个application可以使用的总共的资源, 默认是全部资源。 当未配置时, 启动pyspark 或spark-shell 会占用完所有的资源, 导致新的application无法分配资源从而无法执行任务。
- spark.executor.cores 参数: 在yarn上默认是1个, 在其他模式默认是worker可用的所有的核,这时一个worker只会启动一个executor,并行度下降。若指定该参数后, 若worker上的资源(核和内存)满足多个executor时,会启动多个executor 。
- standalone模式目前只支持FIFO调度 。 但是为了支持多用户并发访问,可以控制每个应用可使用的最大资源。默认情况下,它会认为一次只其一个应用,会获取所有的资源。 可以在SparkConf中指定spark.cores.max参数来限制 。 示例如下:
val conf = new SparkConf()
.setMaster(...)
.setAppName(...)
.set("spark.cores.max", "10")
val sc = new SparkContext(conf)
另外,若应用程序没有设置spark.cores.max , 可以在spark-env.sh中设置master进程的参数来限制cores的数量:
export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=<value>"
出现的问题
我的hdfs使用的是namenode ha , 整合spark 访问hdfs时总是报nameserviceid找不到:
scala> r1.count()
java.lang.IllegalArgumentException: java.net.UnknownHostException: hmcluster
at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:374)
at org.apache.hadoop.hdfs.NameNodeProxies.createNonHAProxy(NameNodeProxies.java:310)
at org.apache.hadoop.hdfs.NameNodeProxies.createProxy(NameNodeProxies.java:176)
at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:668)
at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:604)
at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:148)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2598)
后将core-site.xml 和 hdfs-site.xml 两个配置文件拷贝到 spark conf目录下就好了。
(我在spark-env.sh中配置了HADOOP_CONF_DIR , 为何没起作用呢?)
网友评论