今天在学习hdfs时,遇到问题,就是在向hdfs中追加数据总是报错,在经过好几个小时的努力之下终于将他搞定
解决方案如下:在hadoop的hdfs-sit.xml中添加一下三项
-
<property> <name>dfs.support.append</name> <value>true</value> </property>
注:hdfs默认是不支持追加数据的
-
<property> <name>dfs.client.block.write.replace-datanode-on-failure.policy</name> <value>NEVER</value> </property>
-
<property> <name>dfs.client.block.write.replace-datanode-on-failure</name> <value>true</value> </property>
因为我是从window本地的eclipse传文件上去,所以还要再java程序中声明一下以上三个配置项
本人代码如下:
@Test public void updateload() throws IOException, Exception { System.setProperty("hadoop.home.dir", "D:\\hadoop-2.4.1"); //配置文件 Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://192.168.252.200:9000/"); conf.setBoolean("dfs.support.append", true); conf.setBoolean("dfs.client.block.write.replace-datanode-on-failure", true); conf.set("dfs.client.block.write.replace-datanode-on-failure.policy", "NEVER"); //首先要拿到客户端的对象 FileSystem fs = FileSystem.get(new URI("hdfs://192.168.252.200:9000/"), conf, "hadoop"); //hdfs上的路径 Path dst = new Path("hdfs://192.168.252.200:9000/aa/f.txt"); //设置元数据的地址 FileInputStream is = new FileInputStream("d:/a.txt"); //判断目的文件是否存在 if(fs.exists(dst)) { System.out.println("路径已存在"); FSDataOutputStream os = fs.append(dst); //上传文件 IOUtils.copy(is, os); os.close(); is.close(); fs.close(); }else { //打开输出流,向hdfs上输出 FSDataOutputStream os = fs.create(dst); //上传文件 IOUtils.copy(is, os); os.close(); is.close(); fs.close(); } }
本人用用的hadoop版本是2.4.1,希望对改为有用