2012年8月22日星期三

Hadoop 常见问题和说明


  1. Warning: $HADOOP_HOME is deprecated.
    执行 Hadoop 命令时,收到警告:
    [bash]
    [hduser@master hadoop]$ ./bin/hadoop
    Warning: $HADOOP_HOME is deprecated.
    [/bash]
    取消警告,设置环境变量 $HADOOP_HOME_WARN_SUPPRESS=1。更简便的方法是将环境变量加入到 shell 配置文件中,假设 shell 为 bash:
    [bash]
    vim $HOME/.bashrc
    export HADOOP_HOME_WARN_SUPPRESS=1
    [/bash]

  2. Name node is in safe mode.
    对 Hadoop 操作时,收到 Name node is in safe mode的提示, e.g.
    [bash]
    [hduser@master hadoop]$ hadoop fs -put word-input/ wordinput
    put: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create directory /user/hduser/wordinput. Name node is in safe mode.
    [/bash]
    如想立即退出安全模式,直接执行 hadoop dfsadmin -safemode leave命令。

    Background:
    NameNode 在启动的时候首先进入安全模式,如果 DataNode 丢失的 blocks 达到一定的比例(1 - dfs.safemode.threshold.pct),则系统会一直处于安全模式状态即只读状态。
    dfs.safemode.threshold.pct (默认值为 0.999f,定义于 conf/hdfs-site.xml文件中),表示 HDFS 启动的时候, 如果 DataNode 上报的 blocks 个数达到最小备份级别 (默认是 1, 可以通过 dfs.replication.min 设置) blocks 个数的 0.999 倍 才可以离开安全模式,否则一直处于只读模式, 如果设为 1,则 HDFS 永远是处于 safemode, 而如果设为 0,NameNode 不会从安全模式启动。

    下面是来自某个 NameNode 启动时的日志,blocks 上报比例为 1 , 达到了阀值 0.999:

    The ratio of reported blocks 1.0000 has reached the threshold 0.9990. Safe mode will be turned off automatically in 18 seconds.


    从上面可知,除了执行命令 hadoop dfsadmin -safemode leave 强制退出外,修改 dfs.safemode.threshold.pct 为较小的值也可退出安全模式。

    操作安全模式下的命令: hadoop dfsadmin -safemode [value]

    • enter 进入安全模式。

    • leave 强制 NameNode 离开安全模式。

    • get 返回安全模式是否开启的信息。

    • wait 等待,一直到安全模式结束。



  3. Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out
    Hadoop 运行时需要打开多个文件进行分析,系统一般默认是 1024(ulimit -a可查看),正常情况下这个大小已经足够,但在 Hadoop 处理大数据量时来说,这还不够大。解决办法,需修改两个文件:

    1. 文件 /etc/security/limits.conf:
      [bash]
      vim /etc/security/limits.conf
      #加上
      * soft nofile 102400
      * hard nofile 409600
      [/bash]

    2. 文件 /etc/pam.d/login
      [bash]
      # 32 位机器加上
      session required /lib/security/pam_limits.so
      # 64 位机器加上
      session required /lib64/security/pam_limits.so
      [/bash]



  4. Too many fetch-failures
    出现这个错误,表明 cluster 结点间的连接出现问题。

    1. 检查所有节点的 /etc/hosts, 除了本机 IP 需要对应 服务器名外,还要包含 cluster 中所有结点的 IP 和 服务器名。

    2. 检查 $HOME/.ssh/authorized_keys,要求包含访问用户的public key





  5. job 执行时,map 快,但是 reduce 很慢,且反复出现 reduce=0%
    修改 conf/hadoop-env.shexport HADOOP_HEAPSIZE=4000

  6. 能够启动 DataNode,但无法访问,也无法结束。
    在重新格式化一个新的分布式文件时,需要将 NameNode 上所配置的 dfs.name.dir 这一 NameNode 用来存放 NameNode 持久存储名字空间及事务日志的本地文件系统路径删除,同时将各 DataNode 上的 dfs.data.dir 的路径 DataNode 存放块数据的本地文件系统路径的目录也删除。这是因为 Hadoop 在格式化一个新的分布式文件系统时,每个存储的名字空间都对应了建立时间的那个版本(可查看/tmp/hadoop/dfs/name/current/VERSION目录下的 VERSION 文件,上面记录了版本信息),所以在重新格式化新的分布式系统文件时,最好先删除 name 目录。同时,也必须删除所有 DataNode 的 dfs.data.dir 指定的目录。这样才可以使 NameNode 和 DataNode 的版本信息对应。注意:删除很危险!

  7. java.io.IOException: Could not obtain block: blk_*********_*** file=/user/hduser/warehouse/src_***_log/src_***_log
    出现这种情况大多是没有连接上结点。

  8. java.lang.OutOfMemoryError: Java heap space
    出现这种异常,是 jvm 内存不够得,需修改所有的 DataNode 的 jvm 内存大小。
    [bash gutter="false"]
    Java -Xms1024m -Xmx4096m
    [/bash]
    一般 jvm 的最大内存使用应该为总内存大小的一半,若内存为 8G ,所以设置为 4096M ,这一值可能依旧不是最优的值。(其实最好设置为真实物理内存大小的 0.8)

  9. map 100 %,reduce 到 98% 左右时,job 直接进 failed
    检查 mapred.map.tasks是不是设置过大,设置太大的话会导致处理大量的小文件。另外,还需检查 mapred.reduce.parallel.copies 是否设置合适。

  10. hadoop.tmp.dir
    hadoop.tmp.dir 修改后,master 需要 hadoop namenode -format 重新将 HDFS 格式化,且需要删除从库的 hadoop.data.dir 数据目录。


  11. dfs.replication 和 dfs.block.size
    dfs.replication 表示数据备份的数量,默认是 3dfs.block.size,block 的大小,单位字节,它必须是必须是 512 的倍数,因为采用 crc 作文件完整性交验,默认配置 512 是 checksum 的最小单元。

  12. ipc.Client: Retrying connect to server: localhost/127.0.0.1:54310. Already tried

    • 这可能是由于 HDFS format 失败引起的,format 失败的原因可能是用户对 hadoop.tmp.dir 目录的权限不够,可以执行
      [bash]
      # 假设 hadoop.tmp.dirvalue 为 /tmp/hadoop
      $ sudo chown -R hduser /tmp/hadoop
      [/bash]


    • [bash gutter="false"]
      [hduser@hadoop hadoop]# hadoop fs -ls
      12/08/01 15:14:51 INFO ipc.Client: Retrying connect to server: hadoop.master/192.168.0.3:54310. Already tried 0 time(s).
      12/08/01 15:14:52 INFO ipc.Client: Retrying connect to server: hadoop.master/192.168.0.3:54310. Already tried 1 time(s).
      12/08/01 15:14:53 INFO ipc.Client: Retrying connect to server: hadoop.master/192.168.0.3:54310. Already tried 2 time(s).
      12/08/01 15:14:54 INFO ipc.Client: Retrying connect to server: hadoop.master/192.168.0.3:54310. Already tried 3 time(s).
      12/08/01 15:14:55 INFO ipc.Client: Retrying connect to server: hadoop.master/192.168.0.3:54310. Already tried 4 time(s).
      12/08/01 15:14:56 INFO ipc.Client: Retrying connect to server: hadoop.master/192.168.0.3:54310. Already tried 5 time(s).
      12/08/01 15:14:57 INFO ipc.Client: Retrying connect to server: hadoop.master/192.168.0.3:54310. Already tried 6 time(s).
      12/08/01 15:14:58 INFO ipc.Client: Retrying connect to server: hadoop.master/192.168.0.3:54310. Already tried 7 time(s).
      12/08/01 15:14:59 INFO ipc.Client: Retrying connect to server: hadoop.master/192.168.0.3:54310. Already tried 8 time(s).
      12/08/01 15:15:00 INFO ipc.Client: Retrying connect to server: hadoop.master/192.168.0.3:54310. Already tried 9 time(s).
      Bad connection to FS. command aborted. exception: Call to hadoop.master/192.168.0.3:54310 failed on connection exception: java.net.ConnectException: Connection refused
      [/bash]
      服务未启动。master 上执行命令启动服务:
      [bash]
      [hduer@master /usr/local/hadoop]$ bin/start-hdfs.sh
      [/bash]






References:

没有评论 :

发表评论