HDFS常见的问题和处理方法积累

Hadoop常见问题与解决办法

  • 问题1:reduce预处理阶段shuffle时获取已完成的map的输出失败次数超过上限
    • 问题描述:
    • 问题剖析:
    • 解决方案:
  • 问题2:Too many fetch-failures
    • 问题描述:
    • 问题剖析:
    • 解决方案:
  • 问题3:处理MR速度特别的慢
    • 问题描述:
    • 问题剖析:
    • 解决方案:
  • 问题4:能够启动datanode,但无法访问,也无法结束
    • 问题描述:
    • 问题剖析:
    • 解决方案:
  • 问题5:节点断联
    • 问题描述:
    • 问题剖析:
    • 解决方案:
  • 问题6:JVM内存不够
    • 问题描述:
    • 问题剖析:
    • 解决方案:
    • 或者:
  • 问题7:Hadoop添加节点的方法
    • 解决方案:
    • 备注:
    • 较好的建议:
  • 问题8:给单个node新加硬盘
    • 解决方法:
  • 问题9:IO写操作出现问题
    • 问题描述:
  • 解决办法:
  • 问题10:HDFS退服节点的方法
    • 解决办法:
  • 问题11:IO异常
    • 问题描述:
    • 解决方法:
  • 问题12:status of 255 error
    • 问题描述:
    • 错误原因:
  • 问题13:sort by value
    • 解决方法:
  • 问题14:restart 单个datanode
    • 处理方法:
  • 问题15:Namenode in safe mode
    • 解决办法:
  • 问题16:java.net.NoRouteToHostException: No route to host
    • 解决办法:
  • 问题17:更改namenode后,在hive中运行select 依旧指向之前的namenode地址
    • 原因:
  • 问题18:磁盘写满了
    • 问题描述:
    • 解决办法:
  • 问题19:
    • 问题描述:
    • 原因:
    • 解决方法:
  • 问题20:map和reduce的相对路径问题
    • 问题描述:
    • 原因:
    • 解决方法:
  • 问题21: ERROR metadata
    • 问题描述:
    • 原因:
    • 问题22:Exception in createBlockOutputStream java.io.IOException
    • 问题描述:
    • 解决方法:
  • 问题23: 某次正常运行mapreduce实例时,抛出错误
    • 问题描述:
    • 原因及解决:
  • 问题24:运行一段时间后hadoop不能stop-all.sh的问题,显示报错
    • 问题描述:
    • 问题原因及解决:
  • 问题25:Incompatible namespaceIDs
    • 问题描述:
    • 问题解决:
  • 问题26: Storage directory not exist
    • 问题描述:
    • 原因及解决办法:
  • 问题27:bin/hadoop jps后报如下异常:
    • 问题描述:
    • 原因及解决方法:
  • 问题28:taskTracker和jobTracker 启动失败
    • 问题描述:
    • 解决方法:
  • 问题29:NotReplicatedYetException
    • 问题描述:
    • 解决方法:
    • Q30:hadoop出现文件块丢失怎么处理?
  • Q31、用命令显示所有的datanode的健康状况
  • Q32:如何快速杀死一个job
  • Q8、Hdfs回收站(防误删)
  • Q33: Hadoop HDFS如何实现负载均衡
  • 问题34:HDFS只有一个操作实例
    • 问题描述:
    • 原因分析:
    • 解决办法:
  • 问题35:datanode连接不上namenode,导致datanode无法启动。
    • 问题描述:
    • 解决办法:
  • 问题36:从本地往hdfs文件系统上传文件,出现错误
    • 问题描述:
    • 解决方法:
  • 问题36:以本地模式运行hadoop时,抛异常
    • 问题描述:
    • 问题解决
  • 问题37:格式化hdfs文件系统时,出错
    • 问题描述:
    • 解决办法:
  • 问题38:datanode启动不了,并且报HDFS使用空间超过90%、
    • 问题描述:如题
    • 解决办法:
    • 如何改变文本的样式

问题1:reduce预处理阶段shuffle时获取已完成的map的输出失败次数超过上限

问题描述:

Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out

问题剖析:

这是reduce预处理阶段shuffle时获取已完成的map的输出失败次数超过上限造成的,上限默认为5。引起此问题的方式可能会有很多种,比如网络连接不正常,连接超时,带宽较差以及端口阻塞等。。。通常框架内网络情况较好是不会出现此错误的。

