在看这一篇之前请先看:https://www.jianshu.com/p/bcb2f77d90e8 单机搭建Hadoop 保证可以熟悉hadoop的单机配置,这样不至于无脑粘贴xml文件内容导致各种问题。这边单机部署采用的是hadoop3这边我们回归到hadoop2.7去搭集群,其实都一样。
1.准备
本次要求准备三台服务器,这边演示使用VMware开了三个环境。
192.168.20.3 Master
192.168.20.4 Slave1
192.168.20.5 Slave2
这里要说一下,首先三个环境都要有一个相同名字的用户,我创建了hadoop用户,并互相配置好互信。
我们一步一步进行。
在Master/Slave1/Slave2的环境,执行命令sudo vim /etc/hosts
然后创建hadoop用户,我再Master已经有hadoop用户了,这边在Salve1和Slave2创建。原因就是如果我们不使用相同名字的用户,ssh配置会比较麻烦,很容易用自身用户名去做另外机器的用户名,从而出现用户无权限的问题。
具体创建方法:
root权限下分别执行
adduser hadoop
passwd hadoop
然后visudo
修改一下内容,给hadoop用户权限。
然后配置互信,执行ssh-keygen -t rsa
创建目录,和之前一样,这里不做赘述。唯一要提醒的一点是:
ssh 对目录的权限有要求,代码中要设置下新生成的config文件权限才行。
~目录权限是750,~/.ssh 的是700, ~/.ssh/* 的是600,~/.ssh/config 是700
否则容易出现权限问题。
配置好了之后,三台机器两两互信。可以采用两种方式:
1.ssh-copy-id -i
2.直接互相把ras.pub的内容粘贴到 authorized_keys 文件中。
都可以,我用的第二种,比较暴力,注意,一定要看好用户!!!别问我怎么知道的。
配置好了检查一下,如果互相可以ssh ip date
就证明成功啦!比如在Master进行 ssh Slave1 date
第一次要写个yes再回车,等第二次就可以直接不输入密码得到结果了。这样准备工作就完成了。
2.正式搭建
集群和单机的区别就是准备工作稍微复杂一些。其他的差不多,我们把Master作为主节点,NameNode和ResourceManager都在主节点上,这边我把Secondary NameNode也放在主节点上了。Slave1和Salve2作为从节点,主要运行NodeManager和DataNode。
简单解释一下:
- NameNode:主要是管理文件系统的命名空间,维护文件系统树和文件与目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和日志编辑文件。应该放在主节点上。
- DataNode:文件系统的工作节点。他们需要储存并检索数据块,并且定期向NameNode发送他们所储存的块的列表。适合放在Slave节点上。
- Secondary NameNode:辅助NameNode,它不能当作NameNode。定期合并编辑日志与命名空间镜像,防止编辑日志过大,一般单独的物理机上运行,当然也可以放主节点上。
- ResourceManager:基于程序对资源的需求进行调度,是一个中心服务,做的工作就是去调度、启动每一个 Job 所属的 ApplicationMaster、另外监控 ApplicationMaster 的存在情况。放主节点上。
- NodeManager:是每台机器框架代理,是执行应用程序的容器,监控应用程序资源的使用情况(CPU,内存,硬盘,网络)。然后向调度器也就是ResourceManager进行汇报。
好了!我们现在Master机器上搞事情!
在hadoop目录下,创建一个dfs目录,里面创建三个文件夹,分别是name、data、namesecondary
如果完成过之前帖子的单机部署那么我们需要,清理一下里面的current文件夹,直接删掉就ok。防止因为Version问题导致的不同步从而无法启动。
我又创建了一个tmp文件夹
hadoop下目录结构应该是这样的:
好的,那么我们去etc/hadoop目录下去依次修改配置文件!
再一次注意!里面的路径和端口号不要无脑粘贴,请根据自己具体的路径去配置。
首先修改的是hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/soft/hadoop-2.7.1/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/soft/hadoop-2.7.1/dfs/data</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Master:50090</value>
</property>
</configuration>
然后是core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/soft/hadoop-2.7.1/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
</configuration>
然后是mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
然后是yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Master</value>
</property>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
最后是slaves文件
Slave1
Slave2
好的!!这样Master就配置好了!!!接下来就是配置Slave1和Slave2的时间了!我们可以采用简单暴力的方式去搞。直接把Master的hadoop文件夹传过去!对!就是直接传过去就行了,啥都不用改。
执行一下hdfs namenode -format
格式化
如果成功了证明没啥问题,直接启动所有!start-all.sh
等待之后我们用jps
指令看一下
Master:
Slave1:
Slave2:
证明节点都正常。去web ui去看一下是否真正常。
我是去Master的50070端口查看
点击Datanodes选项卡可以看到:
可以看到Slave1和Slave2的DataNode也都真实存在,证明集群部署成功!可以使用啦~!
PS:如果最后结果不正常,请分别查看hadoop的logs文件夹下的日志文件。会有错误提示。