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>
   <
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要编写一个程序将文件上传到HDFS,可以使用Hadoop API提供的类和方法来实现。以下是一个Java代码示例: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.io.IOException; import java.io.InputStream; import java.net.URI; public class HdfsUploader { public static void main(String[] args) throws IOException { //设置Hadoop配置信息 Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://localhost:9000"); //获取HDFS文件系统对象 FileSystem hdfs = FileSystem.get(URI.create("hdfs://localhost:9000"), conf); //本地文件路径 String srcPath = args[0]; //HDFS文件路径 String dstPath = args[1]; //打开本地文件输入流 InputStream in = new FileInputStream(srcPath); //创建HDFS文件输出流 Path dst = new Path(dstPath); OutputStream out = hdfs.create(dst); //将本地文件复制到HDFS文件 IOUtils.copyBytes(in, out, 4096, true); //关闭输入输出流 in.close(); out.close(); } } ``` 在这个示例中,我们创建了一个HdfsUploader类,它将本地文件上传到HDFS。在main方法中,我们首先设置Hadoop配置信息,然后获取HDFS文件系统对象。接下来,我们指定本地文件路径和HDFS文件路径,并打开本地文件输入流。我们创建了一个HDFS文件输出流,然后使用IOUtils.copyBytes方法将本地文件复制到HDFS文件。最后,我们关闭输入输出流。 注意,要运行此程序,您需要在Hadoop集群上配置好环境,并且您的Java项目需要包含hadoop-common和hadoop-hdfs客户端依赖项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yui方木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值