这是本人在完全分布式环境下在Cent-OS中配置Hadoop-0.20.203.0时的总结文档,但该文档也适合其他版本的Linux系统和目前各版本的Hadoop(Hadoop-0.20之后的版本配置文件hadoop-site.xml被拆分成了三个core-site.xml,hdfs-site.xml和mapred-site.xml,这里会说明0.20后的版本中如何配置这三个文件)。
Hadoop配置建议所有配置文件中使用主机名进行配置,并且机器上应在防火墙中开启相应端口,并设置SSHD服务为开机启动,此外java环境变量可以在/etc/profile中配置。
1集群网络环境介绍
集群包含三个节点:1个namenode,2个datanode,节点之间局域网连接,可以相互ping通。节点IP地址和主机名分布如下:
172.20.14.214 master namenode 172.20.14.233 slave1 datanode01 172.20.14.114 slave2 datanode02 |
所有节点均是Cent-OS系统,防火墙均禁用,sshd服务均开启并设置为开机启动。
所有节点上均创建了一个目录/usr/local/hadoop-0.20.203.0,并且拥有者是hadoop用户。因为该目录用于安装hadoop,用户对其必须有rwx权限。
注:如果想每次的ip不变,则执行
vi /etc/sysconfig/network-scripts/ifcfg-eth0
修改如下:
DEVICE=eth0
BOOTPROTO=static //
IPADDR=172.20.14.114 //要分配的ip地址
NETMASK=255.255.255.0
NETWORK=172.20.14.0
BROADCAST=172.20.14.255
GATEWAY=172.20.14.1
HWADDR=C8:9C:DC:59:38:F6
ONBOOT=yes
2文件配置
namenode节点上编辑/etc/hosts文件
将所有节点的名字和IP地址写入其中,写入如下内容,注意注释掉127.0.0.1行,保证内容如下:
172.20.14.214 master 172.20.14.233 slave1 172.20.14.114 slave2 |
3建立ssh无密码登陆
Namenode向datanode发命令是靠ssh来发的,发命令肯定是在运行的时候发,发的时候肯定不希望发一次就要输入一次密码,因此我们需要实现NameNode无密码登陆到所有DataNode。
Namenode作为客户端,要实现无密码公钥认证,连接到服务端datanode上时,需要在namenode上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到datanode上。当namenode通过ssh连接datanode时,datanode就会生成一个随机数并用namenode的公钥对随机数进行加密,并发送给namenode。namenode收到加密数之后再用私钥进行解密,并将解密数回传给datanode,datanode确认解密数无误之后就允许namenode进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。重要过程是将客户端namenode公钥复制到datanode上。
所有机器上生成密码对,所有节点上执行以下命令:
ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 默认路径
Enter passphrase (empty for no passphrase): 回车,空密码
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
这将在/root/.ssh/目录下生成一个私钥id_rsa和一个公钥id_rsa.pub。
把NameNode上的id_rsa.pub文件追加到datanode的authorized_keys内(当前并没有authorized_keys文件),以172.20.14.233节点为例:
a. 拷贝namenode的id_rsa.pub文件:
scp id_rsa.pub root@172.20.14.233:/home
b. 登陆172.20.14.233,执行 cat /home/id_rsa.pub >> /root/.ssh/authorized_keys
其他的datanode执行同样的操作。
注意:如果配置完毕,如果namenode依然不能访问datanode,可以修改datanode的authorized_keys:chmod 600 authorized_keys。
4安装和Java环境变量配置
4.1安装 JDK 1.6
root用户登陆,在Namenode节点上新建文件夹/usr/java,下载JDK安装包jdk-6u29-linux-i586.bin,复制到目录/usr/ program下,执行权限chmod +x jdk-6u29-linux-i586.bin。在命令行进入该目录,执行命令“./ jdk-6u29-linux-i586.bin”,命令运行完毕,将在目录下生成文件夹jdk1.6.0_29。执行命令java –version 出现jdk1.6.0_29则安装成功。
4.2环境变量配置
root用户登陆,命令行中执行命令”vi /etc/profile”,在最下面加入以下内容,配置环境变量(注意/etc/profile这个文件很重要,后面Hadoop的配置还会用到)。
#set java environment
export JAVA_HOME=/usr/java/jdk1.6.0_29
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
export HADOOP_HOME=/usr/local/hadoop-0.20.203.0
export PATH=$PATH:$HADOOP_HOME/bin
保存并退出,执行命令:source /etc/profile使配置生效。
配置完毕,在命令行中使用命令”java -version” 出现jdk1.6.0_29则安装成功。在hadoop用户下测试java –version,一样成功。
将Namenode上的/etc/profile复制到所有数据节点上。操作步骤如下:
root用户登录namenode;
执行命令:scp /etc/profile root@datanode ip:/etc/profile
5集群配置
在namenode上执行:
Hadoop用户登录。
下载hadoop-0.20.203.0,将其解压到/usr/local目录下,解压后目录形式是/usr/local/ hadoop-0.20.203.0。使用如下命令:
tar zxvf hadoop-0.20.203.0.tar.gz
(1)配置Hadoop的配置文件
(a)配置hadoop-env.sh
$ vi /usr/local/hadoop-0.20.203.0/conf/hadoop-env.sh
# set java environment export JAVA_HOME=/usr/java/jdk1.6.0_29 |
(b)配置conf/hadoop-site.xml
Hadoop-0.20之后的版本请分别配置core-site.xml,hdfs-site.xml和mapred-site.xml三个配置文件,配置方法即将下面hadoop-site.xml文件中的三块参数分别复制到三个文件当中。
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <!—core-site.xml--> <property> <name>fs.default.name</name> <value>hdfs:// 172.20.14.214:9000</value> <description>HDFS的URI,文件系统://namenode标识:端口号</description> </property> <!—hdfs-site.xml--> <property> <name>dfs.replication</name> <value>3</value> <description>副本个数,不配置默认是3,应小于datanode机器数量</description> </property> <!—mapred-site.xml--> <property> <name>mapred.job.tracker</name> <value>172.20.14.214:9001</value> <description>jobtracker标识:端口号,不是URI</description> </property> </configuration> |
(c)配置masters文件,加入namenode的ip
(d)配置slaves文件, 加入所有datanode的ip
172.20.14.233 172.20.14.114 |
6集群启动
将jdk和配置好的hadoop文件通过ssh服务拷贝到datanode,目录跟namenode相同。
Namenode执行:
格式化namenode,格式化后在namenode生成了hdfs/name文件夹
bin/hadoop namenode –format
错误:java.net.UnknownHostException,解决办法如下:
查看host名称,执行:hostname
这里Hadoop在格式化HDFS的时候,通过hostname命令获取到的主机名是wuxiaochao,然后在/etc/hosts文件中进行映射的时候,没有找到,看下我的/etc/hosts内容:
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
也就说,通过wuxiaochao根本无法映射到一个IP地址,所以报错了。
此时,我们查看一下/etc/sysconfig/network文件:
NETWORKING=yes
HOSTNAME=wuxiaochao
修改/etc/sysconfig/network中HOSTNAME的值为localhost,保证localhost在/etc/hosts文件中映射为正确的IP地址,然后重新启动网络服务:
service network restart
启动hadoop所有进程,
bin/start-all.sh(或者先后执行start-dfs.sh和start-mapreduce.sh)。
注:Hadoop-----Unrecognized option: -jvm
启动hadoop时 #./start-all.sh
报错:
localhost: Unrecognized option: -jvm
localhost: Could not create the Java virtual machine.
解决:
查看/usr/local/hadoop/bin/hadoop 源码:(在按i以后出现的datanode中)
-jvm server改为 -server
可以通过以下启动日志看出,首先启动namenode,然后启动datanode1,datanode2,然后启动secondarynamenode。再启动jobtracker,然后启动tasktracker1,最后启动tasktracker2。
启动hadoop成功后,在namenode中生成了hadooptmp文件夹,在datanode中生成了hdfs文件夹和mapred文件夹。
namenode上用java自带的小工具jps查看进程
每个datanode上查看进程
在namenode上查看集群状态
bin/hadoop dfsadmin –report
Hadoop 的web 方式查看:http:// namenode ip地址:50070
Hadoop查看工作情况:http:// namenode ip地址:50030
7使用
7.1一个测试例子WordCount
计算输入文本中词语数量的程序WordCount在Hadoop主目录下的java程序包hadoop-0.19.1-examples.jar中,执行步骤如下:
(1)上传数据到HDFS中
bin/hadoop fs -mkdir mytest
bin/hadoop fs -copyFromLocal /home/hadoop/mytest/input1
bin/hadoop fs -copyFromLocal /home/hadoop/mytest/input2
(2)执行命令,提交作业
bin/hadoop jar hadoop-0.20.203.0-examples.jar wordcount mytest/* output
命令执行完毕,在页面http://namenodeip:50030/中能够看到作业执行情况。
(3)程序输出
程序将统计mytest目录下的所有文本文件中词语的数量,并将结果输出到hdfs的output目录下的part-00000文件中。这里的output目录是程序生成的目录,程序运行前不可存在。执行以下命令可以查看结果。
bin/hadoop fs -cat output/part-00000
注:
如果再次输出报错的话说明输出文件名一样,修改输出文件名即可。
8集群常见问题汇总
8.1如何打开端口?
首先,我们需要在CentOS系统中编辑iptables Java代码
vi /etc/sysconfig/iptables-config
然后在CentOS系统中添加 Java代码
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9000 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9001 -j ACCEPT
最后CentOS系统要重新启动服务 Java代码
/sbin/service iptables restart
查看端口是否开放 Java代码
netstat –anp|grep 9000
8.2如果要关闭防火墙,每台机子都要关
vi /etc/sysconfig/selinux
#修改为 SELinux=disable
service iptables stop
chkconfig iptables off
reboot
这样开机就不启动防火墙了。
注:如果防火墙未关,可能出现如下错误:
File /home/hexianghui/tmp/mapred/system/jobtracker.info could only be
replicated to 0 nodes, instead of 1。
8.3修改主机名和设置固定IP
修改主机名 vi /etc/sysconfig/network
设默认IP vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
#BOOTPROTO=dhcp
BOOTPROTO=static
IPADDR=192.168.131.50
NETMASK=255.255.255.0
TYPE=Ethernet
HWADDR=XX:XX:XX:XX:XX:XX
ONBOOT=yes
最后重启服务service network restart
8.4设置
C:\WINDOWS\system32\drivers\etc文件中的hosts中加入两句:
192.168.131.7 master
192.168.131.8 slave1
8.5系统无法使用sudo的解决办法
用sudo时提示"xxx is not in the sudoers file. This incident will be reported.其中XXX是你的用户名,也就是你的用户名没有权限使用sudo,我们只要修改一下/etc/sudoers文件就行了。
1.下面是修改方法:
1)进入超级用户模式。也就是输入"su -",系统会让你输入超级用户密码,输入密码后就进入了超级用户模式。(当然,你也可以直接用root用)
2)添加文件的写权限。也就是输入命令"chmod u+w /etc/sudoers"。
3)编辑/etc/sudoers文件。也就是输入命令"vim /etc/sudoers",输入"i"进入编辑模式,找到这一 行:"root ALL=(ALL) ALL"在起下面添加"xxx ALL=(ALL) ALL"(这里的xxx是你的用户名),然后保存(就是先按一 下Esc键,然后输入":wq")退出。
4)撤销文件的写权限。也就是输入命令"chmod u-w /etc/sudoers"。
8.6更换IP需要做什么?
如果master或slave的IP换了,需要做如下操作:
1、修改/etc/hosts
2、清空Hadoop临时目录 /home/hadoop/tmp
3、重新执行hadoop namenode –format格式化HDFS。
注意,该操作会清除HDFS上内容,所以谨慎操作。
8.7节点无法启动
Namenode如果启动不了就在主节点中,将hdfs-site.xml中dfs.data.dir指向的目录下的name文件夹删掉
Datanode启动不了就在对应的从节点中,将hdfs-site.xml中dfs.data.dir指向的目录下的data文件夹删掉
然后重新格式化。
8.8 Hadoop启动后会短暂进入safe mode
Hadoop启动后会短暂进入safe mode,此时无法对HDFS进行增删操作,稍等片刻即可
8.9无法远程连接Hadoop
Apache Hadoop可以连Eclipse,插件在contrib\eclipse-plugin 下,该插件不同版本不通用
Cloudera Hadoop 没有连Eclipse的插件,无法连接Eclipse