Hadoop是Apache软件基金会旗下的一个开源分布式计算平台。以Hadoop分布式文件系统(HDFS,Hadoop Distributed 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分布式集群的主要任务。
相关软件
操作系统:Ubuntu 13.04 64bit
Hadoop:hadoop-1.0.4
JDK:jdk-7u7-linux-x64
开发工具:eclipse-jee-juno-SR1-linux-gtk-x86_64
hadoop-eclipse 插件:hadoop-eclipse-plugin-1.0.3
(一)环境配置
集群中包括5个节点:1个Master,4个Salve,节点之间局域网连接,保证可以相互ping通。节点IP地址分布如下:
Master | 192.168.1.100 |
Slave1 | 192.168.1.101 |
Slave2 | 192.168.1.102 |
Slave3 | 192.168.1.103 |
Slave4 | 192.168.1.104 |
5个节点上均是Ubuntu 13.04系统,并且有一个相同的用户hadoop。Master机器主要配置NameNode和JobTracker的角色,负责总管分布式数据和分解任务的执行;4个Salve机器配置DataNode和TaskTracker的角色,负责分布式数据存储以及任务的执行。
下面我们将以Master机器为例,即主机名为"Master",IP为"192.168.1.100"进行一些主机名配置的相关操作。其他的Slave机器以此为依据进行修改。
1)修改机器名
机器名的配置在/etc/hostname文件中,所以直接修改该文件即可,修改命令为:
sudo vi /etc/hostname
输入root 密码,删除文件中原来的机器名,改为Master即可。
修改完毕后,输入命令:
hostname
若显示Master,则证明配置成功。
2)修改机器IP地址
3)配置hosts文件
"/etc/hosts"这个文件是用来配置主机将用的DNS服务器信息,是记载LAN内接续的各主机的对应[HostName和IP]用的。当用户在进行网络连接时,首先查找该文件,寻找对应主机名(或域名)对应的IP地址。
我们要测试两台机器之间知否连通,一般用"ping 机器的IP",如果想用"ping 机器的主机名"发现找不见该名称的机器,解决的办法就是修改"/etc/hosts"这个文件,通过把LAN内的各主机的IP地址和HostName的一一对应写入这个文件的时候,就可以解决问题。
在进行Hadoop集群配置中,需要在"/etc/hosts"文件中添加集群中所有机器的IP与主机名,这样Master与所有的Slave机器之间不仅可以通过IP进行通信,而且还可以通过主机名进行通信。所以在所有的机器上的"/etc/hosts"文件末尾中都要添加如下内容:
192.168.1.100 Master 192.168.1.101 Slave1 192.168.1.102 Slave2 192.168.1.103 Slave3 192.168.1.104 Slave4 |
使用以下命令,修改/etc/hosts文件即可:
sudo vi /etc/hosts
PS:为保证namenode能够正常启动,最好将hosts中的其他IP配置信息删除。
修改完毕后,用命令:
ping Slave1
进行测试,若能够ping通,则证明配置正确。
PS:其他机器上的hosts可以通过安装ssh后,将该文件发送到各个机器上,然后替换机器上的原始文件即可。
(二)SSH无密码互联
Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个DataNode上的各种守护进程的。这就必须在节点之间执行指令的时候是不需要输入密码的形式,故我们需要配置SSH运用无密码公钥认证的形式,这样NameNode使用SSH无密码登录并启动DataName进程,同样原理,DataNode上也能使用SSH无密码登录到NameNode。
当Master需要无密码访问Slave1时,Master为客户端,Slave1是服务器,客户端要无密码登录服务器,需要将自己的公钥上传到服务器。
ssh localhost
若显示:ssh: connect to host localhost port 22: Connection refused,则表示没有还没有安装,可以通过apt安装,命令如下:
sudo apt-get update
sudo apt-get install openssh-server
PS:若不输入第一条命令,则很可能会在安装ssh时报无法找到ssh资源。
安装完成后,可以通过如下命令查看服务是否正确启动:
ps -e|grep ssh
若显示:
6212 ? 00:00:00 sshd
则说明ssh已正常启动,否则,可通过以下命令开启ssh服务:
sudo /etc/init.d/ssh start
确认ssh服务已经安装启动后,我们需要配置Master与各个Slave之间的无密码互联。以Master连接Slave1为例。
Master与Slave1无密码访问配置
在Master的终端中输入命令,产生密钥:
ssh-keygen -t dsa -P “ ” -f ~/.ssh/id_dsa
将.ssh中的id_dsa.pub添加到authorized_keys中
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
修改/etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
#AuthorizedKeysFile %h/.ssh/authorized_keys
将AuthorizedKeysFile该行前面的#去掉
验证是否可以无密码连接到本机
ssh Master
首次连接会询问是否将Maser加入knownhosts中,确定即可。若无需输入密码即可连接到Master,则证明设置成功。
将Master上的id_dsa.pub上传到Slave1(PS:记得先从登陆上的Master中退出,使用命令exit):
scp ~/.ssh/id_dsa.pub hadoop@Slave1 ~/
登录Slave1
ssh Slave1
由于此时Master若还不能无密码访问Slave1,需要输入Slave1上hadoop的密码。
输入Slave1上hadoop的密码后,打开终端,输入命令产生密钥:
ssh-keygen -t dsa -P “ ” -f ~/.ssh/id_dsa
将.ssh中的id_dsa.pub添加到authorized_keys中
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
修改/etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
#AuthorizedKeysFile %h/.ssh/authorized_keys
将AuthorizedKeysFile该行前面的#去掉
验证是否可以无密码连接到本机
ssh Slave1
首次连接会询问是否将Slave1加入knownhosts中,确定即可。若无需输入密码即可连接到Slave1,则证明设置成功。
从当前登陆中退出:
exit
将从Master中接收到的公钥加入到加到Slave1的authorized_keys中(使得Master可以无密码登陆Slave1):
cat ~/id_rsa.pub(Master 公钥的存放路径) >> ~/.ssh/authorized_keys
删除Master的公钥:
rm -r ~/id_dsa.pub
到此,Master无密码登陆Slave1配置成功。然后配置Slave1无密码登陆Master。
将Slave1的公钥上传到Master上:
scp ~/.ssh/id_dsa.pub hadoop@Master ~/
退出Slave1:
exit
将Slave1的公钥加入到Master的authorized_keys中(使得Slave1可以无密码登陆Master):
cat ~/id_rsa.pub(Slave1公钥的存放路径) >> ~/.ssh/authorized_keys
将Slave1的公钥删除(避免配置其它Slave时混淆):
rm -r ~/id_dsa.pub
现在,Master与Slave1的无密码互联已经配置成功,可以输入登陆命令进行测试。
Master与其它Slave之间的无密码互联可以仿照上述方法进行(PS:每次输入命令时,一定要确定当前所登陆的机器是否正确)。
(三)Haoop安装
Hadoop的安装配置可以现在Master上进行,然后将配置好的文件发送到Slave节点上即可。
环境变量配置
将jdk解压并将解压后的文件命名为java
将解压后的jdk文件移动到/usr文件夹中
sudo mv ~/java(解压后的jdk的存放路径) /usr/
编辑"/etc/profile"文件:
vi /etc/profile
在"/etc/profile"文件的尾部添加以下内容:
# set java environment
export JAVA_HOME=/usr/java/jdk1.7.0_07
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
保存并退出,执行下面命令使其配置立即生效:
source /etc/profile