Hadoop分布式集群搭建

写在前面

之前已经搭过Hadoop伪分布式,这次就大致说说分布式是怎么回事,其实他们也就是配置文件不一样,其他都是差不多的,但是为了更熟悉相关操作,我还是建立了三台虚拟机,从头搭起(为了更好的体验,我特地加了内存条,心疼我的钱啊)当然,搭建的方法不限于这一种,且顺序也不一定相同,我只是按自己的来

框图

其实里面很核心的一个东西HDFAS(Hadoop Distributed File System),Hadoop分布式文件系统,我们将庞大的数据存储在这。我们的主节点中有NameNode,ResourceManager,SecondaryNameNode。然后的两个slave节点中放DataNode,NodeManager.

第一步 建立虚拟机

推荐使用CentOs,真的非常好用,一开始我们就建立一个就可以了(这个就不用我再说明了),然后安装完成我们可以进行克隆,然后就得到另外两台机子,当然,我们得重新配置这两个Slave,把内存调成1G,处理器都调成1,当然,如果你的机子配置好的可怜,可以当我这是句废话。然后开机,设置成开机默认以黑窗启动,不要开图形界面,否则卡的要死。。。。

之前看某些文章说手动配置三台机子的IP,其实这个没什么必要,动态分配也是可以的,手动的话反而麻烦,如果说有什么必要性的话,目前还是学习阶段,瞎捣鼓就是要命。

然后我们用Xshell连接上三台虚拟机,这样操作实在是方便舒服。(Putty也还可以啦)

第二步 hostname设置

每台虚拟机中设置hostname

1
2
3
4
5
sudo vi /etc/sysconfig/network
然后编辑下列文本
NETWORKING=yes
HOSTNAME=master   #master中就写master,slave1就写slave1,2就写2
#当然,你名字可以随便取,不一定像我这样master啊。。。

然后设置hostname与IP的映射

1
2
3
4
5
sudo vi /etc/hosts
然后在文本最底下添加
192.168.xxx.xxx master #IP地址是你的虚拟机的,你可以使用ifconfig查看
192.168.xxx.xxx slave1
192.168.xxx.xxx slave2

注意啊,如果你的hostname没改的话,去 /etc/hostname改

角色的分配

master: NameNode DataNode ResourceManager NodeManager SecondaryNameNode

slave1:DataNode NodeManager

Slave2:DataNode NodeManager

SSH 免密登录

为了省去每次登录输入密码的操作(人的本性懒)我们设置ssh免密登录

1
ssh-keygen -t rsa #生成key

然后一路回车(每个虚拟机都要生成一次)

然后你 ls -al会看到一个隐藏文件夹 .ssh,我们的key就在里面

2

我们进去会看到3

然后我们不是确定了master为老大么,我们分别使用

1
2
3
ssh-copy-id -i ~/.ssh/id_rsa.pub master
ssh-copy-id -i ~/.ssh/id_rsa.pub slave1
ssh-copy-id -i ~/.ssh/id_rsa.pub slave2

将key传到本地跟另外两台机器,然后每个./ssh里面会多个 authorized_keys文件 然后你就可以使用 ssh master(或是ssh slave1或是ssh slave2登录了)

jdk安装

这个具体我就不说了,详情参照伪分布那篇文章,不过这次我是在 home中建了个app文件夹,方便我后面操作,所以环境变量配置也是要配置正确

1
2
3
4
5
sudo vi /etc/profile
#然后在最底下键入
export JAVA_HOME=/root/app/jdk  #这里是你jdk的安装路径
export PATH=$JAVA_HOME/bin:$PATH
#保存并退出,然后source /etc/profile 生效一下

Hadoop安装

我将Hadoop安装包解压至我建立的app文件夹中,然后配置Hadoop环境变量

1
2
3
4
5
sudo vi /etc/profile
#在刚才Jdk下面键入
export HADOOP_HOME=/root/app/hadoop #这是你Hadoop的安装路径
export PATH=$HADOOP_HOME/bin:$PATH
#保存并退出,然后source /etc/profile 生效一下

Hadoop文件配置

hadoop-env.sh的配置

进入 cd ~/app/hadoop/etc/hadoop,然后ls会看到一大堆配置文件

先配置hadoop-env.sh,

1
2
3
sudo vi hadoop-env.sh
#找到 export JAVA_HOME=${JAVA_HOME}${java_home}改成你的java_home路径

core-site.xml配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
sudo vi core-site.xml
#键入配置
<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://master:9000</value>  #这里是你的主机名
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/usr/local/soft/hadoop-2.6.0/tmp</value>
        </property>
	    <property>
                 <name>fs.trash.interval</name>
                 <value>1440</value>
        </property>
</configuration>

hdfs-site.xml配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
sudo vi hdfs-site.xml
#添加
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
</configuration>

mapred-site.xml配置

这个文件一开始是叫做mapred-site.xml.template 模板啊。所以使用

mv mapred-site.xml.template mapred-site.xml 修改文件名

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
sudo vi mapred-site.xml
#添加
<configuration>
   <property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
	<property>  
		<name>mapreduce.jobhistory.address</name>  
		<value>master:10020</value>  
	</property>  
	<property>  
		<name>mapreduce.jobhistory.webapp.address</name>  
		<value>master:19888</value>  
	</property> 
</configuration>

yarn-site.xml配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
sudo vi yarn-site.xml
#添加
<configuration>
    <property>
		<name>yarn.resourcemanager.hostname</name>
		<value>master</value>
	</property>
	<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配置

顾名思义,这个就是将我们的slave放进去

1
2
3
4
5
6
sudo vi slaves
#删去原有的localhost,添加
master
slave1
slave2

当然这些配置hadoop官网都有说明,如果想更细节地了解,请前去看看。下面是官网对于这些配置中的参数说明4

5

分发到另外两台机器

我们目前的配置都是在master上操作的,但是我们必须得保证每台机器都有这样的配置,所以我们需要将master上的app 分发到slave1 和slave2上(这就是我单独建立app文件夹的原因,因为我需要进行分发,所以,将hadoop,jdk都放在其中,便于打包发过去)

我们使用的命令是

1
2
3
4
5
scp -r ~/app hadoop@slave1:~/
#这里hadoop@slave1就是你终端前面那个东西,:后面是你分发到的文件路径,
#最好跟master一样,要不然环境变量里面路径得改
#-r是递归的意思,app中所有文件全部分发
scp -r ~/app hadoop@slave2:~/

当然,.bash_profile也要发的

1
2
3
scp ~/.bash_profile hadoop@slave1:~/
scp ~/.bash_profile hadoop@slave2:~/
#这个东西分发过去别忘了生效

然后就是漫长的等待

NameNode格式化

这一步在master上执行,进入 cd /app/hadoop/bin/ 然后执行

1
./hdfs namenode -format

6

显示上图则成功

启动Hadoop

这里先关闭防火墙,systemctl stop firewalld

然后我们进入 cd /app/hadoop/sbin/ , ls查看一下sbin下有哪些文件

7

然后我们开始启动hadoop

1
./start-all.sh  #启动所有,当然也可以一个一个启动

启动完毕我们执行jps命令,master中出现

1
2
3
4
5
namenode
secondarynamenode
datanode
resourcemanager
nodemanager

slave1中出现

1
2
datanode
nodemanager

slave2中出现

1
2
datanode
nodemanager

由此,分布式Hadoop集群搭建完毕

后话

其实如果只是学习,不是非得用分布式,与其折磨自己,还不如先用伪分布将hadoop玩玩透,其实就与分布式没差,都是一样的。