LoveJW 发表于 2014-11-26 11:13:12

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

代码是执行追加操作,往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

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" );

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

实在是不知道怎么弄了{:soso_e105:}

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 编辑



首先修改面配置文件,相信你已经修改了
<property>
    <name>dfs.support.append</name>
    <value>true</value>
</property>




按照下面程序来:记得文件名称一致,并且保证你追加的是文件,如果你想追加字符串,先保证追加文件成功,希望严格按照这个来做。
package com.wyp;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

import java.io.*;
import java.net.URI;


public class AppendContent {
    public static void main(String[] args) {
      String hdfs_path = "hdfs://mycluster/home/wyp/wyp.txt";//文件路径
      Configuration conf = new Configuration();
      conf.setBoolean("dfs.support.append", true);

      String inpath = "/home/wyp/append.txt";
      FileSystem fs = null;
      try {
            fs = FileSystem.get(URI.create(hdfs_path), conf);
            //要追加的文件流,inpath为文件
            InputStream in = new   
                  BufferedInputStream(new FileInputStream(inpath));
            OutputStream out = fs.append(new Path(hdfs_path));
            IOUtils.copyBytes(in, out, 4096, true);
      } catch (IOException e) {
            e.printStackTrace();
      }
    }
}


将上面的代码打包成jar(这里我取名为hdfs.jar)文件,然后上传到机器中,比如我上传到我的home目录,在程序运行前,我们来看看HDFS中wyp.txt文件中的内容有什么
$ /home/q/hadoop-2.2.0/bin/hadoop fs \
-cat /home/wyp/wyp.txt
123456
好,我们再来看看/home/wyp/append.txt文件中的内容:
$ vim append.txt
wypappend test
看完代码中所涉及到的两个文件之后,我们再运行hdfs.jar
$ /home/q/hadoop-2.2.0/bin/hadoop jar \
                                       hdfs.jar com.wyp.AppendContent



运行完之后,看看wyp.txt内容
$ /home/q/hadoop-2.2.0/bin/hadoop fs \ -cat /home/wyp/wyp.txt
123456
wypappend 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.假如真如你所说,那么剩下的就是你的环境配置问题了。
页: [1] 2 3
查看完整版本: 往hdfs上追加数据【hadoop写数据】