另一种说法:程序里面需要打开多个文件,进行分析,系统一般默认数量是1024,(用ulimit -a可以看到)对于正常使用是够了,但是对于程序来讲,就太少了。

解决方案:

修改2个文件。
/etc/security/limits.conf
vi /etc/security/limits.conf
加上:

  • soft nofile 102400

  • hard nofile 409600

    $cd /etc/pam.d/
    $sudo vi login
    添加 session required /lib/security/pam_limits.so

问题2:Too many fetch-failures

问题描述:

     Too many fetch-failures

问题剖析:

出现这个问题主要是结点间的连通不够全面。

解决方案:

  1. 检查 、/etc/hosts
    要求本机ip 对应 服务器名
    要求要包含所有的服务器ip + 服务器名
  2. 检查 .ssh/authorized_keys
    要求包含所有服务器(包括其自身)的public key

问题3:处理MR速度特别的慢

问题描述:

处理速度特别的慢 出现map很快 但是reduce很慢 而且反复出现 reduce=0%

问题剖析:

可能是节点的联通不够全面,或者hadoop为各个守护进程(namenode,secondarynamenode,jobtracker,datanode,tasktracker)统一分配的内存并不合适,

解决方案:

结合问题2,然后修改 conf/hadoop-env.sh 中的export HADOOP_HEAPSIZE=4000

问题4:能够启动datanode,但无法访问,也无法结束

问题描述:

如题所示

问题剖析:

重新格式化一个新的分布式文件时,需要将NameNode上所配置的dfs.name.dir,这一namenode用来存放NameNode 持久存储名字空间及事务日志的本地文件系统路径删除,同时将各DataNode上的dfs.data.dir的路径 ,用于存放块数据的本地文件系统路径的目录也删除。如本次配置就是在NameNode上删除 /home/hadoop/NameData,在DataNode 上删除 /home/hadoop/DataNode1和/home/hadoop/DataNode2
这是因为Hadoop在格式化一个新的分布式文件系统时,每个存储的名字空间都对应了建立时间的那个版本(可以查看/home/hadoop /NameData/current目录下的VERSION文件,上面记录了版本信息),在重新格式化新的分布式系统文件时,最好先删除NameData 目录。必须删除各DataNode的dfs.data.dir。这样才可以使namedode和datanode记录的信息版本对应。

解决方案:

如上所示。
注意:删除是个很危险的动作,不能确认的情况下不能删除!!做好删除的文件等通通备份!!

问题5:节点断联

问题描述:

java.io.IOException: Could not obtain block: blk_194219614024901469_1100 file=/user/hive/warehouse/src_20090724_log/src_20090724_log

问题剖析:

解决方案:

检查节点连接情况,恢复连接

问题6:JVM内存不够

问题描述:

  java.lang.OutOfMemoryError: Java heap space

问题剖析:

解决方案:

Java -Xms1024m -Xmx4096m
一般jvm的最大内存使用应该为总内存大小的一半,假设使用的8G内存,所以设置为4096m,这一值可能依旧不是最优的值。

或者:

 
mapred.child.java.opts
-Xmx800M -server
 

With the right JVM size in your hadoop-site.xml , you will have to copy this
to all mapred nodes and restart the cluster.

问题7:Hadoop添加节点的方法

解决方案:

  1. 先在slave上配置好环境,包括ssh,jdk,相关config,lib,bin等的拷贝;
  2. 将新的datanode的host加到集群namenode及其他datanode中去;
  3. 将新的datanode的ip加到master的conf/slaves中;
  4. 重启cluster,在cluster中看到新的datanode节点;
  5. 运行bin/start-balancer.sh,这个会很耗时间

备注:

  1. 如果不balance,那么cluster会把新的数据都存放在新的node上,这样会降低mr的工作效率;
  2. 也可调用bin/start-balancer.sh 命令执行,也可加参数 -threshold 5
    threshold 是平衡阈值,默认是10%,值越低各节点越平衡,但消耗时间也更长。
  3. balancer也可以在有mr job的cluster上运行,默认dfs.balance.bandwidthPerSec很低,为1M/s。在没有mr job时,可以提高该设置加快负载均衡时间。
    其他备注:
  4. 必须确保slave的firewall已关闭;
  5. 确保新的slave的ip已经添加到master及其他slaves的/etc/hosts中,反之也要将master及其他slave的ip添加到新的slave的/etc/hosts中
    mapper及reducer个数:
    mapper个数的设置:跟input file 有关系,也跟filesplits有关系,filesplits(块切分的大小)的上限为dfs.block.size,下限可以通过mapred.min.split.size设置,最后还是由InputFormat决定。

