多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 集群简介 HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起 HDFS集群: 负责海量数据的存储,集群中的角色主要有 NameNode / DataNode YARN集群: 负责海量数据运算时的资源调度,集群中的角色主要有 ResourceManager /NodeManager (那mapreduce是什么呢?它其实是一个应用程序开发包) 本集群搭建案例,以5节点为例进行搭建,角色分配如下 ~~~ hdp-node-01 NameNode SecondaryNameNode hdp-node-02 ResourceManager hdp-node-03 DataNode NodeManager hdp-node-04 DataNode NodeManager hdp-node-05 DataNode NodeManager ~~~ ![](https://box.kancloud.cn/c4002fd6a8c9058d35a516e45edf35fb_2080x880.png) # 安装 安装jdk,至少1.8 下载hadoop ~~~ wget https://archive.apache.org/dist/hadoop/common/hadoop-3.0.0/hadoop-3.0.0.tar.gz ~~~ # 注意 把下面的有关ip配置成`/etc/hosts`下面的别名对应ip,不然会报错 还有hostname不能搞错 时间同步 # 配置文件 1. 在hadoop-env.sh hadoop下的`/etc/hadoop/` 里面有个`hadoop-env.sh` 把`export JAVA_HOME=/usr/local/jdk8`这个改下,原来是没有值的 2. 在core-site.xml中写 ~~~ <configuration> <!-- 指定hadoop所使用的文件系统schema(URI),HDFS老大(NameNode)的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://192.168.33.12:9000</value> </property> <!-- 指定hadoop运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/root/hadoop3/tmp/hadoop</value> </property> </configuration> ~~~ 3. 在hdfs-site.xml中写 ~~~ <configuration> <property> <name>dfs.namenode.name.dir</name> <value>/root/hadoop3/tmp/namenode</value> </property> <!--路径可以配置多个,挂了的话有多个目录可以恢复,号隔开--> <property> <name>dfs.datanode.data.dir</name> <value>/root/hadoop3/tmp/datanode</value> </property> <!--指定hdfs副本数量,默认是5个,这边设置为1个--> <property> <name>dfs.replication</name> <value>1</value> </property> <!--保证数据备份和管理机制--> <property> <name>dfs.secondary.http.address</name> <value>192.168.33.12:50090</value> </property> </configuration> ~~~ 4. 在mapred-site.xml中写 如果没有这个文件`cp mapred-site.xml.template mapred-site.xml` ~~~ <configuration> <!--指定mr运行在yarn上--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> ~~~ 5. 在yarn-site.xml中写 ~~~ <configuration> <!-- Site specific YARN configuration properties --> <!--指定yarn的老大(ResourceManager)的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>192.168.33.12</value> </property> <!--reducer获取数据的方式--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> ~~~ 6. 将hadoop添加到环境变量`/etc/profile` ~~~ # hadoop export HADOOP_HOME=/root/hadoop3 export PATH=$PATH:$HADOOP_HOME/sbin ~~~ source下 注意这些文件夹要提前创建 如果报一些错误 ~~~ file:///data ~~~ 试下加`file:///`这种的 # 启动 首先要namenode格式下,前面是1版本,后面是2版本 ~~~ hdfs namenode -format(hadoop namenode -format) ~~~ 然后显示 ![](https://box.kancloud.cn/a0876298c71900b1214b7c462b3b0fde_3222x562.png) 表示目录已经被成功初始化了 ~~~ [root@12 current]# pwd /root/hadoop3/tmp/namenode/current [root@12 current]# ls -lah total 16K drwxr-xr-x 2 root root 112 Apr 7 12:31 . drwxr-xr-x 3 root root 21 Apr 7 12:31 .. -rw-r--r-- 1 root root 389 Apr 7 12:31 fsimage_0000000000000000000 -rw-r--r-- 1 root root 62 Apr 7 12:31 fsimage_0000000000000000000.md5 -rw-r--r-- 1 root root 2 Apr 7 12:31 seen_txid -rw-r--r-- 1 root root 212 Apr 7 12:31 VERSION ~~~ 里面fsi什么的是镜像文件 seen_txid是迭代的版本号 然后我们查看下版本号 ~~~ [root@12 current]# cat VERSION #Sat Apr 07 12:31:09 UTC 2018 namespaceID=1413563114 clusterID=CID-6208de96-1ce0-4eea-b3df-f7a81c25f6b3 cTime=1523104269939 storageType=NAME_NODE blockpoolID=BP-871390616-0.0.0.12-1523104269939 layoutVersion=-64 ~~~ 比如我namenode的clusterID是这个,其他的datanode的clusterID也是这个值表示是一个集群 ## 方式一:每个守护线程逐一启动 启动顺序如下: NameNode,DateNode,SecondaryNameNode,JobTracker,TaskTracker Hadoop-daemon.sh:用于启动当前节点的进程 例如Hadoop-daemon.sh start namenode 用于启动当前的名称节点 Hadoop-daemons.sh:用于启动所有节点的进程 例如:Hadoop-daemons.sh start datanode 用于启动所有节点的数据节点 ~~~ [root@12 sbin]# hadoop-daemon.sh start namenode ~~~ ~~~ [root@12 sbin]# hadoop-daemon.sh start datanode WARNING: Use of this script to start HDFS daemons is deprecated. WARNING: Attempting to execute replacement "hdfs --daemon start" instead. ~~~ 这种警告意思就是hadoop这个命令被hdfs替代了 这个命令在各个datanode都要执行 ~~~ [root@12 sbin]# hadoop-daemon.sh start secondarynamenode ~~~ 查看下进程 ~~~ [root@12 sbin]# jps 3856 DataNode 4019 Jps 3988 SecondaryNameNode 3515 NameNode ~~~ 注意最大文件数打开,不然一启动就可能等会就退出了 ~~~ yarn-daemon.sh start resourcemanager yarn-daemon.sh start nodemanager ~~~ ## 前提 **文件最大打开数限制** **ssh免密登录** 注意authorized_keys这个文件里面的东西不要写错,前面ssh不要写成sh,后面也不要少 还有.ssh权限问题 ~~~ # mkdir /root/.ssh # chown -R root:root /home/ansible # chmod 700 /root # chmod 700 /root/.ssh # chmod 644 /root/.ssh/authorized_keys //公钥文件的所有权限 # chmod 600 /root/.ssh/id_rsa //私钥文件的所有权限 ~~~ 其中这两项`PubkeyAuthentication yes` 和`PasswordAuthentication no`的值都要为yes,即公钥认证和密码认证都要为yes,因为我连接的方式是通过这两种方式来连接的, 重启sshd服务 `systemctl restart sshd.service` mac要注意共享设置,允许远程登录 ## 方法二:全部启动或者全部停止 **启动** ~~~ start-all.sh ~~~ 启动顺序:`NameNode,DateNode,SecondaryNameNode,JobTracker,TaskTracker` **停止** ~~~ stop-all.sh ~~~ 关闭顺序性:`JobTracker,TaskTracker,NameNode,DateNode,SecondaryNameNode` ## 方法三:分别启动 首先创建slaves这个文件,在hadoop的配置文件 ~~~ 192.168.33.12 192.169.33.22 192.168.33.3 ~~~ 把这个slaves这个文件放到其他机器上,写完最好检查下 如果是hadoop3的话,这边是workers,不是slaves 启动:分别启动HDFS和yarn ~~~ start-dfs.sh start-yarn.sh ~~~ 这个需要 ### 问题 **问题1** ~~~ Starting namenodes on [localhost] ERROR: Attempting to launch hdfs namenode as root ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting launch. ~~~ 解决: 是因为缺少用户定义造成的,所以分别编辑开始和关闭脚本 ~~~ $ vim sbin/start-dfs.sh $ vim sbin/stop-dfs.sh ~~~ 在空白处添加内容: ~~~ HDFS_DATANODE_USER=root HDFS_SECURE_DN_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root ~~~ **问题2** ~~~ Starting resourcemanager ERROR: Attempting to launch yarn resourcemanager as root ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting launch. Starting nodemanagers ERROR: Attempting to launch yarn nodemanager as root ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting launch. ~~~ ~~~ 解决: 是因为缺少用户定义造成的,所以分别编辑开始和关闭脚本 $ vim sbin/start-yarn.sh $ vim sbin/stop-yarn.sh ~~~ 在空白处添加内容: ~~~ YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root ~~~ # web端查看 访问 `http://192.168.33.12:8088/` ![](https://box.kancloud.cn/84b8aa8ae31b2cd64aab81fea3d63d2f_3130x586.png) 访问 `http://192.168.33.12:9870`,注意,这里是9870,不是50070了: ![](https://box.kancloud.cn/29c80130766c95e6a755245266870df2_1418x534.png) ![](https://box.kancloud.cn/d9f8b6bb844109f5caa022be892a9f3c_1586x558.png) ![](https://box.kancloud.cn/57019a19ac4a2e5dbdaf11f239179542_918x452.png) ![](https://box.kancloud.cn/47b6eaf7244912a3f5519e1fb002a5c8_2000x338.png) ![](https://box.kancloud.cn/c06d638251641aea7dc5364d2274693c_2296x1712.png) ![](https://box.kancloud.cn/46655623abf027c99d60fe9707bd55a4_670x344.png) ## 试用 把这个文件放到文件系统的/下 ~~~ hdfs dfs -put anaconda-ks.cfg / ~~~ 从本地上传一个文本文件到hdfs的/wordcount/input目录下 ~~~ [HADOOP@hdp-node-01 ~]$ HADOOP fs -mkdir -p /wordcount/input [HADOOP@hdp-node-01 ~]$ HADOOP fs -put /home/HADOOP/somewords.txt /wordcount/input ~~~ 查看集群状态 ~~~ hdfs dfsadmin –report ~~~ 查看HDFS中的目录信息 ~~~ hadoop fs –ls / ~~~ 从HDFS下载文件 ~~~ hadoop fs -get /yarn-site.xml ~~~ # 例子 ~~~ cd /root/hadoop2/share/hadoop/mapreduce ~~~ 然后我们计算下圆周率 ~~~ hadoop jar hadoop-mapreduce-examples-2.6.4.jar pi 4 8 ~~~ 任务 ![](https://box.kancloud.cn/47911a976a98b29261c5adafd678fe30_453x243.png)