hadoop搭建及常见问题

来源:互联网 发布:流程优化的建议 编辑:程序博客网 时间:2024/05/17 06:50

       这是本人在完全分布式环境下在Cent-OS中配置Hadoop-0.20.203.0时的总结文档,但该文档也适合其他版本的Linux系统和目前各版本的Hadoop(Hadoop-0.20之后的版本配置文件hadoop-site.xml被拆分成了三个core-site.xmlhdfs-site.xmlmapred-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.xmlhdfs-site.xmlmapred-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

172.20.14.214

(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/networkHOSTNAME的值为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需要做什么?

         如果masterslaveIP换了,需要做如下操作:

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