IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> hdfs相关问题及解决方案归档 -> 正文阅读

[大数据]hdfs相关问题及解决方案归档

目录

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

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

解决方案:
检查 、/etc/hosts
要求本机ip 对应 服务器名
要求要包含所有的服务器ip + 服务器名
检查 .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,但无法访问,也无法结束

问题描述:

能够启动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,这一值可能依旧不是最优的值。

或者:

 <property>
<name>mapred.child.java.opts</name>
<value>-Xmx800M -server</value>
 </property>

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决定。

较好的建议:

  • 正确的reduces数量应该是0.95或1.75乘以(<nodes.no.of nodes>*mapred.tasktracker.reduce.tasks.max)。增加reduces数量会增加框架开销,但会增加负载平衡并降低故障成本。
<property>
  <name>mapred.tasktracker.reduce.tasks.maximum</name>
   <value>2</value>
    <description>The maximum number of reduce tasks that will be run
  simultaneously by a task tracker.
 </description>

问题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:Hadoop的命名空间ID发生错误

问题描述:

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最简单。

解决方法:

	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.DFSClientD 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.DFSClientDFSOutputStream.nextBlockOutputStream(DFSClient.java:2731)atorg.apache.hadoop.hdfs.DFSClientDFSOutputStream.access2000 ( 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.DFSClient2000(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

解决方法:

‘/etc/init.d/iptables stop’ -->stopped firewall
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或域名)

<property>
                <name>mapred.job.tracker</name>
                <value>[job-tracker host]:9001</value>
</property>

问题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。(也就是说没有退出安全模式呢)

问题30:hadoop出现文件块丢失(missingblocks)处理方法

问题描述:

hadoop出现文件块丢失(missingblocks)

问题分析:
首先需要定位到哪的数据块丢失,可以通过查看日志进行检查和排除,找到文件块丢失的位置后,如果文件不是很重要可以直接删除,然后重新复制到集群上一份即可,如果删除不了,每一个集群都会有备份,需要恢复备份
解决方案:
1.首先要知道hdfs文件系统是否有损坏的块:

 hdfs fsck /

 或者

 hdfs fsck hdfs://<ip 或 hostname>:50070/

执行完上述命令后看结果:MISSING BLOCKS就是丢失块数


Total size: 3453345169348 B (Total open files size: 664 B)
Total dirs: 15233
Total files: 14029
Total symlinks: 0 (Files currently being written: 8)
Total blocks (validated): 40961 (avg. block size 84308126 B) (Total open file blocks (not validated): 8)
********************************
CORRUPT FILES: 2
MISSING BLOCKS: 2      // 丢失块数
MISSING SIZE: 15731297 B    // 此处显示丢失块总大小
CORRUPT BLOCKS: 2
********************************
Corrupt blocks: 2
Number of data-nodes: 12
Number of racks: 2
FSCK ended at Fri Mar 27 XX:03:21 UTC 201X in XXX milliseconds

那么接下来就是要查出哪些块丢失了:

hdfs fsck / | egrep -v '^\.+$' | grep -v replica | grep -v Replica

或者

hdfs fsck hdfs://<ip 或 host>:50070/ | egrep -v '^\.+$' | grep -v replica | grep -v Replica

这会列出受影响的文件,可能会有很多的输出信息,将显示当前存在未充分复制的块的文件(不一定是有问题的块)。输出应该包括所有受影响文件的类似内容。

//输出信息如下
 
/path/to/filename.fileextension: CORRUPT blockpool BP-1016133662-10.29.100.41-1415825958975 block blk_1073904305
 
/path/to/filename.fileextension: MISSING 1 blocks of total size 15620361 B
 
................
 
//  此处“/path/to/filename.fileextension”即为,你丢失块的文件路径

接下来就要确定文件的重要性,是否可以直接删除并复制到适当的位置,或者是否需要重新生成敏感数据?
如果替换文件非常简单的话,那么可以从hadoop集群中删除损坏的文件,下面命令将会把损坏的文件移动到回收站中

hdfs dfs -rm /path/to/filename.fileextension

或者

hdfs dfs -rm hdfs://<ip.or.hostname.of.namenode>:50070/path/to/filename.fileextension

或者也可以跳过回收站,直接永久删除:

hdfs dfs -rm -skipTrash /path/to/filename.fileextensio

或者

hdfs dfs -rm -skipTrash hdfs://<ip.or.hostname>:50070/path/to/filename.fileextension

以上是文件很容易替换的解决方法,那么如果文件非常不容易替换呢?
那么可以先收集关于文件位置和块的信息:

hdfs fsck /path/to/filename/fileextension -locations -blocks -files

或者

hdfs fsck hdfs://<ip.or.hostname.of.namenode>:50070/path/to/filename/fileextension -locations -blocks -files

通过这些收集到的文件位置和块信息这些数据,可以跟踪损坏所在的节点,然后切到这些节点上,查看日志手动排查问题。如果可能的话,可以在该机器上恢复,并在线获得分区和块,这些块将报告给hadoop,文件将会再次恢复完整。

问题31、用命令显示所有的datanode的健康状况

hadoop dfsadmin -report

检测缺失块

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

问题32:如何快速杀死一个job

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

问题33、Hdfs回收站(防误删)

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

				<property>
				 	<name>fs.trash.interval</name>
						<value>1440</value>
					<!-- 在回收站停留时间 单位是分钟 -->
				</property>
				<property>
				        	<name>fs.trash.checkpoint.interval</name>
				    	<value>1440</value>
					<!-- 檢查回收站的时间间隔小于等于上面的值-->
				</property>

如果打开了回收站,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

问题34: 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如下:

 FileSystem hdfs1 = FileSystem.get(conf); 
 conf.setBoolean("fs.hdfs.impl.disable.cache", true);//指定不采用缓存中的连接实例 
 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"))); // 这里不会再抛出问题描述中的异常。

问题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启动不了,并且报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文件中,找到该处,并注释。再次重启,即可

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-27 11:55:47  更:2021-08-27 11:57:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:50:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码