分享

往hdfs上追加数据【hadoop写数据】

LoveJW 发表于 2014-11-26 11:13:12 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 23 117199
LoveJW 发表于 2014-11-26 16:48:21
jixianqiuxue 发表于 2014-11-26 16:32
如果真如楼主所说,那么有两个问题
1.为何楼主的的错误会出现,创建文件失败,创建文件失败,但是却能追 ...

这个真的是能追加成功,但是为什么报错我现在也搞不明白,你说的这个环境配置具体指哪??我在工程里只加了一个hdfs-site.xml,而且没有修改任何配置
回复

使用道具 举报

bioger_hit 发表于 2014-11-26 19:49:43
LoveJW 发表于 2014-11-26 16:48
这个真的是能追加成功,但是为什么报错我现在也搞不明白,你说的这个环境配置具体指哪??我在工程里只加 ...
你这个帖子收藏了,有时间验证下。等得出结果,在讨论。也建议楼主可以从多方面验证,可能是环境问题。

回复

使用道具 举报

LoveJW 发表于 2014-11-26 19:51:56
bioger_hit 发表于 2014-11-26 19:49
你这个帖子收藏了,有时间验证下。等得出结果,在讨论。也建议楼主可以从多方面验证,可能是环境问题。

...

嗯,我现在在看源码这一块,看到底怎么回事
回复

使用道具 举报

soeasy 发表于 2014-12-5 15:53:09
咨询个HDFS问题:
  1. 在多线程高速并发反复append写入文件时存在这个现象;(设计了读写锁对同一文件写入时保护)
  2. 文件是打开,写入,append,关闭流程;
  看资料好像是hdfs一种保护机制,具体细节没有研究

数据DataNode节点对应的错误是
2014-12-05 14:32:21,700 ERROR [IPC Server handler 14 on 9000] security.UserGroupInformation (UserGroupInformation.java:doAs(1494)) - PriviledgedActionException as:root (auth:SIMPLE) cause:org.apache.hadoop.hdfs.protocol.AlreadyBeingCreatedException: failed to create file /user/root/rcfclient_0723data_thread_00019.txt for DFSClient_NONMAPREDUCE_260549844_1 on client 10.10.10.253 because current leaseholder is trying to recreate file.

C++接入客户端对应的错误信息如下
hdfsOpenFile(rcfclient_0723data_thread_00019.txt): FileSystem#append((Lorg/apache/hadoop/fs/Path;)Lorg/apache/hadoop/fs/FSDataOutputStream;) error:
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.protocol.AlreadyBeingCreatedException): failed to create file /user/root/rcfclient_0723data_thread_00019.txt for DFSClient_NONMAPREDUCE_260549844_1 on client 10.10.10.253 because current leaseholder is trying to recreate file.
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.recoverLeaseInternal(FSNamesystem.java:2275)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.appendFileInternal(FSNamesystem.java:2153)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.appendFileInt(FSNamesystem.java:2386)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.appendFile(FSNamesystem.java:2347)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.append(NameNodeRpcServer.java:508)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.append(ClientNamenodeProtocolServerSideTranslatorPB.java:320)
        at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java:59572)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:585)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:928)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2048)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2044)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:415)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2042)
回复

使用道具 举报

soeasy 发表于 2014-12-5 15:54:25
同问,解决过或知道问题原因的请站内短信给我
回复

使用道具 举报

codefarmer 发表于 2015-4-27 16:34:55
System. setProperty( "hadoop.home.dir", "D:/hadoop" );
conf.setBoolean( "dfs.support.append", true );
          conf.set( "dfs.client.block.write.replace-datanode-on-failure.policy" ,
                    "NEVER" );
          conf.set( "dfs.client.block.write.replace-datanode-on-failure.enable" ,
                    "true" );

点评

大神  发表于 2016-3-13 01:28
回复

使用道具 举报

IT_雪夜归人 发表于 2015-12-28 22:23:23
goldtimes 发表于 2014-11-26 12:34
首先修改面配置文件,相信你已经修改了

这个代码对文件追加过一次,再次追加就会报错,不知到如何解决,hadoop 2.5.2  CDH 5.5.1版都试过了,还没有找到解决方法呢。
回复

使用道具 举报

IT_雪夜归人 发表于 2015-12-28 22:24:00
楼主最后这个问题解决了没?
回复

使用道具 举报

hjx615 发表于 2016-1-8 10:47:41
public static void appen(String content, String path, FileSystem fs) {
                // System.out.println("测试:"+content);
                InputStream in = null;
                OutputStream out = null;
                try {
                        Path hdfs_path = new Path(path);
                        Configuration conf = new Configuration();
                        conf.setBoolean("dfs.support.append", true);
                        // FileSystem fs = FileSystem.get(URI.create(hdfs_path.toString()),
                        // conf);
                        fs.setReplication(hdfs_path, (short) 1);
                        in = new BufferedInputStream(new ByteArrayInputStream(
                                        content.getBytes()));
                        out = fs.append(hdfs_path);
                        IOUtils.copyBytes(in, out, conf);
                        // fs.close();
                } catch (Exception e) {
                        logger.error(e);
                } finally {
                        IOUtils.closeStream(in);
                        try {
                                if (in != null) {
                                        in.close();
                                }
                                if (out != null) {
                                        out.close();
                                }
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }

                }
        }

我也这问题  ,定时任务一直跑,第一个任务跑完没有问题,任务第二次跑就出像楼主一样的bug.
如果任务一直跑好好的,我把任务手动停了,再跑也会有这bug.  出现bug后,要过比较久或重启hadoop,就没有这问题。我怀疑文件没有正常关闭,但其实都有关闭
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条