分享

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

LoveJW 发表于 2014-11-26 11:13:12 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 23 117196
代码是执行追加操作,往hdfs上已有的文件追加新数据,但是一直报错
                Path hdfs_path = new Path(host + path + table + "/part.txt");
                        Configuration conf = new Configuration();
                        FileSystem fs = FileSystem.get(URI.create(hdfs_path.toString()), conf);
                        fs.setReplication(hdfs_path, (short)1);
                        InputStream in = new BufferedInputStream(new ByteArrayInputStream(data.getBytes()));
                        OutputStream out = fs.append(hdfs_path);
                        IOUtils.copyBytes(in, out, conf);
                        out.close();
                        fs.close();
                        IOUtils.closeStream(in);
                        in.close();
错误内容:
org.apache.hadoop.ipc.RemoteException: failed to create file /user/root/uair11/air_info_package_cache_/part.txt for DFSClient_NONMAPREDUCE_1195989360_48 on client 192.168.22.129 because current leaseholder is trying to recreate file.at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.recoverLeaseInternal(FSNamesystem.java:2342)at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.appendFileInternal(FSNamesystem.java:220)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.appendFileInt(FSNamesystem.java:2453)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.appendFile(FSNamesystem.java:2414)
        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:48063)
        at

已有(24)人评论

跳转到指定楼层
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
回复

使用道具 举报

LoveJW 发表于 2014-11-26 11:14:47
回复

使用道具 举报

desehawk 发表于 2014-11-26 11:52:05
LoveJW 发表于 2014-11-26 11:14
实在是不知道怎么弄了


楼主你配置生效了吗?
在配置方面找找问题,为什么系统一直认为你是在创建文件。
回复

使用道具 举报

LoveJW 发表于 2014-11-26 11:57:33
desehawk 发表于 2014-11-26 11:52
楼主你配置生效了吗?
在配置方面找找问题,为什么系统一直认为你是在创建文件。

配置是只有一个hdfs-site.xml文件。这个要我放在了lib下
回复

使用道具 举报

desehawk 发表于 2014-11-26 12:25:24
LoveJW 发表于 2014-11-26 11:57
配置是只有一个hdfs-site.xml文件。这个要我放在了lib下
你追加的什么?字符串,追加文件试试,还有说明下你的版本
回复

使用道具 举报

goldtimes 发表于 2014-11-26 12:34:20
本帖最后由 goldtimes 于 2014-11-26 12:36 编辑


首先修改面配置文件,相信你已经修改了
  1. <property>
  2.     <name>dfs.support.append</name>
  3.     <value>true</value>
  4. </property>
复制代码





按照下面程序来:记得文件名称一致,并且保证你追加的是文件,如果你想追加字符串,先保证追加文件成功,希望严格按照这个来做。
  1. package com.wyp;  
  2.   
  3. import org.apache.hadoop.conf.Configuration;  
  4. import org.apache.hadoop.fs.FileSystem;  
  5. import org.apache.hadoop.fs.Path;  
  6. import org.apache.hadoop.io.IOUtils;  
  7.   
  8. import java.io.*;  
  9. import java.net.URI;  
  10.   
  11. public class AppendContent {  
  12.     public static void main(String[] args) {  
  13.         String hdfs_path = "hdfs://mycluster/home/wyp/wyp.txt";//文件路径  
  14.         Configuration conf = new Configuration();  
  15.         conf.setBoolean("dfs.support.append", true);  
  16.   
  17.         String inpath = "/home/wyp/append.txt";  
  18.         FileSystem fs = null;  
  19.         try {  
  20.             fs = FileSystem.get(URI.create(hdfs_path), conf);  
  21.             //要追加的文件流,inpath为文件  
  22.             InputStream in = new   
  23.                   BufferedInputStream(new FileInputStream(inpath));  
  24.             OutputStream out = fs.append(new Path(hdfs_path));  
  25.             IOUtils.copyBytes(in, out, 4096, true);  
  26.         } catch (IOException e) {  
  27.             e.printStackTrace();  
  28.         }  
  29.     }  
  30. }  
复制代码



将上面的代码打包成jar(这里我取名为hdfs.jar)文件,然后上传到机器中,比如我上传到我的home目录,在程序运行前,我们来看看HDFS中wyp.txt文件中的内容有什么
  1. [wyp@l-datalogm1.data.cn1 ~]$ /home/q/hadoop-2.2.0/bin/hadoop fs \
  2. -cat /home/wyp/wyp.txt
  3. 123456
复制代码

好,我们再来看看/home/wyp/append.txt文件中的内容:
  1. [wyp@l-datalogm1.data.cn1 ~]$ vim append.txt
  2. wyp  append test
复制代码

看完代码中所涉及到的两个文件之后,我们再运行hdfs.jar
  1. [wyp@l-datalogm1.data.cn1 ~]$ /home/q/hadoop-2.2.0/bin/hadoop jar \
  2.                                        hdfs.jar com.wyp.AppendContent
复制代码




运行完之后,看看wyp.txt内容
  1. [wyp@l-datalogm1.data.cn1 ~]$ /home/q/hadoop-2.2.0/bin/hadoop fs \ -cat /home/wyp/wyp.txt
  2. 123456
  3. wyp  append test
复制代码
再次提醒楼主,如果你不是按照上面的步骤,做不出来,是正常现象。












回复

使用道具 举报

LoveJW 发表于 2014-11-26 12:40:10
desehawk 发表于 2014-11-26 12:25
你追加的什么?字符串,追加文件试试,还有说明下你的版本

是追加的字符串,版本是2.2
回复

使用道具 举报

LoveJW 发表于 2014-11-26 12:41:45
goldtimes 发表于 2014-11-26 12:34
首先修改面配置文件,相信你已经修改了

这个我之前有写过一个示例,追加文件是可以成功的,而且也不报错,但是我把这个运用到项目里来,往已有的文件里追加新数据就报上面那个错误了
回复

使用道具 举报

LoveJW 发表于 2014-11-26 12:43:08
desehawk 发表于 2014-11-26 12:25
你追加的什么?字符串,追加文件试试,还有说明下你的版本

现在的情况是,这个字符串数据能追加上,,也就是说这段代码时能执行。但是控制台一直报错。这个我没搞明白到底是怎么回事
回复

使用道具 举报

jixianqiuxue 发表于 2014-11-26 16:32:08
LoveJW 发表于 2014-11-26 12:43
现在的情况是,这个字符串数据能追加上,,也就是说这段代码时能执行。但是控制台一直报错。这个我没搞明 ...
如果真如楼主所说,那么有两个问题
1.为何楼主的的错误会出现,创建文件失败,创建文件失败,但是却能追加成功,这跟楼主所说是矛盾的
2.假如真如你所说,那么剩下的就是你的环境配置问题了。
回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条