hadoop版本: 2.8.0 spark 版本: 2.2.0
前提:hdfs的集群环境已经搭建完毕,这里不详表。
集群环境:3台机器规模
192.168.8.11 hdp-01 192.168.8.12 hdp-02 192.168.8.13 hdp-03 hdp-01上安装: NameNode ResourceManager DataNode NodeManager hdp-02 hdp-03 上安装: DataNode NodeManager |
1. yarn集群环境搭建:
yarn集群中有两个角色:
主节点:Resource Manager 1台
从节点:Node Manager N台
NodeManager在物理上应该跟data node部署在一起,为什么?
hdfs上的数据存储在datanode节点上,而nodemanager,要进行运算,就需要读取datanode上的数据块,如果部署在datanode节点上,可用直接本地读取,不需要再跨网络传输,速度更快,效率更高。
ResourceManager在物理上应该独立部署在一台专门的机器上(可用部署在任意的机器)
1 修改配置文件:
yarn-site.xml
<property> <name>yarn.resourcemanager.hostname</name> <value>hdp-01</value> </property> # nodemanager给 mapreduce程序提供辅助功能,辅助shuffle <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name> yarn.nodemanager.resource.memory-mb</name> <value>4096</value> </property> <property> <name> yarn.nodemanager.resource.cpu-vcores</name> <value>4</value> </property> |
yarn集群配置参数说明:
yarn.nodemanager.resource.memory-mb 默认是8G yarn.nodemanager.resource.cpu-vcores 默认是8 注意:如果内存不足2G,至少配置2G,即值为2048 如果内存配置低于2G,可能会导致mapreduce任务不能正常运行。 报错如下: 原因: 在mapred-default.xml中,有默认参数配置了(MR AppMaster)内存为1.5G。 每一个mapreduce 会启动一个MR AppMaster进行。 |
2、scp这个yarn-site.xml到其他节点
cd /root/apps/hadoop/etc/hadoop/ for i in 2 3;do scp yarn-site.xml hdp-0$i:`pwd` ;done |
yarn为每一个容器分配内存和核数:
yarn为每一个container分配的最小的内存:1024 yarn.scheduler.minimum-allocation-mb 1024最大可分配的内存为8G: yarn.scheduler.maximum-allocation-mb 8192 最小的cores: 1个 默认的就是一个 yarn.scheduler.minimum-allocation-vcores 1 最多可分配的cores:32个 yarn.scheduler.maximum-allocation-vcores 32 |
3、启动yarn集群:
主节点:#yarn-daemon.sh start resourcemanager
从节点:#yarn-daemon.sh start nodemanager
4、脚本批量启动:
在hdp-01上,修改hadoop的slaves文件,列入要启动nodemanager的机器
然后将hdp-01到所有机器的免密登陆配置好
启动yarn集群:(注:该命令应该在resourcemanager所在的机器上执行)
# start-yarn.sh
停止:# stop-yarn.sh
验证:用jps检查yarn的进程,用web浏览器查看yarn的web控制台
启动完成后,可以在windows上用浏览器访问resourcemanager的web端口:
看resource mananger是否认出了所有的node manager节点
2. spark on yarn,yarn集群的补充配置:
补充配置一:
yarn默认情况下,只根据内存调度资源,所以sparkon yarn运行的时候,即使通过--executor-cores指定vcore个数为N,但是在yarn的资源管理页面上看到使用的vcore个数还是1. 相关配置在capacity-scheduler.xml 文件:
<property> <name>yarn.scheduler.capacity.resource-calculator</name> <!-- <value>org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator</value> --> <value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value> </property> |
补充配置二:
修改所有yarn节点的yarn-site.xml,在该文件中添加如下配置
<property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> |
如果不配置这两个选项,在spark-on-yarn的client模式下,可能会报错,错误如下:
分析原因:内存不足,导致程序被终止。
参数说明:
yarn.nodemanager.pmem-check-enabled 是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true。 yarn.nodemanager.vmem-check-enabled 是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true。 |
配置修改完成之后,把配置文件分发到各台节点上:
# cd /root/apps/hadoop/etc/hadoop [root@hdp-01 hadoop]# for i in 2 3 ;do scp capacity-scheduler.xml yarn-site.xml hdp-0$i:`pwd`;done |
至此,spark on yarn的yarn集群配置完成。(hdfs集群也配置完成是前提)
启动hdfs和yarn集群。
3. spark配置:
3.1. sparkonyarn 简介:
yarn是hadoop中的一个组件,是一个统一的资源调度平台。
spark on yarn,就是把spark任务提交到yarn 集群上运行。
那么提交spark任务的地方,就是客户端。所以客户端一台即可。但需要保证客户端可以正常连接到hdfs集群和yarn集群。
3.2. spark配置:
官方文档:
http://spark.apache.org/docs/latest/running-on-yarn.html
下载spark安装包,上传并解压到/root/apps目录下。
修改spark的配置文件,只需要修改conf目录下的spark-env.sh 配置文件即可。
在spark-env.sh中配置
export JAVA_HOME=/usr/local/jdk1.8.0_131 export HADOOP_CONF_DIR=/root/apps/hadoop/etc/hadoop |
注意:该配置文件的作用,就是告知spark程序yarn在哪里。
可以使用HADOOP_CONF_DIR或者YARN_CONF_DIR,如果不配置该选项,就会报错如下:
再次强调:提交spark任务的地方,就是客户端,所以配置一台机器即可。
待HDFS和YARN正常启动后,就可以提交任务到yarn集群中。
以cluster模式提交任务到yarn集群:
spark-submit --master yarn --deploy-mode cluster --class org.apache.spark.examples.SparkPi /root/apps/spark-2.2.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.2.0.jar 1000 |
4. 补充:hadoop集群其他配置文件:
core-site.xml文件:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hdp-01:9000</value> </property> </configuration> |
hdfs-site.xml文件:
<configuration> # namenode 存储元数据的本地目录 <property> <name>dfs.namenode.name.dir</name> <value>/root/dfs/name</value> </property> # datanode 存储块数据的本地目录 <property> <name>dfs.datanode.data.dir</name> <value>/root/dfs/data</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>hdp-02:50090</value> </property> <property> <name>dfs.namenode.checkpoint.dir</name> <value>/root/dfs/namesecondary</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> </configuration> |
hadoop-env.sh:
export JAVA_HOME=/usr/local/jdk |
交流q:824203453 大数据人工智能交流QQ群:588946830