较好的建议:

The right number of reduces seems to be 0.95 or 1.75 multiplied by ( * mapred.tasktracker.reduce.tasks.maximum).increasing the number of reduces increases the framework overhead, but increases load balancing and lowers the cost of failures.


  mapred.tasktracker.reduce.tasks.maximum
   2
    The maximum number of reduce tasks that will be run
  simultaneously by a task tracker.
 

问题8:给单个node新加硬盘

解决方法:

1.修改需要新加硬盘的node的dfs.data.dir,用逗号分隔新、旧文件目录
2.重启dfs

问题9: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)
   at org.apache.hadoop.net.SocketOutputStream.transferToFully(SocketOutputStream.java:198)
   at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendChunks(BlockSender.java:293)
   at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendBlock(BlockSender.java:387)
   at org.apache.hadoop.hdfs.server.datanode.DataXceiver.readBlock(DataXceiver.java:179)
   at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:94)
   at java.lang.Thread.run(Thread.java:619)

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试试;
My understanding is that this issue should be fixed in Hadoop 0.19.1 so that
we should leave the standard timeout. However until then this can help
resolve issues like the one you’re seeing.

问题10:HDFS退服节点的方法

解决办法:

  1. 将 dfs.hosts 置为当前的 slaves,文件名用完整路径,注意,列表中的节点主机名要用大名,即 uname -n 可以得到的那个。
  2. 将 slaves 中要被退服的节点的全名列表放在另一个文件里,如 slaves.ex,使用 dfs.host.exclude 参数指向这个文件的完整路径
  3. 运行命令 bin/hadoop dfsadmin -refreshNodes
  4. web界面或 bin/hadoop dfsadmin -report 可以看到退服节点的状态是 Decomission in progress,直到需要复制的数据复制完成为止
  5. 完成之后,从 slaves 里( dfs.hosts 指向的文件)去掉已经退服的节点

附带说一下 -refreshNodes 命令的另外三种用途:

  1. 添加允许的节点到列表中(添加主机名到 dfs.hosts 里来)
  2. 直接去掉节点,不做数据副本备份(在 dfs.hosts 里去掉主机名)
  3. 退服的逆操作——停止 exclude 里面和 dfs.hosts 里面都有的,正在进行 decomission 的节点的退服,也就是把 Decomission in progress 的节点重新变为 Normal (在 web 界面叫 in service)

问题11:IO异常

问题描述:

Hadoop java.io.IOException: Job failed! at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1232) while indexing.
when i use nutch1.0,get this error:
Hadoop java.io.IOException: Job failed! at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1232) while indexing.

解决方法:

这个也很好解决:
可以删除conf/log4j.properties,然后可以看到详细的错误报告
我这儿出现的是out of memory
解决办法是在给运行主类org.apache.nutch.crawl.Crawl加上参数:-Xms64m -Xmx512m
你的或许不是这个问题,但是能看到详细的错误报告问题就好解决了

问题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

问题13:sort by value

解决方法:

hadoop 不提供直接的sort by value方法,因为这样会降低mapreduce性能。但可以用组合的办法来实现。
基本思想:

  1. 组合key/value作为新的key;
  2. 重载partitioner,根据old key来分割;
    conf.setPartitionerClass(FirstPartitioner.class);
  3. 自定义keyComparator:先根据old key排序,再根据old value排序;
    conf.setOutputKeyComparatorClass(KeyComparator.class);
  4. 重载GroupComparator, 也根据old key 来组合; conf.setOutputValueGroupingComparator(GroupComparator.class);

问题14:restart 单个datanode

处理方法:

如果一个datanode 出现问题,解决之后需要重新加入cluster而不重启cluster,方法如下:
bin/hadoop-daemon.sh start datanode
bin/hadoop-daemon.sh start jobtracker

问题15:Namenode in safe mode

解决办法:

 bin/hadoop dfsadmin -safemode leave

