一、服务器说明
master 192.168.1.61
node1 192.168.1.62
node2 192.168.1.63
二、网络配置(各服务器)
参考伪分布式安装
三、ssh免密码验证配置(各服务器)
参考伪分布式安装
master到slaver必须要免密码登陆
slaver到master是否需要免密码登陆暂不确定
四、安装JDK(各服务器)
各台服务器都安装java,并配置环境变量
参考伪分布式安装
五、安装hadoop(各服务器)
1、将hadoop的安装路径添加到环境变量中
2、在"/opt/modules/hadoop"创建"tmp"文件夹,用于存放系统运行过程中namenode、datanode的数据
3、配置master上的hadoop
配置core-site.xml文件
修改hadoop核心配置文件core-site.xml,这里配置的是HDFS的地址和端口号。
<configuration>
<property>
<name>hadoop.tmp.dir</name><value>/usr/hadoop/tmp</value>
</property><property>
<name>fs.default.name</name><value>hdfs://192.168.1.61:9000</value>
</property>
</configuration>
备注:如没有配置hadoop.tmp.dir参数,此时系统默认的临时目录为:/tmp/hadoo-hadoop。而这个目录在每次重启后都会被干掉,必须
重新执行format才行,否则会出错。
配置hdfs-site.xml文件
修改Hadoop中HDFS的配置,配置的备份方式默认为3.
<configuration>
<property>
<name>dfs.replication</name><value>2</value>
</property>
</configuration>
配置mapred-site.xml文件
修改Hadoop中MapReduce的配置文件,配置的是JobTracker的地址和端口。
<configuration>
<property>
<name>mapred.job.tracker</name><value>http://192.168.1.61:9001</value>
</property>
</configuration>
配置masters文件
vi masters
master
或
vi masters
192.168.1.61
配置slaves文件(该文件只有master主机需要配置)
vi slaves
node1
node2
或
vi slaves
192.168.1.62
192.168.1.63
4、配置slaver上的hadoop
scp /home/hadoop/.ssh/authorized_keys hadoop@192.168.1.62:/home/hadoop/.ssh
scp /home/hadoop/.ssh/authorized_keys hadoop@192.168.1.63:/home/hadoop/.ssh
core-site.xml中,fs.default.name是NameNode的主机(或者IP)和端口。主机:端口。
mapred-site.xml中,mapred.job.tracker是JobTracker的主机(或者IP)和端口。主机:端口。
六、启动及验证
1、格式化HDFS文件系统
在master上使用普通用户hadoop进行操作。
备注:只需一次,下次启动不再需要格式化,只需start-all.sh
hadoop namenode -format
2、启动hadoop
在启动前关闭集群中所有机器的防火墙,不然会出现datanode开后又自动关闭。
service iptables stop
使用下面命令启动。
start-all.sh
执行结果如下:
可以通过以下启动日志看出,首先启动namenode接着启动datanode1,datanode2,......,然后启动secondarynamenode。再启动
jobtracker,然后启动tasktracker1,tasktracker2,....。
启动hadoop成功后,在master中的tmp文件夹中生成了dfs文件夹,在slaver中的tmp文件夹中均生成了dfs文件夹和mapred文件夹。
3、验证hadoop
(1)验证方法一:用"jps"命令
在master上用java自带的小工具jps查看进程。
在slave1上用jps查看进程。
(2)验证方式二:用"hadoop dfsadmin -report"
用这个命令可以查看Hadoop集群的状态。
Master服务器的状态:
slave服务器的状态
七、网页查看集群
(1)访问"http:192.168.1.61:50030"
(2)访问"http:192.168.1.61:50070"
八、常见问题
(1)关于 Warning: $HADOOP_HOME is deprecated
hadoop 1.0.3版本,安装完之后敲入hadoop命令时,老是提示这个警告:
Warning: $HADOOP_HOME is deprecated.
经查hadoop-1.0.0/bin/hadoop脚本和"hadoop-config.sh"脚本,发现脚本中对HADOOP_HOME的环境变量设置做了判断,笔者的环境根本不需要设置HADOOP_HOME环境变量。
解决方案一:编辑"/etc/profile"文件,去掉HADOOP_HOME的变量设定,重新输入hadoop fs命令,警告消失。
解决方案二:编辑"/etc/profile"文件,添加一个环境变量,之后警告消失:
export HADOOP_HOME_WARN_SUPPRESS=1
生效:source /etc/profile
解决方案三:编辑"hadoop-config.sh"文件,把下面的"if - fi"功能注释掉。
(2)解决"no datanode to stop"问题
当我停止Hadoop时发现如下信息:
原因:每次namenode format会重新创建一个namenodeId,而tmp/dfs/data下包含了上次format下的id,namenode format清空了namenode下的数据,但是没有清空datanode下的数据,导致启动时失败,所要做的就是每次fotmat前,清空tmp一下的所有目录。
第一种解决方案如下:
1)先删除"/opt/modules/hadoop/tmp"
rm -rf /opt/modules/hadoop/tmp
2)创建"/opt/modules/hadoop/tmp"文件夹
mkdir /opt/modules/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"位于"/ opt/modules/tmp/dfs/data/current/VERSION"文件中,前面蓝色的可能根据实际情况变化,但后面红色是不变的。
例如:查看"Master"下的"VERSION"文件
建议使用第二种,这样方便快捷,而且还能防止误删。
(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
解决方案是:关闭防火墙
service iptables stop
(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)关闭防火墙
service iptables stop
2)禁用selinux
编辑 "/etc/selinux/config"文件,设置"SELINUX=disabled"
(5)安全模式导致的错误
出现如下错误:
org.apache.hadoop.dfs.SafeModeException: Cannot delete ..., Name node is in safe mode
在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
解决方案是:关闭安全模式
hadoop dfsadmin -safemode leave
(6)解决Exceeded MAX_FAILED_UNIQUE_FETCHES
出现错误如下:
Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out
程序里面需要打开多个文件,进行分析,系统一般默认数量是1024,(用ulimit -a可以看到)对于正常使用是够了,但是对于程序来讲,就太少了。
解决方案是:修改2个文件。
1)"/etc/security/limits.conf"
vim /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。引起此问题的方式可能会有很多种,比如网络连接不正常,连接超时,带宽较差以及端口阻塞等。通常框架内网络情况较好是不会出现此错误的。
(7)解决"Too many fetch-failures"
出现这个问题主要是结点间的连通不够全面。
解决方案是:
1)检查"/etc/hosts"
要求本机ip 对应 服务器名
要求要包含所有的服务器ip +服务器名
2)检查".ssh/authorized_keys"
要求包含所有服务器(包括其自身)的public key
(8)处理速度特别的慢
出现map很快,但是reduce很慢,而且反复出现"reduce=0%"。
解决方案如下:
结合解决方案5.7,然后修改"conf/hadoop-env.sh"中的"export HADOOP_HEAPSIZE=4000"
(9)解决hadoop OutOfMemoryError问题
出现这种异常,明显是jvm内存不够得原因。
解决方案如下:要修改所有的datanode的jvm内存大小。
Java –Xms 1024m -Xmx 4096m
一般jvm的最大内存使用应该为总内存大小的一半,我们使用的8G内存,所以设置为4096m,这一值可能依旧不是最优的值。
(10)Namenode in safe mode
解决方案如下:
bin/hadoop dfsadmin -safemode leave
(11)IO写操作出现问题
0-1246359584298, infoPort=50075, ipcPort=50020):Got exception while serving blk_-5911099437886836280_1292 to /172.16.100.165:
java.net.SocketTimeoutException: 480000 millis timeout while waiting for channel to be ready for write. ch : java.nio.channels.SocketChannel[connected local=/
172.16.100.165:50010 remote=/172.16.100.165:50930]
at org.apache.hadoop.net.SocketIOWithTimeout.waitForIO(SocketIOWithTimeout.java:185)
at org.apache.hadoop.net.SocketOutputStream.waitForWritable(SocketOutputStream.java:159)
……
It seems there are many reasons that it can timeout, the example given in HADOOP-3831 is a slow reading client.
解决方案如下:
在hadoop-site.xml中设置dfs.datanode.socket.write.timeout=0
(12)status of 255 error
错误类型:
java.io.IOException: Task process exit with nonzero status of 255.
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:424)
错误原因:
Set mapred.jobtracker.retirejob.interval and mapred.userlog.retain.hours to higher value. By default, their values are 24 hours. These might be the reason for failure, though I'm not sure restart.
解决方案如下:单个datanode
如果一个datanode 出现问题,解决之后需要重新加入cluster而不重启cluster,方法如下:
bin/hadoop-daemon.sh start datanode
bin/hadoop-daemon.sh start jobtracker
(13)nodes为0
1)浏览器访问时如http://NameNode:50070 Live Nodes是否为0(注意:进程启动正常,而Live Nodes也可能为0),
可能是因为防火墙的原因,需要到所有的节点上执行service iptables stop 来关闭防火墙;
2)还有http://NameNode:50030 的Nodes是否为0——>
解决1:将各机器的tmp目录下的内容删除,再重新格式化文件系统,就可以正常运转了。
解决2:可能是因为子节点的mapred-site.xml的配置错误,一定要配置成namenode的ip
(14)如果 bin/hadoop jar hadoop-0.16.0-examples.jar wordcount input output过程中 INFO mapred.JobClient: map 0% reduce 0%
且一直卡住,在log日志中也没有出现异样,那么解决办法是,把/etc/hosts里面多余的机器名删掉,即可。