共计 13917 个字符,预计需要花费 35 分钟才能阅读完成。
1、集群部署介绍
1.1 Hadoop简介
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 分布式集群的主要任务。
1.2 环境说明
我的环境是在虚拟机中配置的,Hadoop集群中包括 4 个节点:1个 Master,2 个Salve,节点之间局域网连接,可以相互 ping 通,节点 IP 地址分布如下:
虚拟机系统 | 机器名称 | IP地址 |
Ubuntu 13.04 | Master.Hadoop | 192.168.1.141 |
Ubuntu 9.11 | Salve1.Hadoop | 192.168.1.142 |
Fedora 17 | Salve2.Hadoop | 192.168.1.137 |
Master机器主要配置 NameNode 和JobTracker的角色,负责总管分布式数据和分解任务的执行;3个 Salve 机器配置 DataNode 和TaskTracker的角色,负责分布式数据存储以及任务的执行。其实应该还应该有 1 个Master机器,用来作为 备用 ,以防止Master 服务器 宕机 ,还有一个备用马上启用。后续经验积累一定阶段后 补上 一台备用 Master 机器(可通过配置文件修改备用机器数)。
注意:由于 hadoop 要求所有机器上 hadoop 的部署目录结构要求相同(因为在启动时按与主节点相同的目录启动其它任务节点),并且都有一个 相同 的用户名账户。参考各种文档上说的是所有机器都建立一个 hadoop 用户,使用这个账户来实现无密码认证。这里为了方便,分别在三台机器上都重新建立一个 hadoop 用户。
1.3 环境配置
Hadoop集群要按照 1.2 小节 表格所示进行配置,下面介绍如何修改机器名称和配置 hosts 文件,以方便使用。
注意:我的虚拟机都采用 NAT 方式连接网络,IP地址是自动分配的,所以这里就使用自动分配的 IP 地址而未特地修改为某些 IP 地址。
(1)修改当前机器名称
假定 我们发现我们的机器的主机名不是我们想要的。
1)在 Ubuntu 下修改机器名称
修改文件 /etc/hostname 里的值即可,修改成功后用 hostname 命令查看当前主机名是否设置成功。
另外为了能正确解析主机名,最好也修改 /etc/hosts 文件里对应的主机名
2)在 Fedora 下修改机器名称
通过对 “/etc/sysconfig/network“ 文件修改其中 “HOSTNAME“ 后面的值,改成我们规定的名称。
命令:vi /etc/sysconfig/network,修改如下:
同样为了能正确解析主机名,最好也修改 /etc/hosts 文件里对应的主机名。
(2)配置 hosts 文件(必须)
“/etc/hosts“这个文件是用来配置主机将用的 DNS 服务器信息,是记载 LAN 内接续的各主机的对应 [HostName IP] 用的。当用户在进行网络连接时,首先查找该文件,寻找对应主机名对应的 IP 地址。
我们要测试两台机器之间知否连通,一般用 “ping 机器的 IP”,如果想用“ping 机器的主机名 “ 发现找不见该名称的机器 ( 这也就是为什么在修改主机名的同时最好修改该文件中对应的主机名 ),解决的办法就是修改“/etc/hosts“ 这个文件,通过把 LAN 内的各主机的 IP 地址和 HostName 的一一对应 写入这个文件的时候,就可以解决问题。
例如:机器为 “Master.Hadoop:192.168.1.141” 对机器为 “Salve1.Hadoop:192.168.1.142” 用命令 “ping” 记性连接测试。测试结果如下:
从上图中的值,直接对 IP 地址进行测试,能够 ping 通,但是对主机名进行测试,发现没有 ping 通,提示 “unknown host—— 未知主机 “,这时查看“Master.Hadoop” 的“/etc/hosts”文件内容会发现里面没有 “192.168.1.142 Slave1.Hadoop” 内容,故而本机器是无法对机器的主机名为 “Slave1.Hadoop” 解析。
在进行 Hadoop 集群 配置中,需要在 “/etc/hosts” 文件中添加集群中所有机器的 IP 与主机名,这样 Master 与所有的 Slave 机器之间不仅可以通过 IP 进行通信,而且 还可以通过主机名进行通信 。所以在所有的机器上的“/etc/hosts” 文件中都要添加如下内容:
192.168.1.141 Master.Hadoop
192.168.1.142 Slave1.Hadoop
192.168.1.137 Slave2.Hadoop
命令:vi /etc/hosts,添加结果如下:
现在我们在进行对机器为 “Slave1.Hadoop” 的主机名进行 ping 通测试,看是否能测试成功。
从上图中我们已经能用主机名进行 ping 通了,说明我们刚才添加的内容,在局域网内能进行 DNS 解析了,那么现在剩下的事儿就是在其余的 Slave 机器上进行相同的配置。然后进行测试。
1.4 所需软件
(1)JDK软件
下载地址:http://www.Oracle.com/technetwork/java/javase/index.html
JDK版本:jdk-7u25-linux-i586.tar.gz
(2)Hadoop软件
下载地址:http://hadoop.apache.org/common/releases.html
Hadoop版本:hadoop-1.1.2.tar.gz
2、SSH无密码验证配置
Hadoop运行过程中需要管理远端 Hadoop 守护进程,在 Hadoop 启动以后,NameNode是通过 SSH(Secure Shell)来启动和停止各个DataNode 上的各种守护进程的。这就必须在节点之间执行指令的时候是不需要输入密码的形式,故我们需要配置 SSH 运用无密码公钥认证的形式,这样 NameNode 使用 SSH 无密码登录并启动 DataName 进程,同样原理,DataNode上也能使用 SSH 无密码登录到 NameNode。
注意:如果你的 Linux 没有安装SSH,请首先安装SSH
Ubuntu下安装ssh:sudo apt-get install openssh-server
Fedora下安装ssh:yum install openssh-server
2.1 SSH基本原理和用法
1)SSH基本原理
SSH之所以能够保证安全,原因在于它采用了公钥加密。过程如下:
(1)远程主机收到用户的登录请求,把自己的公钥发给用户。
(2)用户使用这个公钥,将登录密码加密后,发送回来。
(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
2)SSH基本用法
假如用户名为java,登录远程主机名为linux,如下命令即可:
$ ssh java@linux
SSH的默认端口是 22,也就是说,你的登录请求会送进远程主机的22 端口。使用 p 参数,可以修改这个端口,例如修改为 88 端口,命令如下:
$ ssh -p 88 java@linux
注意:如果出现错误提示:ssh: Could not resolve hostname linux: Name or service not known,则是因为 linux 主机未添加进本主机的 Name Service 中,故不能识别,需要在 /etc/hosts 里添加进该主机及对应的 IP 即可:
linux 192.168.1.107
2.2 配置 Master 无密码登录所有Salve
1)SSH无密码原理
Master(NameNode | JobTracker)作为客户端,要实现无密码公钥认证,连接到服务器 Salve(DataNode | Tasktracker)上时,需要在Master 上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的 Slave 上。当 Master 通过 SSH 连接 Salve 时,Salve就会生成一个随机数并用 Master 的公钥对随机数进行加密,并发送给 Master。Master 收到加密数之后再用私钥解密,并将解密数回传给 Slave,Slave 确认解密数无误之后就允许 Master 进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。
2)Master机器上设置无密码登录
a. Master节点利用 ssh-keygen 命令生成一个 无密码密钥对。
在 Master 节点上执行以下命令:
ssh-keygen –t rsa –P ”
运行后询问其保存路径时 直接回车 采用默认路径。生成的密钥对:id_rsa(私钥)和 id_rsa.pub(公钥),默认存储在“/home/ 用户名 /.ssh“ 目录下。
查看 “/home/ 用户名 /” 下是否有 “.ssh” 文件夹,且 “.ssh” 文件下是否有两个刚生产的无密码密钥对。
b. 接着在 Master 节点上做如下配置,把 id_rsa.pub 追加到授权的 key 里面去。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
查看下 authorized_keys 的权限,如果权限不对则利用如下命令设置该文件的权限:
chmod 600 authorized_keys
c. 用 root 用户登录修改 SSH 配置文件 “/etc/ssh/sshd_config“ 的下列内容。
检查下面几行前面 ”#” 注释是否取消掉:
RSAAuthentication yes # 启用 RSA 认证
PubkeyAuthentication yes # 启用公钥私钥配对认证方式
AuthorizedKeysFile %h/.ssh/authorized_keys # 公钥文件路径
设置完之后记得 重启 SSH 服务,才能使刚才设置有效。
退出 root 登录,使用普通用户验证是否设置成功。
从上图中得知无密码登录本级已经设置完毕,接下来的事儿是把 公钥 复制 所
有 的Slave机器上。
注意:有时候在测试时可能会出现错误: Agent admitted failure to sign using the key.解决办法是:ssh-add ~/.ssh/id_rsa ,如下所示:
d.使用 ssh-copy-id 命令将公钥传送到远程主机上 ( 这里以 Slave1.Hadoop 为例)。
e. 测试是否无密码登录其它机器成功。
到此为止,我们经过 5 步已经实现了从 “Master.Hadoop” 到“Slave1.Hadoop”SSH无密码登录,下面就是重复上面的步骤把剩余的两台(Slave2.Hadoop和 Slave3.Hadoop)Slave 服务器进行配置。这样 ,我们就完成了“ 配置 Master 无密码登录所有的 Slave 服务器“。
接下来配置所有 Slave 无密码登录 Master,其 和Master无密码登录所有 Slave 原理一样,就是把 Slave 的公钥 追加 到Master的 “.ssh” 文件夹下的 “authorized_keys” 中,记得是 追加(>>)。
注意:期间可能会出现一些问题如下:
(1)如果在 ssh 连接时出现错误“ssh:connect to host port 22: Connection refused”,如下图所示:
则可能是因为远程登录的那台机器没有安装 ssh 服务或安装了没有开启 ssh 服务,下面到 Slave3.Hadoop 主机进行测试:
为了一劳永逸,设置 系统 启动时开启服务:# systemctl enable sshd.service
(2)如果在用命令 ssh-copy-id 时发现找不到该命令“ssh-copy-id:Command not found”,则可能是 ssh 服务的版本太低的原因,比如若你的机器是 RedHat 系统就可能该问题,解决办法是:手动复制本地的 pubkey 内容到远程服务器,命令如下:
cat ~/.ssh/id_rsa.pub | ssh hadoop@Master.Hadoop ‘cat >> ~/.ssh/authorized_keys’
该命令等价于下面两个命令:
①在本地机器上执行:scp ~/.ssh/id_rsa.pub hadoop@Master.Hadoop:/~
②到远程机器上执行:cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
3、Java环境安装
所有的机器上都要安装 JDK,现在就先在Master 服务器安装,然后其他服务器按照步骤重复进行即可。安装 JDK 以及配置环境变量,需要以 “root“ 的身份进行。
3.1 安装JDK
首先用 root 身份登录 “Master.Hadoop” 后在 “/usr” 下创建 “java” 文件夹,再将 “jdk-7u25-linux-i586.tar.gz” 复制到 “/usr/java” 文件夹中,然后解压即可。查看 “/usr/java“ 下面会发现多了一个名为 “jdk1.7.0_25“ 文件夹,说明我们的 JDK 安装结束,删除 “jdk-7u25-linux-i586.tar.gz” 文件,进入下一个 “ 配置环境变量 “ 环节。
3.2 配置环境变量
(1)编辑 “/etc/profile” 文件
编辑 “/etc/profile” 文件,在后面添加 Java 的“JAVA_HOME”、“CLASSPATH”以及 “PATH” 内容如下:
# set java environment
export JAVA_HOME=/usr/java/jdk1.7.0_25/
export JRE_HOME=/usr/java/jdk1.7.0_25/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
或者
# set java environment
export JAVA_HOME=/usr/java/jdk1.7.0_25/
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
以上两种意思一样,那么我们就选择 第1种 来进行设置。
(2)使配置生效
保存并退出,执行下面命令使其配置立即生效。
source /etc/profile 或 . /etc/profile
3.3 验证安装成功
配置完毕并生效后,用下面命令判断是否成功。
java -version
从上图中得知,我们确定 JDK 已经安装成功。
3.4 安装剩余机器
这时用 普通用户 hadoop 通过 scp 命令格式把 “/usr/java/” 文件复制到其他 Slave 上面,剩下的事儿就是在其余的 Slave 服务器上按照上图的步骤配置环境变量和测试是否安装成功,这里以 Slave1.Master 为例:
scp -r /usr/java seed@Slave1.Master:/usr/
注意:有的机器库函数版本较低,可能安装不了高版本的 JDK,比如有些Redhat9, 此时不可以选择较低版本的 JDK 进行安装 , 因为 所有集群中的 JDK 版本必须相同(经过测试),有两种方法可解决:一是放弃该机器,选用另一台能装该版本的 JDK 的机子;二是选择低版本的JDK,在所有机器上重新安装。
4、Hadoop集群安装
所有的机器上都要安装 hadoop,现在就先在Master 服务器安装,然后其他服务器按照步骤重复进行即可。安装和配置 hadoop 需要以 “root“ 的身份进行。
4.1 安装hadoop
首先用 root 用户登录 “Master.Hadoop” 机器,将下载的 “hadoop-1.1.2.tar.gz“ 复制到 /usr 目录下。然后进入 “/usr” 目录下,用下面命令把 “hadoop-1.1.2.tar.gz“ 进行解压,并将其重命名为 “hadoop”,把该文件夹的 读权限 分配给普通用户 hadoop,然后删除“hadoop-1.0.0.tar.gz“ 安装包。
cd /usr
tar –xzvf hadoop-1.1.2.tar.gz
mv hadoop-1.1.2 hadoop
chown –R hadoop:hadoop hadoop #将文件夹 “hadoop” 读权限分配给 hadoop 普通用户
rm -rf hadoop-1.1.2.tar.gz
最后在 “/usr/hadoop“ 下面创建 tmp 文件夹,并把 Hadoop 的安装路径添加到 “/etc/profile“ 中,修改 “/etc/profile” 文件,将以下语句添加到 末尾,并使其生效(. /etc/profile):
# set hadoop path
export HADOOP_HOME=/usr/hadoop
export PATH=$PATH :$HADOOP_HOME/bin
4.2 配置hadoop
(1)配置hadoop-env.sh
该 “hadoop-env.sh“ 文件位于 “/usr/hadoop/conf“ 目录下。
在文件中修改下面内容:
export JAVA_HOME=/usr/java/jdk1.7.0_25
Hadoop配置文件在 conf 目录下,之前的版本的配置文件主要是 Hadoop-default.xml 和Hadoop-site.xml。由于 Hadoop 发展迅速,代码量急剧增加,代码开发分为了 core,hdfs 和map/reduce三部分,配置文件也被分成了三个 core- site.xml、hdfs-site.xml、mapred-site.xml。core-site.xml 和hdfs-site.xml是站在 HDFS 角度上配置文件;core-site.xml和 mapred-site.xml 是站在 MapReduce 角度上配置文件。
(2)配置 core-site.xml 文件
修改 Hadoop 核心配置文件core-site.xml,这里配置的是HDFS master(即namenode)的地址和端口号。
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop/tmp</value>
(备注:请先在 /usr/hadoop 目录下建立 tmp 文件夹)
<description>A base for other temporary directories.</description>
</property>
<!– file system properties –>
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.1.141:9000</value>
</property>
</configuration>
备注:如没有配置 hadoop.tmp.dir 参数,此时系统默认的临时目录为:/tmp/hadoo-hadoop。而这个目录在每次重启后都会被删掉,必须重新执行 format 才行,否则会出错。
(3)配置 hdfs-site.xml 文件
修改 Hadoop 中HDFS的配置,配置的备份方式默认为3。
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
(备注:replication 是数据副本数量,默认为 3,salve 少于 3 台就会报错)
</property>
<configuration>
(4)配置 mapred-site.xml 文件
修改 Hadoop 中MapReduce的配置文件,配置的是 JobTracker 的地址和端口。
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>http://192.168.1.141:9001</value>
</property>
</configuration>
(5)配置 masters 文件
有两种方案:
(1)第一种
修改 localhost 为Master.Hadoop
(2)第二种
去掉 “localhost”,加入Master 机器的IP:192.168.1.141
为保险起见,启用第二种,因为万一忘记配置 “/etc/hosts” 局域网的 DNS 失效,这样就会出现意想不到的错误,但是一旦 IP 配对,网络畅通,就能通过 IP 找到相应主机。
(6)配置 slaves 文件(Master主机特有)
有两种方案:
(1)第一种
去掉 “localhost”,每行添加一个主机名,把剩余的Slave 主机名都填上。
例如:添加形式如下:
Slave1.Hadoop
Slave2.Hadoop
(2)第二种
去掉 “localhost”,加入集群中所有Slave 机器的IP,也是每行一个。
例如:添加形式如下
192.168.1.142
192.168.1.137
原因和添加 “masters” 文件一样,选择第二种方式。
现在在 Master 机器上的 Hadoop 配置就结束了,剩下的就是配置 Slave 机器上的Hadoop。
最简单的方法是 将 Master上配置好的 hadoop 所在文件夹 “/usr/hadoop“ 复制到所有的 Slave 的“/usr”目录下(实际上 Slave 机器上的 slavers 文件是不必要的,复制了也没问题)。用下面命令格式进行。(备注:此时用户可以为普通用户也可以为root)
scp -r /usr/hadoop root@服务器IP:/usr/
例如:从 “Master.Hadoop” 到“Slave1.Hadoop”复制配置 Hadoop 的文件。
scp -r /usr/hadoop root@Slave1.Hadoop:/usr/
以 root 用户进行复制,当然不管是用户 root 还是普通用户,虽然 Master 机器上的 “/usr/hadoop” 文件夹用户 hadoop 有权限,但是 Slave1 上的 hadoop 用户却没有 “/usr” 权限,所以没有创建文件夹的权限。所以无论是哪个用户进行拷贝,右面都是 “root@ 机器 IP” 格式 。因为我们只是建立起了普通用户的SSH 无密码连接,所以用 root 进行 “scp” 时,扔提示让你输入 “Slave1.Hadoop” 服务器用户 root 的密码。
查看 “Slave1.Hadoop” 服务器的 “/usr” 目录下是否已经存在 “hadoop” 文件夹,确认已经复制成功。查看结果如下:
从上图中知道,hadoop文件夹确实已经复制了,但是我们发现 hadoop 权限是 root,所以我们现在要给“Slave1.Hadoop” 服务器上的用户 hadoop 添加对 “/usr/hadoop” 读权限。
以 root 用户登录“Slave1.Hadoop”,执行下面命令。
chown -R hadoop:hadoop(用户名:用户组 ) hadoop( 文件夹)
接着在 “Slave1 .Hadoop” 上修改 “/etc/profile” 文件,将以下语句添加到末尾,并使其有效(source /etc/profile):
# set hadoop environment
export HADOOP_HOME=/usr/hadoop
export PATH=$PATH :$HADOOP_HOME/bin
如果不知道怎么设置,可以查看前面 “Master.Hadoop” 机器的 “/etc/profile” 文件的配置,到此为止在一台 Slave 机器上的 Hadoop 配置就结束了。剩下的事儿就是照葫芦画瓢把剩余的几台 Slave 机器进行部署Hadoop。
4.3 启动及验证
(1)格式化 HDFS 文件系统
在 “Master.Hadoop” 上使用 普通 用户 hadoop 进行操作。(备注:只需一次,下次启动不再需要格式化,只需 start-all.sh)
hadoop namenode -format
从上图中知道我们已经成功格式化了,但是美中不足就是出现了一个 警告 ,从网上得知这个警告并不影响hadoop 执行,但是也有办法解决,详情看后面的 “ 常见问题FAQ”。
(2)启动hadoop
在启动前关闭集群中所有机器的防火墙,不然会出现 datanode 开后又自动关闭。使用下面命令启动。
start-all.sh
可以通过以下启动日志看出,首先启动 namenode 接着启动datanode1,datanode2,…,然后启动secondarynamenode。再启动jobtracker,然后启动tasktracker1,tasktracker2,…。
启动 hadoop 成功后,在 Master 中的 tmp 文件夹中生成了 dfs 文件夹,在 Slave 中的 tmp 文件夹中均生成了 dfs 文件夹和 mapred 文件夹。
(3)验证hadoop
(1)验证方法一:用 “jps” 命令
在 Master 上用 java 自带的小工具 jps 查看进程。
在 Slave2 上用 jps 查看进程。
如果在查看 Slave 机器中发现 “DataNode” 和“TaskTracker”没有起来时,先查看一下日志的,如果是 “namespaceID” 不一致问题,采用 “ 常见问题 FAQ6.2″ 进行解决,如果是 “No route to host” 问题,采用 “ 常见问题 FAQ6.3″ 进行解决。
(2)验证方式二:用“hadoop dfsadmin -report”
用这个命令可以查看 Hadoop 集群的状态。
4.4 网页查看集群
(1)访问“http://192.168.1.141:50030”
(2)访问“http://192.168.1.142:50070“
5、常见问题FAQ
5.1 关于 Warning: $HADOOP_HOME is deprecated.
hadoop安装完之后敲入 hadoop 命令时,老 是提示这个警告:
Warning: $HADOOP_HOME is deprecated.
经查 hadoop-1.1.2/bin/hadoop 脚本和 “hadoop-config.sh” 脚本,发现脚本中对 HADOOP_HOME 的环境变量设置做了判断,其实根本不需要设置 HADOOP_HOME 环境变量。
解决方案一:编辑 “/etc/profile” 文件,去掉 HADOOP_HOME 的变量设定,重新输入 hadoop fs 命令,警告消失。
解决方案二:编辑 “/etc/profile” 文件,添加一个环境变量,之后警告消失:
export HADOOP_HOME_WARN_SUPPRESS=1
5.2 解决 “no datanode to stop” 问题
当我停止 Hadoop 时发现如下信息:
no datanode to stop
原因:每次 namenode format 会重新创建一个 namenodeId,而tmp/dfs/data 下包含了上次 format 下的 id,namenode format 清空了 namenode 下的数据,但是没有清空 datanode 下的数据,导致启动时失败,有两种解决方案:
第一种解决方案如下:
1)先删除“/usr/hadoop/tmp”
rm -rf /usr/hadoop/tmp
2)创建 “/usr/hadoop/tmp” 文件夹
mkdir /usr/hadoop/tmp
3)删除 “/tmp” 下以 “hadoop” 开头文件
rm -rf /tmp/hadoop*
4)重新格式化hadoop
hadoop namenode -format
5)启动hadoop
start-all.sh
使用第一种方案,有种不好处就是原来集群上的重要数据全没有了。假如说 Hadoop 集群已经运行了一段时间。建议采用第二种。
第二种方案如下:
1)修改每个 Slave 的namespaceID使其与 Master 的namespaceID一致。
或者
2)修改 Master 的namespaceID使其与 Slave 的namespaceID一致。
该 “namespaceID” 位于 “/usr/hadoop/tmp/dfs/name/current/VERSION“ 文件中,前面 蓝色 的可能根据实际情况变化,但后面 红色一般 是不变的。
例如:查看 “Master” 下的 “VERSION“ 文件
本人建议采用 第二种,这样方便快捷,而且还能防止误删。
5.3 Slave服务器中 datanode 启动后又自动关闭
查看日志发下如下错误。
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Call to … failed on local exception: java.net.NoRouteToHostException: No route to host
解决方案是:关闭防火墙
5.4 从本地往 hdfs 文件系统上传文件
出现如下错误:
INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad connect ack with firstBadLink
INFO hdfs.DFSClient: Abandoning block blk_-1300529705803292651_37023
WARN hdfs.DFSClient: DataStreamer Exception: java.io.IOException: Unable to create new block.
解决方案是:
1)关闭防火墙
2)禁用selinux
编辑 “/etc/selinux/config“ 文件,设置“SELINUX=disabled“
5.5 安全模式导致的错误
出现如下错误:
org.apache.hadoop.dfs.SafeModeException: Cannot delete …, Name node is in safe mode
在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个 DataNode 上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
解决方案是:关闭安全模式
hadoop dfsadmin -safemode leave
5.6 解决Exceeded MAX_FAILED_UNIQUE_FETCHES
出现错误如下:
Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out
程序里面需要打开多个文件,进行分析,系统一般默认数量是 1024,(用ulimit -a 可以看到)对于正常使用是够了,但是对于程序来讲,就太少了。
解决方案是:修改 2 个文件。
1)“/etc/security/limits.conf”
vi /etc/security/limits.conf
加上:
soft nofile 102400
hard nofile 409600
2)“/etc/pam.d/login”
vim /etc/pam.d/login
添加:
session required /lib/security/pam_limits.so
针对第一个问题我纠正下答案:
这是 reduce 预处理阶段 shuffle 时获取已完成的 map 的输出失败次数超过上限造成的,上限默认为5。引起此问题的方式可能会有很多种,比如网络连接不正常,连接超时,带宽较差以及端口阻塞等。通常框架内网络情况较好是不会出现此错误的。
5.7 解决“Too many fetch-failures”
出现这个问题主要是结点间的连通不够全面。
解决方案是:
1)检查“/etc/hosts”
要求本机 ip 对应服务器名
要求要包含所有的服务器 ip + 服务器名
2)检查“.ssh/authorized_keys”
要求包含所有服务器(包括其自身)的public key
5.8 处理速度特别的慢
出现 map 很快 ,但是reduce 很慢,而且反复出现“reduce=0%“。
解决方案如下:
结合解决方案 5.7,然后修改“conf/hadoop-env.sh” 中的“export HADOOP_HEAPSIZE=4000”
5.9 解决 hadoop OutOfMemoryError 问题
出现这种异常,明显是 jvm 内存不够得原因。
解决方案如下:要修改所有的 datanode 的jvm内存大小。
Java –Xms 1024m -Xmx 4096m
一般 jvm 的最大内存使用应该为总内存大小的一半,我们使用的 8G 内存,所以设置为4096m,这一值可能依旧不是最优的值。
更多 Hadoop 相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-02/128149.htm