问题16:java.net.NoRouteToHostException: No route to host

解决办法:

 sudo /etc/init.d/iptables stop

问题17:更改namenode后,在hive中运行select 依旧指向之前的namenode地址

原因:

创建表时,hive实际上将表的位置存储在元存储中的sds和dbs表中。所以当提出一个新的集群时,主机有一个新的IP,但是Hive的元存储仍然指向旧集群中的位置。每次打开集群时,都可以修改元存储以使用新的IP进行更新。但更简单和简单的解决方案是只为主机使用弹性IP。
所以要将metastore中的之前出现的namenode地址全部更换为现有的namenode地址。

问题18:磁盘写满了

问题描述:

Your DataNode is started and you can create directories with bin/hadoop dfs -mkdir, but you get an error message when you try to put files into the HDFS (e.g., when you run a command like bin/hadoop dfs -put).

解决办法:

磁盘写满的缘故,可以登陆网页查看hdfs,如果它说已经使用了100%的空间,就需要释放磁盘空间。

问题19:

问题描述:

Your DataNodes won't start, and you see something like this in logs/*datanode*:
Incompatible namespaceIDs in /tmp/hadoop-ross/dfs/data

原因:

Hadoop的命名空间ID发生错误,重新格式化HDFS最简单。

解决方法:

