sstutu 发表于 2014-11-21 17:19 通过这种方法解决了追加的问题,但有个疑问,使用 FileSystem.get( URI.create(hdfs_path), conf ) 是对HDFS上的文件进行追加,如果我用Eclipse开发,文件没有上传到HDFS,只在本地,使用 FileSystem.get( conf ) 为什么不能实现追加呢? |
根本不是楼上说的那几个解决方法。上面的问题我几乎都遇到过。 需要在eclise项目中的java代码中添加 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" ); 远程机器上面的hdfs-site.xml中配置了,本地的hadoop这个配置文件中也配置了没什么用,必须得在代码中加上。亲测。 |
LoveJW 发表于 2014-11-25 19:56 要学会变通,你先以文件的方式追加,看是否可以。 |
desehawk 发表于 2014-11-25 18:58 我不是追加的文件。是直接追加从别处拿来的数据 |
desehawk 发表于 2014-11-25 19:00 确定啊,我写的绝对路径 调试看的路径也对,但是就是报新建错误,我没新建的操作啊 |
LoveJW 发表于 2014-11-21 18:33 楼主你调试了,确定文件名称已经存在。建议使用简单的已经存在的名字。 |
LoveJW 发表于 2014-11-25 15:02 建议改成这种格式
|
sstutu 发表于 2014-11-21 17:19 上面那个问题能再帮忙看看吗?? |
本帖最后由 LoveJW 于 2014-11-21 18:36 编辑 sstutu 发表于 2014-11-21 17:19 public boolean appendDataToFile(String table, String data) { boolean result = false; try { if(StringUtils.isBlank(table)||StringUtils.isBlank(data)){ throw new NullPointerException("appendDataToFile:table or data is null!"); } Path filePath = new Path(host + path + table + "/part-m-00000"); Configuration conf = new Configuration(); FileSystem fs = filePath.getFileSystem(conf); fs.setReplication(filePath, (short) 3); OutputStream out = fs.append(filePath); InputStream in = new BufferedInputStream(new ByteArrayInputStream(data.getBytes())); IOUtils.copyBytes(in, out, conf); // fs.close(); // IOUtils.closeStream(in); result = true; } catch (Exception e) { log.warn("appendDataToFile:data append error",e); } return result; } 我就是要直接把字符串存过去的啊,Hdfs上有建好的文件,就是要实现追加功能,那两个错误参数是哪两个?? |