1.程序运行及截图
注:单机和伪分布式均在docker下的ubuntu:16.04容器环境下完成
1.1单机Hadoop系统安装和运行
运行grep程序
可以正确输出dfs开头的单词,hadoop单机系统搭建成功。
1.2单机伪分布式Hadoop系统安装和运行
(1).免密码SSH访问配置成功,ssh localhost成功
(2).配置core-site.xml和hdfs-site.xml同时也要配置 hadoop-env.sh 文件(之前添加java路径信息的文件),在文件末尾添加一下信息:
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
(3).启动NameNode daemon和DataNode daemon
jps查看到集群状态正常
浏览NameNode的Web接口:
由于是在docker下的容器中,所以只能在主机中访问,用ip代替localhost,访问:http://172.17.0.2:9870/
(4)创建执行MapReduce作业的HDFS目录
这里的username是root,不能随便创建。运行grep程序:
grep程序运行正常,正确输出dfs开头的单词
伪分布式系统搭建完成。
停止deamon
基于yarn的单机伪分布式
(1).启动ResourceManage daemon和NodeManage daemon
注意Yarn是在dfs下运行的,所以此时也要start-dfs.sh
jps查看进程正常
(2)浏览ResourceManager的Web接口
同样在主机中访问,用ip代替localhost,访问:http://172.17.0.2:8088/
Web端口正常
(3).运行程序
Grep程序正确运行,yarn可在伪分布式环境下正确运行
1.3集群Hadoop系统安装和运行(基于 Docker )
(1).Hadoop安装主要为集群做准备,故修改hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml和workers文件
我拉取镜像之后创建了五个容器
但是五个容器运行有些卡顿,后修改为三个
启动h01’作为master节点,故暴露端口号以供访问web页面(2)启动集群
第一次启动要进行格式化,后续不必
此时访问本机的 8088 与 9870 端口就可以看到监控信息(截图不展示了,后续运行程序会展示节点信息)
使用命令 ./hadoop dfsadmin -report 可查看分布式文件系统的状态
五个主机作为datanode均正常运行(只展示一个节点的状态信息)(3)运行grep程序,直接卡死
运行worldcount程序正常证明hadoop集群安装正常,但是yarn的资源调度参数需要调整
(4)调整yarn 关于资源参数
主要是配置如下三个方面:每个Map和Reduce可用物理内存限制;对于每个任务的JVM对大小的限制;虚拟内存的限制;单个容器可申请的最小与最大内存是最关键,其过大是直接导致虚拟机卡死的重要因素。(后面会详细介绍)
调整参数后运行grep程序,运行成功
访问本机的 8088 与 9870 端口就可以看到监控信息
2.问题及解决方案总结
关于主机名host的问题,主要为java.net.UnknowHostExcertion:的问题
解决方法:
可能是因为/hosts文件的错误,缺少ip 和主机名的映射,添加[127.0.0.1 主机名]的映射
也可能是由于etc/sysconfig/network文件错误,确认HOSTNAME=localhost.localdomain 是否正确(为localhost或者自己的主机名),同时也要保证localhost在/etc/hosts文件中映射为正确的IP地址,然后重新启动网络服务。
java.net.ConnectionException:Connection refused相关的问题
这个问题可能是由很多配置或者启动问题导致的,要详细阅读后续提示,具体是哪个端口连接不上。
截图中是一个常见的配置错误的问题。
首先解释一下文件core-site.xml中参数配置的具体含义,
fs.defaultFS
hdfs://h01:9000 hadoop.tmp.dir file:/data/hadoop/hadoop-2.6.0/tmp
fs.checkpoint.period 3600 所以要保证在不同阶段(单机、伪分布、集群)时候,NameNode的地址是要正确的。
也有可能是防火墙的问题
我在集群中配置的端口是9000,防火墙是iptables,开放该端口:iptables -A INPUT -p tcp NEW --dport 9000 -j ACCEPT
esrvice iptables save 将操作保存到/etc/sysconfig/iptables ,若提示命令不存在,则先安装 yum install iptables-services
没有初始化或者初始化错误也会出现这个问题,重新初始化即可
Root相关的问题
课件上遗漏对hadoop-env.sh 文件的相关配置修改
加入以下配置:
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster
Java类配置遗漏的问题
找到{HADOOP_HOME}
mapreduce.map.env
HADOOP_MAPRED_HOME={HADOOP_HOME}
yarn 关于资源配置参数设置
由于我是在虚拟机下运行的docker,运行内存小导致了grep程序运行卡死的情况,要反复调整yarn 关于资源配置参数设置来使程序正常运行和虚拟机不卡死,这主要和虚拟机分配的内存大小和CPU数量来决定参数,具有个体差异性。
首先介绍一下yarn-site.xml 中各个关于资源配置的参数
yarn.scheduler.minimum-allocation-mb
yarn.scheduler.maximum-allocation-mb
说明:单个容器可申请的最小与最大内存,应用在运行申请内存时不能超过最大值,小于最小值则分配最小值,从这个角度看,最小值有点想操作系统中的页。注:这两个值一经设定不能动态改变(此处所说的动态改变是指应用运行时)。
默认值:1024/8192
yarn.scheduler.minimum-allocation-vcores
yarn.scheduler.maximum-allocation-vcores
参数解释:单个可申请的最小/最大虚拟CPU个数。比如设置为1和4,则运行MapRedce作业时,每个Task最少可申请1个虚拟CPU,最多可申请4个虚拟CPU。
默认值:1/32
yarn.nodemanager.resource.memory-mb
yarn.nodemanager.vmem-pmem-ratio
说明:每个节点可用的最大内存,RM中的两个值不应该超过此值。即:用此值除以RM中的最小容器内存。虚拟内存率,是占task所用内存的百分比,默认值为2.1倍;注意:第一个参数是不可修改的,一旦设置,整个运行过程中不可动态修改,且该值的默认大小是8G,即使计算机内存不足8G也会按着8G内存来使用。
默认值:8G /2.1
yarn.nodemanager.resource.cpu-vcores
参数解释:NodeManager总的可用虚拟CPU个数。
默认值:8
同时也要调整mapred-site.xml中各个关于资源配置的参数
mapreduce.map.memory.mb
mapreduce.reduce.memory.mb
说明:这两个参数指定用于MapReduce的两个任务(Map and Reduce task)的内存大小,其值应该在RM中的最大最小container之间。如果没有配置则通过如下简单公式获得:
max(MIN_CONTAINER_SIZE, (Total Available RAM) / containers))
一般的reduce应该是map的2倍。注:这两个值可以在应用启动时通过参数改变;
AM中其它与内存相关的参数,还有JVM相关的参数,这些参数可以通过,如下选项配置:
mapreduce.map.java.opts
mapreduce.reduce.java.opts
说明:这两个参主要是为需要运行JVM程序(java、scala等)准备的,通过这两个设置可以向JVM中传递参数的,与内存有关的是,-Xmx,-Xms等选项。此数值大小,应该在AM中的map.mb和reduce.mb之间。
我个人配置过程中大概总结如下,当配置Yarn内存的时候主要是配置如下三个方面:每个Map和Reduce可用物理内存限制;对于每个任务的JVM对大小的限制;虚拟内存的限制;单个容器可申请的最小与最大内存是最关键,过大是直接导致虚拟机卡死的重要因素。