1、集群部署介绍
1.1 Hadoop简介
Hadoop是Apache软件基金会旗下的一个开源分布式计算平台。以Hadoop分布式文件系统(HDFS,HadoopDistributed
Filesystem)和MapReduce(Google MapReduce的开源实现)为核心的Hadoop为用户提供了系统底层细节透明的分布式基础架构。
对于Hadoop的集群来讲,可以分成两大类角色:Master和Salve。一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件系统的访问操作;集群中的DataNode管理存储的数据。MapReduce框架是由一个单独运行在主节点上的JobTracker和运行在每个集群从节点的TaskTracker共同组成的。主节点负责调度构成一个作业的所有任务,这些任务分布在不同的从节点上。主节点监控它们的执行情况,并且重新执行之前的失败任务;从节点仅负责由主节点指派的任务。当一个Job被提交时,JobTracker接收到提交作业和配置信息之后,就会将配置信息等分发给从节点,同时调度任务并监控TaskTracker的执行。
从上面的介绍可以看出,HDFS和MapReduce共同组成了Hadoop分布式系统体系结构的核心。HDFS在集群上实现分布式文件系统,MapReduce在集群上实现了分布式计算和任务处理。HDFS在MapReduce任务处理过程中提供了文件操作和存储等支持,MapReduce在HDFS的基础上实现了任务的分发、跟踪、执行等工作,并收集结果,二者相互作用,完成了Hadoop分布式集群的主要任务。
1.2 环境说明
本平台使用ubuntu搭建
集群中包括4个节点:1个Master,1个Master备份节点,一个nfs节点,4个Salve,节点之间虚拟局域网连接,可以相互ping通。节点IP地址分布如下:
机器名称 |
IP地址 |
Nistest.nfsMaster |
Echo:192.168.1.160 |
nistest.master(主节点) |
eth0:192.168.1.161 |
Nistest.backup |
eth1: eth0:0: 192.168.1.162
|
nistest.node1(slave) |
eth0:192.168.1.163 |
nistest.node2(slave) |
eth0:192.168.1.164 |
nistest.node3(slave) |
eth0:192.168.1.165 |
nistest.node4(slave) |
eth0:192.168.1.165 |
六个节点上均是ubuntu12.04系统,并且有一个相同的用户hadoop。Master(和backup)机器主要配置NameNode和JobTracker的角色,负责总管分布式数据和分解任务的执行;4个Salve机器配置DataNode和TaskTracker的角色,负责分布式数据存储以及任务的执行。
1.3 网络配置
Hadoop集群要按照1.2小节表格所示进行配置。
下面的例子我们将以Master机器为例,即主机名为"nistest.master",IP为"192.168.1.161"进行一些主机名配置的相关操作。其他的Slave机器以此为依据进行修改。
1)查看当前机器名称
用hostname命令进行显示机器名称,
如果跟规划的不一致,要按照下面进行修改。
sudo vim /etc/hostname
修改成nistest.master
2)修改当前机器名称
nistest.master
3)配置hosts文件(必须)
"/etc/hosts"这个文件是用来配置主机将用的DNS服务器信息,是记载LAN内接续的各主机的对应[HostName和IP]用的。当用户在进行网络连接时,首先查找该文件,寻找对应主机名(或域名)对应的IP地址。
机器为"nistest.master:192.168.1.161"对机器为"nistest.node1:192.168.1.163"用命令"ping"记性连接测试。
ping nistest.node1会失败
而直接ping ip地址,会ping通
直接对IP地址进行测试,能够ping通,但是对主机名进行测试,发现没有ping通,提示"unknownhost——未知主机"。
所以要在进行Hadoop集群配置中,需要在"/etc/hosts"文件中添加集群中所有机器的IP与主机名,这样Master与所有的Slave机器之间不仅可以通过IP进行通信,而且还可以通过主机名进行通信。所以在所有的机器上的"/etc/hosts"文件末尾中都要添加如下内容:
用以下命令进行添加:sudo vim /etc/hosts
添加结果如下:
现在我们在进行对机器为"Slave1.Hadoop"的主机名进行ping通测试,看是否能测试成功。
2、SSH无密码验证配置
Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure
Shell)来启动和停止各个DataNode上的各种守护进程的。这就必须在节点之间执行指令的时候是不需要输入密码的形式,故我们需要配置SSH运用无密码公钥认证的形式,这样NameNode使用SSH无密码登录并启动DataName进程,同样原理,DataNode上也能使用SSH无密码登录到
NameNode。
2.1 安装和启动SSH协议
通过下面命令进行安装。
apt-get install ssh 安装SSH协议;
apt-get install rsync (rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件);
确保所有的服务器都安装,上面命令执行完毕,各台机器之间可以通过密码验证相互登。
2.2 配置Master无密码登录所有Salve
1)SSH无密码原理
Master(NameNode |JobTracker)作为客户端,要实现无密码公钥认证,连接到服务器Salve(DataNode
| Tasktracker)上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当Master通过
SSH连接Salve时,Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。重要过程是将客户端Master复制到Slave上。
2)Master机器上生成密码对
在Master节点上执行以下命令:ssh-keygen –t rsa –P ''
这条命令是生成其无密码密钥对,询问其保存路径时直接回车采用默认路径。生成的密钥对:id_rsa和id_rsa.pub,默认存储在"/home/hadoop/.ssh"目录下。
接着在Master节点上做如下配置,把id_rsa.pub追加到授权的key里面去。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
验证是否成功。
ssh localhost
2)设置SSH配置
把公钥复制所有的Slave机器上。使用下面的命令格式进行复制公钥:
scp ~/.ssh/id_rsa.pub 远程用户名@远程服务器IP:~/
例如:scp ~/.ssh/id_rsa.pub hadoop@192.168.1.163:~/.ssh
上面的命令是复制文件"id_rsa.pub"到服务器IP为"172.21.13.49"的用户为"hadoop"的"/home/hadoop/"下面。
下面就针对IP为"192.168.1.163"的nistest.node1的节点进行配置。
1)把nistest.master上的公钥复制到nistest.node1上
2)追加到授权文件"authorized_keys"
到目前为止Master.Hadoop的公钥也有了,文件夹".ssh"也有了,且权限也修改了。这一步就是把nistest.master的公钥追加到nistest.node1的授权文件"authorized_keys"中去。使用下面命令进行追加并修改"authorized_keys"文件权限:
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
5)在nistest.master使用SSH无密码登录nistest.node1
当前面的步骤设置完毕,就可以使用下面命令格式进行SSH无密码登录了。
3、Java环境安装
所有的机器上都要安装JDK,现在就先在Master服务器安装,然后其他服务器按照步骤重复进行即可。安装JDK以及配置环境变量,需要以"root"的身份进行。
java环境的详细安装配置见(jdk安装说明.docx,文件见附属)
4、Hadoop集群安装
所有的机器上都要安装hadoop,现在就先在Master服务器安装,然后其他服务器按照步骤重复进行即可。安装和配置hadoop需要以"root"的身份进行。
4.1 安装hadoop
首先用root用户登录"nistest.node1"机器,查看我们之前用FTP上传至"/home/Hadoop"上传的"hadoop-1.2.1.tar.gz"。
文件上传可以使用xmanager,参考文件见(xmanagers使用)
接着把" hadoop-1.2.1.tar.gz"复制到"/usr/local"目录下面。
cp /home/hadoop/hadoop-1.0.0.tar.gz /usr/local
下一步进入"/usr"目录下,用下面命令把" hadoop-1.2.1.tar.gz"进行解压,并将其命名为"hadoop",把该文件夹的读权限分配给普通用户hadoop,然后删除"
hadoop-1.2.1.tar.gz"安装包。
cd/usr/local sudotar-zxfhadoop-1.2.1.tar.gz |
将解压出的文件夹改名为hadoop;
1 |
sudomvhadoop-1.2.1.tar.gz hadoop |
4. 将该hadoop文件夹的属主用户设为hadoop,
1 |
sudochown-R hadoop:hadoop hadoop |
5. 打开hadoop/conf/hadoop-env.sh文件;
1 |
sudogedit hadoop/conf/hadoop-env.sh |
6. 配置conf/hadoop-env.sh(找到#export JAVA_HOME=...,去掉#,然后加上本机jdk的路径);
1 |
export JAVA_HOME=/usr/lib/jdk//jdk1.7.0_25 |
4.2 配置hadoop
1)配置hadoop-env.sh
该"hadoop-env.sh"文件位于"/usr/local/hadoop/conf"目录下。
在文件的末尾添加下面内容。
Hadoop配置文件在conf目录下,之前的版本的配置文件主要是Hadoop-default.xml和Hadoop-site.xml。由于
Hadoop发展迅速,代码量急剧增加,代码开发分为了core,hdfs和map/reduce三部分,配置文件也被分成了三个core-
site.xml、hdfs-site.xml、mapred-site.xml。core-site.xml和hdfs-site.xml是站在
HDFS角度上配置文件;core-site.xml和mapred-site.xml是站在MapReduce角度上配置文件。
配置文件目录下几个比较重要的配置文件如下(需要配置):
hadoop-env.sh |
hadoop启动时所需要的一些环境变量的设置,其中比较常用的环境变量的设置就是JAVA_HOME。 |
core-site.xml |
hadoop一些核心内容的设置,其中包括HDFS和MapReduce的基本设置。 |
hdfs-site.xml |
HDFS的配置。 |
mapred-site.xml |
MapReduce的设置。 |
masters |
secondary namenode的主机名或是IP地址,在hadoop中jobtracker和 namenode的主机的确定是由hadoop的启动脚本在哪台机器上运行决定的。 |
slaves |
datanodes和tasktrackers的主机名或是IP地址。 |
c) core-site.xml的配置
2)配置core-site.xml文件
修改Hadoop核心配置文件core-site.xml,这里配置的是HDFS的地址和端口号。
(我曾经犯下一个错误,在我加班非常累,大脑稍有混乱的时候,不小心删除执行了一个命令“hadoopfs -rmr /xxx/xxx”,没有删除提示,几TB的数据,一下子就没有了。简直让我崩溃,后悔莫及。这时你多希望有个时间机器可以让HDFS恢复到删除前的状态。
trash功能就是这个时间机器,它默认是关闭的,开启后,被你删除的数据将会mv到操作用户目录的".Trash"文件夹,可以配置超过多长时间,系统自动删除过期数据。这样一来,当操作失误的时候,可以把数据mv回来。开启垃圾箱步骤如下:
vi core-site.xml ,添加下面配置,value单位为分钟。
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
)
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
<property>牋
牋<name>fs.default.name</name>牋
牋<value>hdfs://nistest.master</value>牋?
<final>true</final>
?/property>牋
</configuration>
备注:如没有配置hadoop.tmp.dir参数,此时系统默认的临时目录为:/tmp/hadoo-hadoop。而这个目录在每次重启后都会被干掉,必须重新执行format才行,否则会出错。
用下面命令进行编辑:
3)配置hdfs-site.xml文件
修改Hadoop中HDFS的配置,配置的备份方式默认为3。
(配置secondary节点信息)
修改hdfs-default.xml 文件
<property>
<name>dfs.http.address</name>
<value>client148.hadoop.local:50070</value>
</property> (NameNode节点开放的HTTP服务,是由Secondary 节点获取fsimage ,edits 文件的通道)
<property>
<name>dfs.secondary.http.address</name>
<value>client147.hadoop.local:50090</value>
</property> (Secondary节点开放的HTTP服务,是由NameNode节点获取新的fsimage 文件的通道)配置完下面的后再添加也可以,用来配置secondarynamenode
<!-- Putsite-specific property overrides in this file. -->
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/usr/local/hadoop/datalog1,/usr/local/hadoop/datalog2</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/usr/local/hadoop/data1,/usr/local/hadoop/data2</value>
</property>
<property>
<name>dfs.http.address</name>
<value>nistest.master:50070</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>nistest.backup:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
~
(备注:replication是数据副本数量,默认为3,salve少于3台就会报错)
用下面命令进行编辑:
4)配置mapred-site.xml文件
修改Hadoop中MapReduce的配置文件,配置的是JobTracker的地址和端口。
<configuration>
<property>牋?
牋牋牋<name>mapred.job.tracker</name>牋
牋牋牋<value>nistest.master:8021</value>牋?
牋牋?/property>牋
<property>
<name>mapred.local.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
</configuration>~
用下面命令进行编辑:
5)配置masters文件
编辑内容如下:(此处masters内容放的不是包含master节点,而是全部都是secondarynamenode,所以如果想master节点不允许secondarynamenode则在此文件中删除nistest.master)
Nistest.backup(添加入此节点作为secondarynamenode)
6)配置slaves文件(Master主机特有)
去掉"localhost",每行只添加一个主机名,把剩余的Slave主机名都填上。
例如:添加形式如下
配置文件配置完成后,将整个conf目录复制到每台机器上的<hadoop安装目录>下。
命令如下
scp-r ./conf hadoop@nistest.node4:/usr/local/hadoop/
scp命令介绍:
复制目录:
* 命令格式:
scp -r local_folder remote_username@remote_ip:remote_folder
或者
scp -r local_folder remote_ip:remote_folder
第1个指定了用户名,命令执行后需要再输入密码;
第2个没有指定用户名,命令执行后需要输入用户名和密码;
* 例子:
scp -r /home/space/music/ root@www.cumt.edu.cn:/home/root/others/
scp -r /home/space/music/ www.cumt.edu.cn:/home/root/others/
上面 命令 将 本地 music 目录 复制 到 远程 others 目录下,即复制后有 远程 有 ../others/music/ 目录
4.3 启动及验证
1)格式化HDFS文件系统
在"nistest.master"上使用普通用户hadoop进行操作。(备注:只需一次,下次启动不再需要格式化,只需 start-all.sh)
如果需要重新格式化的最好是将每个节点下的数据存储节点比如此系统中就是data1,跟data2删除掉,不然格式化后会出现问题,当然原来的数据就丢失了
bin/hadoop namenode -format
2)启动hadoop
在启动前关闭集群中所有机器的防火墙,不然会出现datanode开后又自动关闭。
sudo ufw disable
使用下面命令启动。
start-all.sh
3)停止hadoop
使用下面命令停止hadoop集群
stop-all.sh
4)验证hadoop启动成功
(1)验证方法:用"jps"命令
在nistest.master上用 java自带的小工具jps查看进程。
如果将slaves文件中的nistest.master删除掉,那么就是正常的系统显示
在nistest.node1上用jps查看进程。
4.4 网页查看集群
1)访问"http://192.168.1.161:50030"
因为我的slaves节点加入了master,总共有五个,一般正式的系统中是不建议启用master节点作为slave的,尽量减少其负担
2)访问"http://192.168.1.161:50070"
5 运行WordCount程序
单词计数是最简单也是最能体现MapReduce思想的程序之一,可以称为MapReduce版"Hello
World",该程序的完整代码可以在Hadoop安装包的"src/examples"目录下找到。单词计数主要完成功能是:统计一系列文本文件中每个单词出现的次数,如下图所示。
5.1 准备工作
现在以"hadoop"普通用户登录"nistest.master"服务器。
1) 创建本地示例文件
首先创建一个目录,在这里使用input命名:
然后在input中新建test1,跟test2两个文本文件并在文件中分别些人“hello world”“hello hadoop”
然后讲本地文件系统上input目录复制到hdfs的根目录下,重命名为“in“,”out“为数据处理完成后的输出目录,默认存放在分布式文件系统用户的根目录下,执行以下的命令:
执行完成后,查看hadoop分布式文件系统上数据处理的结果,执行
另外用户也可以把输出文件从hadoop分布式文件系统复制到本地文件系统查看,具体命令:bin/hadoop dfs –getout output
Cat output/*
备注:以input作为输入目录,output目录作为输出目录。已经编译好的WordCount的Jar在"/usr/local/hadoop"下面,就是"hadoop-examples-1.2.1.jar",所以在下面执行命令时记得把路径写全了,不然会提示找不到该Jar包。
2)MapReduce执行过程显示信息
Hadoop命令会启动一个JVM来运行这个MapReduce程序,并自动获得Hadoop的配置,同时把类的路径(及其依赖关系)加入到Hadoop的库中。以上就是Hadoop
Job的运行记录,从这里可以看到,这个Job被赋予了一个ID号:,而且得知输入文件有两个(Total
inputpaths to process : 2),同时还可以了解map的输入输出记录(record数及字节数),以及reduce输入输出记录。比如说,在本例中,map的task数量是2个,reduce的task数量是一个。map的输入record数是2个,输出record数是4个等信息。
5.3 查看结果
1)查看HDFS上output目录内容
从上图中知道生成了2个文件,我们的结果在"part-r-00000"中。
2)查看结果输出文件内容