1、集群部署介绍html
1.1 Hadoop简介java
Hadoop是Apache软件基金会旗下的一个开源分布式计算平台。以Hadoop分布式文件系统HDFS(Hadoop Distributed Filesystem)和MapReduce(Google MapReduce的开源实现)为核心的Hadoop为用户提供了系统底层细节透明的分布式基础架构。node
对于Hadoop的集群来说,能够分红两大类角色:Master和Salve。一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode做为主服务器,管理文件系统的命名空间和客户端对文件系统的访问操做;集群中的DataNode管理存储的数据。MapReduce框架是由一个单独运行在主节点上的JobTracker和运行在每一个从节点的TaskTracker共同组成的。主节点负责调度构成一个做业的全部任 务,这些任务分布在不一样的从节点上。主节点监控它们的执行状况,而且从新执行以前的失败任务;从节点仅负责由主节点指派的任务。当一个Job被提交时,JobTracker接收到提交做业和配置信息以后,就会将配置信息等分发给从节点,同时调度任务并监控TaskTracker的执行。linux
从上面的介绍能够看出,HDFS和MapReduce共同组成了Hadoop分布式系统体系结构的核心。HDFS在集群上实现分布式文件系统,MapReduce在集群上实现了分布式计算和任务处理。HDFS在MapReduce任务处理过程当中提供了文件操做和存储等支持,MapReduce在HDFS的基础上实现了任务的分发、跟踪、执行等工做,并收集结果,两者相互做用,完成了Hadoop分布式集群的主要任务。apache
1.2 环境说明vim
个人环境是在虚拟机中配置的,Hadoop集群中包括4个节点:1个Master,2个Salve,节点之间局域网链接,能够相互ping通,节点IP地址分布以下:安全
虚拟机系统服务器 |
机器名称网络 |
IP地址session |
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
如今咱们在进行对机器为"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,这一值可能依旧不是最优的值。