You need to do something like this:

	bin/stop-all.sh
	rm -Rf /tmp/hadoop-your-username/*
	bin/hadoop namenode -format

问题20:map和reduce的相对路径问题

问题描述:

You can run Hadoop jobs written in Java (like the grep example), but your HadoopStreaming jobs (such as the Python example that fetches web page titles) won't work.

原因:

可能只给出了map函数和reduce函数的相对路径。指南中只是指定了相对路径,但如果在真正的集群中运行,则需要绝对路径。

解决方法:

Use absolute paths like this from the tutorial:

bin/hadoop jar contrib/hadoop-0.15.2-streaming.jar \
-mapper   $HOME/proj/hadoop/multifetch.py       \
-reducer $HOME/proj/hadoop/reducer.py          \
-input urls/*                               \
-output   titles

问题21: ERROR metadata

问题描述:

2009-01-08 10:02:40,709 ERROR metadata.Hive (Hive.java:getPartitions(499)) - javax.jdo.JDODataStoreException: Required table missing : 
""PARTITIONS"" in Catalog "" Schema "". JPOX requires this table to perform its persistence operations.
 Either your MetaData is incorrect, or you need to enable "org.jpox.autoCreateTables"

原因:

就是因为在 hive-default.xml 里把 org.jpox.fixedDatastore 设置成 true 了

问题22:Exception in createBlockOutputStream java.io.IOException

问题描述:

09/08/31 18:25:45 INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException:Bad connect ack with firstBadLink 192.168.1.11:50010
> 09/08/31 18:25:45 INFO hdfs.DFSClient: Abandoning block blk_-8575812198227241296_1001

09/08/31 18:25:51 INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException:
Bad connect ack with firstBadLink 192.168.1.16:50010
09/08/31 18:25:51 INFO hdfs.DFSClient: Abandoning block blk_-2932256218448902464_1001
09/08/31 18:25:57 INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException:
Bad connect ack with firstBadLink 192.168.1.11:50010
09/08/31 18:25:57 INFO hdfs.DFSClient: Abandoning block blk_-1014449966480421244_1001
09/08/31 18:26:03 INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException:
Bad connect ack with firstBadLink 192.168.1.16:50010
09/08/31 18:26:03 INFO hdfs.DFSClient: Abandoning block blk_7193173823538206978_1001
09/08/31 18:26:09 WARN hdfs.DFSClient: DataStreamer Exception: java.io.IOException: Unable
to create new block.
at org.apache.hadoop.hdfs.DFSClient D F S O u t p u t S t r e a m . n e x t B l o c k O u t p u t S t r e a m ( D F S C l i e n t . j a v a : 2731 ) a t o r g . a p a c h e . h a d o o p . h d f s . D F S C l i e n t DFSOutputStream.nextBlockOutputStream(DFSClient.java:2731) at org.apache.hadoop.hdfs.DFSClient DFSOutputStream.nextBlockOutputStream(DFSClient.java:2731)atorg.apache.hadoop.hdfs.DFSClientDFSOutputStream.access 2000 ( D F S C l i e n t . j a v a : 1996 ) a t o r g . a p a c h e . h a d o o p . h d f s . D F S C l i e n t 2000(DFSClient.java:1996) at org.apache.hadoop.hdfs.DFSClient 2000(DFSClient.java:1996)atorg.apache.hadoop.hdfs.DFSClientDFSOutputStream$DataStreamer.run(DFSClient.java:2182)

09/08/31 18:26:09 WARN hdfs.DFSClient: Error Recovery for block blk_7193173823538206978_1001
bad datanode[2] nodes == null
09/08/31 18:26:09 WARN hdfs.DFSClient: Could not get block locations. Source file “/user/umer/8GB_input”
- Aborting…
put: Bad connect ack with firstBadLink 192.168.1.16:50010

解决方法:

  1. ‘/etc/init.d/iptables stop’ -->stopped firewall
  2. SELINUX=disabled in ‘/etc/selinux/config’ file.–>disabled selinux

问题23: 某次正常运行mapreduce实例时,抛出错误

问题描述:

java.io.IOException: All datanodes xxx.xxx.xxx.xxx:xxx are bad. Aborting…
at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.processDatanodeError(DFSClient.java:2158)
at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.access$1400(DFSClient.java:1735)
at org.apache.hadoop.dfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:1889)
java.io.IOException: Could not get block locations. Aborting…
at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.processDatanodeError(DFSClient.java:2143)
at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.access$1400(DFSClient.java:1735)
at org.apache.hadoop.dfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:1889)

原因及解决:

经查明,问题原因是linux机器打开了过多的文件导致。用命令ulimit -n可以发现linux默认的文件打开数目为1024,修改/ect/security/limit.conf,增加hadoop soft 65535
再重新运行程序(最好所有的datanode都修改),问题解决

问题24:运行一段时间后hadoop不能stop-all.sh的问题,显示报错

问题描述:

no tasktracker to stop ,no datanode to stop

问题原因及解决:

原因是hadoop在stop的时候依据的是datanode上的mapred和dfs**进程号**。而默认的进程号保存在/tmp下,linux默认会每隔一段时间(一般是一个月或者7天左右)去删除这个目录下的文件。因此删掉hadoop-hadoop-jobtracker.pid和hadoop- hadoop-namenode.pid两个文件后,namenode自然就找不到datanode上的这两个进程了。
在配置文件中的export HADOOP_PID_DIR可以解决这个问题

问题25:Incompatible namespaceIDs

问题描述:

Incompatible namespaceIDs in /usr/local/hadoop/dfs/data: namenode namespaceID = 405233244966; datanode namespaceID = 33333244

问题解决:

原因:
在每次执行hadoop namenode -format时,都会为NameNode生成namespaceID,,但是在hadoop.tmp.dir目录下的DataNode还是保留上次的 namespaceID。因为namespaceID的不一致,而导致DataNode无法启动,所以只要在每次执行hadoop namenode -format之前,先删除hadoop.tmp.dir目录就可以启动成功。请注意是删除hadoop.tmp.dir对应的本地目录,而不是HDFS 目录。

问题26: Storage directory not exist

问题描述:

2010-02-09 21:37:53,203 INFO org.apache.hadoop.hdfs.server.common.Storage: Storage directory D:\hadoop\run\dfs_name_dir does not exist.
2010-02-09 21:37:53,203 ERROR org.apache.hadoop.hdfs.server.namenode.FSNamesystem: FSNamesystem initialization failed.
org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory D:\hadoop\run\dfs_name_dir is in an inconsistent state: storage directory does not exist or is not accessible.

原因及解决办法:

是因为存储目录D:\hadoop\run\dfs_name_dir不存在,所以只需要手动创建好这个目录即可。

问题27:bin/hadoop jps后报如下异常:

问题描述:

Exception in thread "main" java.lang.NullPointerException
       at sun.jvmstat.perfdata.monitor.protocol.local.LocalVmManager.activeVms(LocalVmManager.java:127)
       at sun.jvmstat.perfdata.monitor.protocol.local.MonitoredHostProvider.activeVms(MonitoredHostProvider.java:133)
       at sun.tools.jps.Jps.main(Jps.java:45)

原因及解决方法:

原因:系统根目录/tmp文件夹被删除了。重新建立/tmp文件夹即可。
bin/hive中出现 unable to create log directory /tmp/…也可能是这个原因

问题28:taskTracker和jobTracker 启动失败

问题描述:

2011-01-05 12:44:42,144 ERROR org.apache.hadoop.mapred.TaskTracker: Can not start task tracker because java.lang.RuntimeException: Not a host:port pair: local
 at org.apache.hadoop.net.NetUtils.createSocketAddr(NetUtils.java:136)
 at org.apache.hadoop.net.NetUtils.createSocketAddr(NetUtils.java:123)
 at org.apache.hadoop.mapred.JobTracker.getAddress(JobTracker.java:1807)
 at org.apache.hadoop.mapred.TaskTracker.(TaskTracker.java:905)
 at org.apache.hadoop.mapred.TaskTracker.main(TaskTracker.java:2833)

解决方法:

需配置mapred.job.tracker属性,在mapred-site.xml的configuration节点中配置(job-tracker host为jobTracker服务器的ip或域名)


                mapred.job.tracker
                [job-tracker host]:9001

问题29:NotReplicatedYetException

问题描述:

有时,当你申请到一个HOD集群后马上尝试上传文件到HDFS时,DFSClient会警告NotReplicatedYetException。通常会有一个如下报错信息。

org.apache.hadoop.ipc.RemoteException: java.io.IOException File /root/testdir/hadoop-default.xml could only be replicated to 0 nodes, instead of 1
at org.apache.hadoop.dfs.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1123)
at org.apache.hadoop.dfs.NameNode.addBlock(NameNode.java:330)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

解决方法:

当你向一个DataNodes正在和NameNode联络的集群上传文件的时候,这种现象就会发生。在上传新文件到HDFS之前多等待一段时间就可以解决这个问题,因为这使得足够多的DataNode启动并且联络上了NameNode。(也就是说没有退出安全模式呢)

Q30:hadoop出现文件块丢失怎么处理?

首先需要定位到哪的数据块丢失,可以通过查看日志进行检查和排除,找到文件块丢失的位置后,如果文件不是很重要可以直接删除,然后重新复制到集群上一份即可,如果删除不了,每一个集群都会有备份,需要恢复备份
具体参考:
https://blog.csdn.net/lukabruce/article/details/86714121
https://blog.csdn.net/chengyuqiang/article/details/79480433

Q31、用命令显示所有的datanode的健康状况

hadoop dfsadmin -report

检测缺失块

hdfs fsck -list-corruptfileblocks
hdfs fsck / | egrep -v ‘^.+$’ | grep -v eplica

Q32:如何快速杀死一个job

1、执行 hadoop job -list 拿到 job-id
2、hadoop job -kill job-id

Q8、Hdfs回收站(防误删)

默认是关闭的,需要手动打开,修改配置 core-site.xml
添加:

				
				 	fs.trash.interval
						1440
					
				
				
				        	fs.trash.checkpoint.interval
				    	1440
					
				

如果打开了回收站,hdfs会为每个用户都建一个回收站,用户删除文件时,文件并不是彻底地消失了,而是mv到了/user/用户名/.Trash/这个文件夹下,在一段时间内,用户可以恢复这些已经删除的文件。
如果用户没有主动删除,那么系统会根据用户设置的时间把文件删除掉,用户也可以手动清空回收站,这样删除的文件就再也找不回来了。

JavaAPI:

Trash trash = new Trash(fs, conf);
 trash.moveToTrash(new Path("/xxxx"));

Shell: 如果你想直接删除某个文件,而不把其放在回收站,就要用到-skipTrash命令
例如:

	hadoop fs -rm -r -skipTrash /test

查看回收站:

hadoop fs -ls /user/hadoop/.Trash/Current

Q33: Hadoop HDFS如何实现负载均衡

Hadoop HDFS 数据自动平衡脚本使用方法:
在Hadoop中,包含一个start-balancer.sh脚本,通过运行这个工具,启动HDFS数据均衡服务。该工具可以做到热插拔,即无须重启计算机和 Hadoop 服务。HadoopHome/bin目录下的start−balancer.sh脚本就是该任务的启动脚本。启动命令为:

‘Hadoop_home/bin/start-balancer.sh –threshold`

影响Balancer的几个参数:
-threshold
默认设置:10,参数取值范围:0-100
参数含义:判断集群是否平衡的阈值。理论上,该参数设置的越小,整个集群就越平衡
dfs.balance.bandwidthPerSec
默认设置:1048576(1M/S)
参数含义:Balancer运行时允许占用的带宽
定时任务的设置:
可根据集群的数据变化量来进行定时数据均衡的执行

00 22 * * 5 hadoop balancer -Threshold 5 >>/home/zcb/log/balancer_date +"\%Y\%m\%d".log 2>&1

问题34:HDFS只有一个操作实例

问题描述:

Exception in thread "main" java.io.IOException: Filesystem closed
at org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:498)
at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:1869)
at
org.apache.hadoop.hdfs.DistributedFileSystem$26.doCall(DistributedFileSystem.java:1474)
at
org.apache.hadoop.hdfs.DistributedFileSystem$26.doCall(DistributedFileSystem.java:1470)
at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
at
org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1
470)
at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1444)
......

原因分析:

客户开发了一个HDFS应用,此应用存在多个线程,需同时往HDFS组件上写数据。在业务运行时,发现有业务线程和HDFS交互时,报如下异常:

......
Exception in thread "main" java.io.IOException: Filesystem closed
at org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:498)
at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:1869)
at
org.apache.hadoop.hdfs.DistributedFileSystem$26.doCall(DistributedFileSystem.java:1474)
at
org.apache.hadoop.hdfs.DistributedFileSystem$26.doCall(DistributedFileSystem.java:1470)
at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
at
org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1
470)
at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1444)
......

原因分析
经分析,捕捉到异常的业务应用线程确实有建立到HDFS组件连接,并且这个过程中此业务应用线程并没close这个连接实例,连接初始化API示意代码:

FileSystem hdfs1 = FileSystem.get(conf);

再排查此业务应用代码,发现在其他线程中有close连接实例的操作,关闭连接实例的API示意代码:

hdfs1.close();

深入分析发现:多个线程通过HDFS提供API申请并获取到HDFS连接实例,但实际上是同一个连接实例,所以在同一个业务进程内,一旦一个线程close一个HDFS连接实例,其他线程即无法再使用先前所申请的连接实例。

如下是对这个问题的演示DEMO:

......
FileSystem hdfs1 = FileSystem.get(conf);
FileSystem hdfs2 = FileSystem.get(conf);
System.out.println("/user/tester1/spark-core is "
+ hdfs1.exists(new Path("/user/tester1/spark-core")));
System.out.println("/user/tester1/hive-date is "
+ hdfs2.exists(new Path("/user/tester1/hive-date")));
hdfs1.close();
System.out.println("/user/tester1/hive-date is "
+ hdfs2.exists(new Path("/user/tester1/hive-date"))); // 这里会失败,因为上面已经把连
接实例关闭了。

解决办法:

属于HDFS机制,并不是bug。业务应用需根据自己的实际业务场景来确定如何使用HDFS连接。一般建议如下,供参考:

业务进程空间中,统一建立和管理(例如close)一个连接实例,各个线程共用,但不要直接管理此连接实例;

若实在有必要给一个线程单独分配一个连接实例,可以按照HDFS机制,在创建连接实例时,指定不采用缓存中的连接实例,具体API的使用DEMO如下:

  c. ...... 
  d. FileSystem hdfs1 = FileSystem.get(conf); 
  e. conf.setBoolean("fs.hdfs.impl.disable.cache", true);//指定不采用缓存中的连接实例 
  f. FileSystem hdfs2 = FileSystem.get(conf); 
  g. 
  h. System.out.println("/user/tester1/spark-core is " 
  i. + hdfs1.exists(new Path("/user/tester1/spark-core"))); 
  j. System.out.println("/user/tester1/hive-date is " 
  k. + hdfs2.exists(new Path("/user/tester1/hive-date"))); 
  l. 
  m. hdfs1.close(); 
  n. System.out.println("/user/tester1/hive-date is " 
  + hdfs2.exists(new Path("/user/tester1/hive-date"))); // 这里不会再抛出问题描述中的异 
  常。

问题35:datanode连接不上namenode,导致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  

机器重启后,防火墙还会开启。

问题36:从本地往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. 

解决方法:

关闭防火墙:

service iptables stop  

禁用selinux:
编辑 /etc/selinux/config文件,设置“SELINUX=disabled”

问题36:以本地模式运行hadoop时,抛异常

问题描述:

ERROR security.UserGroupInformation: PriviledgedActionException as:hadoop cause:java.net.UnknownHostException: hadoop: hadoop: Name or service not known 
Exception in thread "main" java.net.UnknownHostException: hadoop: hadoop: Name or service not known

问题解决

把/etc/hostname文件中的主机名加入到/etc/hosts文件中,问题解决。

问题37:格式化hdfs文件系统时,出错

问题描述:

Format aborted in /home/hadoop/dfs/name 

解决办法:

/home/hadoop/dfs/name 是 dfs.name.dir 配置的本地路径,把这个目录删除, 再格式化就可以了。

问题38:datanode启动不了,并且报HDFS使用空间超过90%、

问题描述:如题

解决办法:

首先查看datanode的日志,发现里面没有datanode.log的日志,只有datanode.out,其中几乎没啥有用信息,于是尝试删除记录进程id的文件,在/var/run/LOCALCLUSTER/HADOOP/…datanode.pid,删除该文件后,重新手动启一次datanode,出现如下错误:

hdh215: starting datanode, logging to /mnt/disk1/log/LOCALCLUSTER/SERVICE-HADOOP-retro/hdfs/hadoop-root-datanode-hdh215.out
hdh215: ERROR: transport error 202: bind failed: Address already in use
hdh215: ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)
hdh215: JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [debugInit.c:750]

又想到报这个错误之前重启的时候(还未修改进程id文件)提示过:

[root@hdh215 sbin]# ./hadoop-daemon.sh start datanode
starting datanode, logging to /mnt/disk1/log/LOCALCLUSTER/SERVICE-HADOOP-retro/hdfs/hadoop-root-datanode-hdh215.out
Listening for transport dt_socket at address: 15005

于是乎看了下谁占用了端口,并kill:

[root@hdh215 sbin]# netstat -tunlp | grep 15005
tcp        0      0 0.0.0.0:15005           0.0.0.0:*               LISTEN      35237/java          
[root@hdh215 sbin]# kill -9 35237
[root@hdh215 sbin]# netstat -tunlp | grep 15005

jps一下:

2887 -- main class information unavailable

查看这个进程:

[root@hdh215 sbin]# ps -ef |grep 2887
root      2887     1  0 10:44 pts/0    00:00:00 /usr/lib/LOCALCLUSTER/jdk1.8.0_211/bin/java -Dproc_datanode -DclusterId=LOCALCLUSTER -DserviceId=SERVICE-HADOOP-retro -Dhadoop.log.dir=/mnt/disk1/log/LOCALCLUSTER/SERVICE-HADOOP-retro/hdfs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/usr/lib/LOCALCLUSTER/hadoop -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,
console -Djava.library.path=/usr/lib/LOCALCLUSTER/hadoop/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -DclusterId=LOCALCLUSTER -DserviceId=SERVICE-HADOOP-retro -DclusterId=LOCALCLUSTER -DserviceId=SERVICE-HADOOP-retro -Dhadoop.log.dir=/mnt/disk1/log/LOCALCLUSTER/SERVICE-HADOOP-retro/hdfs -Dhadoop.log.file=hadoop-root-datanode-hdh215.log -Dhadoop.home.dir=/usr/lib/LOCALCLUSTER/hadoop -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,
RFA -Djava.library.path=/usr/lib/LOCALCLUSTER/hadoop/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -server -Xmx4g -Xms2g -Xmn1g -DroleId=SERVICE-HADOOP-retro-DATANODE-0 -Xmx4g -Xms2g -Xmn1g -DroleId=SERVICE-HADOOP-retro-DATANODE-0 -Xmx4g -Xms2g -Xmn1g -DroleId=SERVICE-HADOOP-retro-DATANODE-0 -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=15005 -Dhadoop.security.logger=INFO,RFAS org.apache.hadoop.hdfs.server.datanode.DataNode
root     44416 42879  0 10:48 pts/0    00:00:00 grep --color=auto 2887

端口占用导致的,修改下,或者取消远程debug配置
在bin的hdfs文件中,找到该处,并注释。再次重启,即可

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

你可能感兴趣的:(hadoop)