说起大数据、云计算就绕不开Hadoop,终于在实验室折腾了半天,找了两台主机,试着搭建Hadoop集群,结果遇到了一些错误。
先说说我遇到的错误,我在网上找了一个教程:http://www.cnblogs.com/lanxuezaipiao/p/3525554.html 这篇文章确实写的很详细,但是一步一步到最后,我的namenode一直启动不起来,最后纠结了两天终于弄明白,原来hadoop原来的mapred框架不如意,后来对mapred的框架做了改进,新框架名字叫做YARN,所以在配置的时候发生了一些变化,上面这个链接主要针对的是老版本的mapred框架进行的配置。最后发现这个问题,按照Yarn进行配置文件的修改就可以了。
一、环境介绍:
linux系统:两台主机都安装了Ubuntu14.04 LTS
jdk版本: jdk1.8.0_65
hadoop版本:hadoop2.7.1
主机名 | ip | 角色 | 用户名 |
master | 192.168.213.140 | namenode | hadoop |
slave1 | 192.168.213.183 | datanode | hadoop |
后面可能会涉及用户和用户组的问题,如果没有设置用户组,linux 会默认一个用户为一个用户组。
二、修改 /etc/hosts
"/etc/hosts"这个文件是用来配置主机将用的DNS服务器信息,是记载LAN内接续的各主机的对应[HostName IP]用的,例如当我们执行 ping slave1,如果/etc/hosts文件中没有配置 slave1对应的ip,计算机就会不知道怎么处理slave1,就会报错,当在/etc/hosts 配置slave1的ip以后,执行ping slave1就会ping相应的ip。
下面是我自己的/etc/hosts配置。
127.0.0.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.213.140 master
192.168.213.183 slave1
可以直接找到/etc/hosts进行编辑,也可以通过命令行进行编辑,命令为 vim /etc/hosts
打开后可能无法编辑,键盘中按 “O” 可以进行编辑,编辑完成后按 ESC 再输入 :wq 就可以完成保存并退出。
现在 ping slave1 就可以ping通了。
三、ssh无密码登陆
1)SSH基本原理
SSH之所以能够保证安全,原因在于它采用了公钥加密。过程如下:
(1)远程主机收到用户的登录请求,把自己的公钥发给用户。
(2)用户使用这个公钥,将登录密码加密后,发送回来。
(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
所以再安装玩ssh后,master第一次通过ssh登陆slave1,需要输入一次slave1的密码。
2)SSH无密码原理
Master(NameNode | JobTracker)作为客户端,要实现无密码公钥认证,连接到服务器Salve(DataNode | Tasktracker)上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当Master通过SSH连接Salve时,Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。
3)Master机器上设置无密码登录
a. Master节点利用ssh-keygen命令生成一个无密码密钥对。
在Master节点上执行以下命令:
ssh-keygen –t rsa –P ''
运行后询问其保存路径时 直接回车采用默认路径。生成的密钥对:id_rsa(私钥)和id_rsa.pub(公钥),默认存储在" /home/用户名/.ssh"目录下。
所以我的.ssh文件存在 /home/hadoop/.ssh 。对于linux 以 . 开头的文件都会默认隐藏,通过 ctrl+h 进行显示,也可以再命令行通过 ls -a 显示隐藏文件。
再.ssh文件夹中存在两个文件,一个是id_rsa(私钥) ,另一个是id_rsa.pub(公钥)。
b. 接着在Master节点上做如下配置,把id_rsa.pub追加到授权的key里面去。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
c. 用root用户登录修改SSH配置文件"/etc/ssh/sshd_config"的下列内容。
检查下面几行前面”#”注释是否取消掉:
RSAAuthentication yes # 启用 RSA 认证
PubkeyAuthentication yes # 启用公钥私钥配对认证方式
AuthorizedKeysFile %h/.ssh/authorized_keys # 公钥文件路径
重新启动SSH服务,用命令 ssh service restart 可能会出现
那就试试 sudo /etc/init.d/ssh start 命令。
总之两种方法启动SSH服务:
service ssh start
sudo /etc/init.d/ssh start
启动以后,通过命令 ps -e | grep ssh 查看ssh的启动情况,当下面列出sshd表示ssh服务已经启动。
退出root用户,再hadoop用户下用 ssh localhost 命令查看ssh配置情况。 如下出现了welcome to XXXX表示ssh配置无误。
d: 把master上的公钥复制到所有slave上(我只有一个slave1).
命令为:ssh-copy-id hadoop@slave1 @前面为用户,后面为主机名称。
我已经复制过了,这里不在截图。 复制完以后,在slave1上的 /home/hadoop/.ssh 文件夹中只能看到 authorized_key 文件。
e: 测试通过ssh登陆slave1。
通过命令 ssh hadoop@slave1
我们会发现,最下面已经变成hadoop 用户下登陆slave1主机。这表明通过ssh可以无密码登陆slave1.
接下来配置所有Slave无密码登录Master,其和Master无密码登录所有Slave原理一样,就是把Slave的公钥追加到Master的".ssh"文件夹下的"authorized_keys"中,记得是追加(>>)。
四、安装java环境。
将下载下来的jdk-8u65-linux-64.tar.gz 直接解压缩到 /home/hadoop下面。然后配置java环境。
在 /etc/profile 文件下添加java的环境配置,如下:
#set java environment
export JAVA_HOME=/home/hadoop/jdk1.8.0_65
export JRE_HOME=/home/hadoop/jdk1.8.0_65/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
不同的安装路径可能会不太一样,注意修改。
执行 source /etc/profile 或 . /etc/profile 使文件立即生效。
执行 java -version 检查jdk安装情况。
五 、 安装hadoop
将下载的hadoop压缩包,复制到 /home/hadoop 下,用命令 tar –xzvf hadoop-1.1.2.tar.gz 进行解压缩。解压后为hadoop-2.7.1
通过命令:
chown –R hadoop:hadoop hadoop #将文件夹"hadoop"读权限分配给hadoop普通用户
再在/home/hadoop/hadoop-2.7.1建立文件夹 tmp(后面会用到)。
配置/etc/profile 文件。
在末尾添加:
#set hadoop environment
export HADOOP_HOME=/home/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
配置 /home/hadoop/hadoop-2.7.1/etc/hadoop/hadoop-env.sh文件:
添加:
export JAVA_HOME=/home/hadoop/jdk1.8.0_65
配置 /home/hadoop/hadoop-2.7.1/etc/hadoop/yarn-env.sh文件
添加:
export JAVA_HOME=/home/hadoop/jdk1.8.0_65
配置:/home/hadoop/hadoop-2.7.1/etc/hadoop/core-site.xml文件
配置如下:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop-2.7.1/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.213.140:9000</value>
</property>
</configuration>
配置: /home/hadoop/hadoop-2.7.1/etc/hadoop/hdfs-site.xml文件
配置如下:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/hadoop-2.7.1/tmp/dfs/data</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/hadoop-2.7.1/tmp/dfs/name</value>
</property>
</configuration>
配置:/home/hadoop/hadoop-2.7.1/etc/hadoop/mapred-site.xml文件
配置如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>192.168.213.140:9001</value>
</property>
</configuration>
配置: /home/hadoop/hadoop-2.7.1/etc/hadoop/yarn-site.xml文件
配置如下:
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.address</name>
<value>192.168.213.140:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>192.168.213.140:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>192.168.213.140:8035</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>192.168.213.140:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>192.168.213.140:8088</value>
</property>
</configuration>
因为新版的mapred框架被修改为yarn,所以要配置很多yarn文件,如果是老板的mapred框架,则不需要。
修改:/home/hadoop/hadoop-2.7.1/etc/hadoop/slaves文件。
因为在之前的 /etc/hosts文件中已经将要连接的从节点和ip做了对应,所以这里只需要添加slave的主机名即可,我这里只有一个slave1从节点,所以添加slave1,
到这里我们已经再master上配置好了hadoop,但slave上面还没有hadoop,直接用命令,
scp -r /home/hadoop/hadoop-2.7.1 hadoop@slave1:/home/hadoop/
将master里的hadoop-2.7.1复制到slave1相应的目录,因为在slave1上,我们要做几乎相同的配置,所以直接复制即可。(slave1中并不需要配置 hadoop-2.7.1下的slaves文件,但有了也无所谓)。
通过命令:
chown -R hadoop:hadoop(用户名:用户组) hadoop-2.7.1(文件夹)
进行授权操作。
授权这一步我觉得没什么用,因为当时复制的时候,我用root@slave1进行复制时,再输入root密码时,一直说我的root密码有问题,我就直接用hadoop@slave1进行复制。
因为我们只是将hadoop-2.7.1复制到了slave下面,所以还要将 /etc/profile文件进行修改( 看前面)
最后在hadoop-2.7.1下执行 bin/hdfs namenode -format 格式化namenode。
六、启动hadoop : sbin/start-all.sh
通过jps查看进程
七、 通过 localhost:50070 查看hadoop集群
选择第一行的Datanodes可以用来查看slave节点状况。
参考:http://www.cnblogs.com/lanxuezaipiao/p/3525554.html
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=30144462&id=4847600
http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/