因为机器学习,接触到了数据挖掘;因为数据挖掘,接触到了大数据;因为大数据,接触到了hadoop。之前有过hadoop的简单了解,但都是基于别人提供的hadoop来学习和使用,虽然也很好用 ,终究不如自己的使用起来方便 。经过这两天参考大量网上的经验,终于成功的搭建了自己的hadoop完全分布式环境。现在我把所有的安装思路、安装过程中的截图以及对待错误的经验总结出来,相信安装这个思路去做,hadoop安装就不再是一件困难的事。
我自己是搭建的完全分布式的hadoop,就涉及到了创建若干个虚拟机并使它们能够互通。所以我整个hadoop安装能够分为三个独立的部分:1、linux 虚拟机详细搭建过程;2、hadoop完全分布式集群安装;3、hadoop 自带示例wordcount 的具体运行步骤。本文介绍第二部分。
Hadoop是APache软件基金会旗下的的开源分布式计算平台。以Hadoop 分布式文件系统HDFS(Hadoop Distributed File System) 和MapReduce 为核心,为用户提供了系统底层细节透明的分布式基础架构。
对于Hadoop集群来说,分为两大类角色:Master 和 Slave 。一个HDFS集群是由一个NameNode 和若干个DataNode 组成。其中NameNode 作为主服务器,管理文件系统的命名空间和客户端对文件系统的访问操作;集群中的DataNode 管理存储的数据。 MapReduce 框架是由一个单独运行在主节点的JobTracker和运行在每个从节点的TaskTracker 共同组成的。主节点负责调度构成一个作业的所有任务,这些任务分布在不同的从节点上。主节点监控从节点的执行情况,并且重新执行之前的失败任务。当一个Job被提交,JobTracker 接收到提交作业和配置信息之后,就会将配置信息等分发给从节点,同时调度任务并监控TaskTracker的执行。
从上面可以看出,HDFS和MapReduce 共同组成了Hadoop分布式系统体系结构的核心。HDFS 在集群上实现了分布式文件系统,MapReduce 在集群上实现了分布式计算和任务处理。HDFS 为MapReduce任务处理过程中提供了文件操作和存储等支持,MapReduce 在HDFS的基础上实现了任务的分发、跟踪、执行等操作,并收集结果,二者相互作用,完成了Hadoop分布式集群的主要任务。
在上一篇文章中,我已经详细介绍了我的虚拟机搭建和配置过程。我一共使用了三个虚拟机,其中,一个作为Master ,二个作为Salve ,三个节点之间已经能够实现ping通。
先简单说明下配置hosts文件的作用,它主要用于确定每个结点的IP地址,master结点能快速查到并访问各个结点。在上述3个虚机结点上均需要配置此文件。由于需要确定每个结点的IP地址,所以在配置hosts文件之前需要先查看当前虚机结点的IP地址是多少,可以通过ifconfig命令进行查看,如本实验中,node1结点的IP地址为:
在获取到每个结点的IP地址后,就可以配置hosts文件了,hosts文件路径为 /etc/hosts,我的hosts文件配置如下,大家可以参考自己的IP地址以及相应的主机名完成配置
节点的IP地址分布如下所示:
这样在三个虚拟机上配置完成之后,我们再让他们相互连接时就不需要再输入ip地址了,而是直接输入主机名字,下面是我使用master去ping node1的情况
即为hadoop集群专门设置一个用户组及用户:
groupadd hadoop //设置hadoop用户组
useradd –s /bin/bash –d /home/hadoop –m hadoop –g hadoop //添加一个hadoop用户,此用户属于hadoop用户组
passwd hadoop //设置用户登录密码
上述3个虚机结点均需要进行以上步骤来完成hadoop运行帐号的建立。
Master(NameNode | JobTracker)作为客户端,要实现无密码公钥认证,连接到服务器Salve(DataNode | Tasktracker)上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当Master通过SSH连接Salve时,Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。
网上有教程说在配置ssh 无密码连接之前,先关闭各虚拟节点防火墙,我个人没有做,也没有问题。
检查ssh是否安装,执行如下命令,如果出现了下面的几条信息,则表示已经安装。我Linux的centos7.0 默认带ssh,如果你发现没有安装,需要先安装ssh,安装完毕后再使用此命令检查。
下面我介绍一下master节点下需要执行的命令,其他两个节点执行同样操作即可。
ssh-keygen -t rsa -P ''#运行后询问其保存路径时直接回车采用默认路径,生成的密钥对:id_rsa(私钥)和id_rsa.pub(公钥),默认存储在"/home/hadoop/.ssh"目录下。
查看”/home/hadoop/”下是否有”.ssh”文件夹,且”.ssh”文件下是否有两个刚生产的无密码密钥对。
接着在Master节点上做如下配置,把id_rsa.pub追加到授权的key里面去。
cat id_rsa.pub >> authorized_keys#把id_rsa.pub追加到授权的key里面去
chmod 600 authorized_keys#设置该文件的权限
切换到root用户登录修改ssh配置文件”/etc/ssh/sshd_config”的下列内容。
检查下面几行前面”#”注释是否取消掉:
LoginGraceTime 2m
PermitRootLogin yes
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
master节点已经设置完毕。用上述同样的方法在剩下的两个结点中同样操作即可。
接下来的事儿是让主结点(master)能通过SSH免密码登录两个子结点(slave),为了实现这个功能,两个slave结点的公钥文件中必须要包含主结点的公钥信息,这样当master就可以顺利安全地访问这两个slave结点了。(这一步只在master上操作,使得master能够ssh免密码登陆)
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@node1#命令执行后需要输入node1 的登陆密码
ssh hadoop@node1 #验证是否能够免密码登陆
对node2结点也可以用同样的方法进行,下图分别是对node1和node2的操作过程。
对node1的操作过程:
对node2的操作过程:
至此,SSH免密码登录已经配置成功。
所有的机器上都要安装JDK,现在就先在Master服务器安装,然后其他服务器按照步骤重复进行即可。安装JDK以及配置环境变量,需要以”root”的身份进行。
因为centos7 预装了Open JDK ,但还是推荐用Oracle JDK,所以第一步是查看系统里的JDK ,如果出现了openjdk ,则卸载。查看和卸载的操作如下:
出现了openjdk ,两个都需要卸载,执行命令是yum -y remove xxx。xxx为以上返回的结果。
卸载完毕后将已经下载好的”jdk-7u67-linux-x64.tar.gz”复制到”/opt”文件夹中,然后解压即可。查看”/opt”下面会发现多了一个名为”jdk1.7.0_67”文件夹,说明我们的JDK安装结束,删除”jdk-7u67-linux-x64.tar.gz”文件。
注:复制过程我是从windows 系统传到了虚拟机master中,使用的是xftp4软件,非常方便能够连接虚拟机并传送文件,其中需要注意的是在新建连接中把协议改为sftp。
上述过程中的解压和删除的操作如下:
配置环境变量:
验证效果:
注:以上这些步骤要分别在三台机器上执行。由于当时安装过程中截图保存不全,查看和卸载的操作我用的master的截图,从解压开始的操作我是用的node1的截图。大家看操作命令,忽视掉主机名就行了。
到目前为止,准备工作已经完成,现在我们可以开始安装和配置Hadoop了。
首先用root用户登录”master”机器,将下载的”hadoop-1.2.1.tar.gz”复制到/usr目录下。然后进入”/usr”目录下,用下面命令把”hadoop-1.2.1.tar.gz”进行解压,并将其重命名为”hadoop”,把该文件夹的读权限分配给普通用户hadoop,然后删除”hadoop-1.2.1.tar.gz”安装包。
cd /usr
tar –xzvf hadoop-1.2.1.tar.gz
mv hadoop-1.2.1 hadoop
chown –R hadoop:hadoop hadoop #将文件夹"hadoop"读权限分配给hadoop普通用户
rm -rf hadoop-1.2.1.tar.gz
最后在”/usr/hadoop”下面创建tmp文件夹,并把Hadoop的安装路径添加到”/etc/profile”中,修改”/etc/profile”文件,将以下语句添加到末尾,并使其生效(source /etc/profile):
export HADOOP_HOME=/usr/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
下面两张图,第一张图是编辑”/etc/profile”文件和使之生效的命令。
第二张图是进入编辑之后,要添加的内容,添加的是后两行,前两行已经添加过了。
在master上执行完毕以上操作之后,还需要在另两个机器上执行同样操作。
所需要配置的文件均存放在/hadoop/conf文件夹里。
(1)配置hadoop-env.sh
该”hadoop-env.sh”文件位于”/usr/hadoop/conf”目录下。
在文件中修改下面内容: `
export JAVA_HOME=/opt/jdk1.7.0_67
(2)配置core-site.xml文件
修改Hadoop核心配置文件core-site.xml,这里配置的是HDFS master(即namenode)的地址和端口号。
(3)配置hdfs-site.xml文件
修改Hadoop中HDFS的配置,配置的备份方式默认为3。他是指配置文件的冗余数,不能大于slave个数,因此设置为2。
上图中有两处要改动一下,把/usr/hadoop/dfs/name中的dfs 改成hdfs
把/usr/hadoop/dfs/data 中的dfs 改成hdfs。因为这里我在没改的情况下Hadoop启动之后有一个进程启不了,查看了logs日志之后说是文件名不一致,我就改了这里,就好了。
(4)配置mapred-site.xml文件
修改Hadoop中MapReduce的配置文件,配置的是JobTracker的地址和端口。
(5)配置masters文件
修改localhost为master
(6)配置slaves文件
去掉”localhost”,每行添加一个主机名,把剩余的Slave主机名都填上。
现在在Master机器上的Hadoop配置就结束了,剩下的就是配置Slave机器上的Hadoop。最简单的方法是将 Master上配置好的hadoop所在文件夹”/usr/hadoop”复制到所有的Slave的”/usr”目录下用下面命令格式进行
scp -r /usr/hadoop root@node2:/usr/
查看node2服务器的”/usr”目录下是否已经存在”hadoop”文件夹,确认已经复制成功。查看结果如下:
执行完对node2操作之后,再对node1 的传输和验证执行同样操作。
在启动前关闭集群中所有机器的防火墙,使用下面命令启动。
可以通过以下启动日志看出,首先启动namenode 接着启动datanode1,datanode2,…,然后启动secondarynamenode。再启动jobtracker,然后启动tasktracker1,tasktracker2,…。
验证方法一:用”jps”命令
验证方式二:用”hadoop dfsadmin -report”
这个图没有显示完全,下面还有node2 的情况.
(1)访问”http://172.16.10.15:50030”
(2)访问”http://172.16.10.15:50070”