往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
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" );
实在是不知道怎么弄了{:soso_e105:}
LoveJW 发表于 2014-11-26 11:14
实在是不知道怎么弄了
楼主你配置生效了吗?
在配置方面找找问题,为什么系统一直认为你是在创建文件。
desehawk 发表于 2014-11-26 11:52
楼主你配置生效了吗?
在配置方面找找问题,为什么系统一直认为你是在创建文件。
配置是只有一个hdfs-site.xml文件。这个要我放在了lib下
LoveJW 发表于 2014-11-26 11:57
配置是只有一个hdfs-site.xml文件。这个要我放在了lib下
你追加的什么?字符串,追加文件试试,还有说明下你的版本
本帖最后由 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再次提醒楼主,如果你不是按照上面的步骤,做不出来,是正常现象。
desehawk 发表于 2014-11-26 12:25
你追加的什么?字符串,追加文件试试,还有说明下你的版本
是追加的字符串,版本是2.2 goldtimes 发表于 2014-11-26 12:34
首先修改面配置文件,相信你已经修改了
这个我之前有写过一个示例,追加文件是可以成功的,而且也不报错,但是我把这个运用到项目里来,往已有的文件里追加新数据就报上面那个错误了
desehawk 发表于 2014-11-26 12:25
你追加的什么?字符串,追加文件试试,还有说明下你的版本
现在的情况是,这个字符串数据能追加上,,也就是说这段代码时能执行。但是控制台一直报错。这个我没搞明白到底是怎么回事
LoveJW 发表于 2014-11-26 12:43
现在的情况是,这个字符串数据能追加上,,也就是说这段代码时能执行。但是控制台一直报错。这个我没搞明 ...
如果真如楼主所说,那么有两个问题
1.为何楼主的的错误会出现,创建文件失败,创建文件失败,但是却能追加成功,这跟楼主所说是矛盾的
2.假如真如你所说,那么剩下的就是你的环境配置问题了。