5、常见问题FAQ
5.1 关于 Warning: $HADOOP_HOME is deprecated.hadoop 1.0.0版本,安装完之后敲入hadoop命令时,老是提示这个警告:
经查hadoop-1.0.0/bin/hadoop脚本和"hadoop-config.sh"脚本,发现脚本中对HADOOP_HOME的环境变量设置做了判断,笔者的环境根本不需要设置HADOOP_HOME环境变量。 解决方案一:编辑"/etc/profile"文件,去掉HADOOP_HOME的变量设定,重新输入hadoop fs命令,警告消失。 解决方案二:编辑"/etc/profile"文件,添加一个环境变量,之后警告消失:
解决方案三:编辑"hadoop-config.sh"文件,把下面的"if - fi"功能注释掉。
我们这里本着不动Hadoop原配置文件的前提下,采用"方案二",在"/etc/profile"文件添加上面内容,并用命令"source /etc/profile"使之有效。 1)切换至root用户
2)添加内容
3)重新生效
5.2 解决"no datanode to stop"问题当我停止Hadoop时发现如下信息:
原因:每次namenode format会重新创建一个namenodeId,而tmp/dfs/data下包含了上次format下的id,namenode format清空了namenode下的数据,但是没有清空datanode下的数据,导致启动时失败,所要做的就是每次fotmat前,清空tmp一下 的所有目录。 第一种解决方案如下: 1)先删除"/usr/hadoop/tmp"
2)创建"/usr/hadoop/tmp"文件夹
3)删除"/tmp"下以"hadoop"开头文件
4)重新格式化hadoop
5)启动hadoop
使用第一种方案,有种不好处就是原来集群上的重要数据全没有了。假如说Hadoop集群已经运行了一段时间。建议采用第二种。 第二种方案如下: 1)修改每个Slave的namespaceID使其与Master的namespaceID一致。 或者 2)修改Master的namespaceID使其与Slave的namespaceID一致。
该"namespaceID"位于"/usr/hadoop/tmp/dfs/data/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上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以 进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。 解决方案是:关闭安全模式
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"
加上:
2)"/etc/pam.d/login"
添加:
针对第一个问题我纠正下答案: 这是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内存大小。
一般jvm的最大内存使用应该为总内存大小的一半,我们使用的8G内存,所以设置为4096m,这一值可能依旧不是最优的值。
5.10 Namenode in safe mode解决方案如下:
5.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
5.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,方法如下:
6、用到的Linux命令
6.1 chmod命令详解使用权限:所有使用者 使用方式:chmod [-cfvR] [--help] [--version] mode file... 说明: Linux/Unix 的档案存取权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所存取。 mode :权限设定字串,格式如下 :[ugoa...][[+-=][rwxX]...][,...],其中u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
范例: 将档案 file1.txt 设为所有人皆可读取
将档案 file1.txt 设为所有人皆可读取
将档案 file1.txt 与 file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入
将 ex1.py 设定为只有该档案拥有者可以执行
将目前目录下的所有档案与子目录皆设为任何人可读取
此外chmod也可以用数字来表示权限如 chmod 777 file 语法为:chmod abc file 其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。 r=4,w=2,x=1 若要rwx属性则4+2+1=7; 若要rw-属性则4+2=6; 若要r-x属性则4+1=7。 范例: chmod a=rwx file 和 chmod 777 file 效果相同 chmod ug=rwx,o=x file 和 chmod 771 file 效果相同 若用chmod 4755 filename可使此程式具有root的权限
6.2 chown命令详解使用权限:root 使用方式:chown [-cfhvR] [--help] [--version] user[:group] file... 说明: Linux/Unix 是多人多工作业系统,所有的档案皆有拥有者。利用 chown 可以将档案的拥有者加以改变。一般来说,这个指令只有是由系统管理者(root)所使用,一般使用者没有权限可以改变别人的档案拥有者,也没有权限可以自 己的档案拥有者改设为别人。只有系统管理者(root)才有这样的权限。
范例: 将档案 file1.txt 的拥有者设为 users 群体的使用者 jessie
将目前目录下的所有档案与子目录的拥有者皆设为 users 群体的使用者 lamport
以下是对目录的两个普通设定:
suid的代表数字是4,比如4755的结果是-rwsr-xr-x sgid的代表数字是2,比如6755的结果是-rwsr-sr-x sticky位代表数字是1,比如7755的结果是-rwsr-sr-t
6.3 scp命令详解scp是 secure copy的缩写,scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。linux的scp命令可以在linux服务器之间复制文件和目录。 scp命令的用处: scp在网络上不同的主机之间复制文件,它使用ssh安全协议传输数据,具有和ssh一样的验证机制,从而安全的远程拷贝文件。 scp命令基本格式:
scp命令的参数说明:
scp命令的实际应用 1)从本地服务器复制到远程服务器 (1) 复制文件: 命令格式:
或者
或者
或者
第1,2个指定了用户名,命令执行后需要输入用户密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名 第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名 实例:
(2) 复制目录: 命令格式:
或者
第1个指定了用户名,命令执行后需要输入用户密码; 第2个没有指定用户名,命令执行后需要输入用户名和密码;
例子:
上面 命令 将 本地 soft 目录 复制 到 远程 others 目录下,即复制后远程服务器上会有/home/linux/others/soft/ 目录。
2)从远程服务器复制到本地服务器 从远程复制到本地的scp命令与上面的命令雷同,只要将从本地复制到远程的命令后面2个参数互换顺序就行了。 例如:
(责任编辑:IT) |