今天在学习hdfs时,遇到问题,就是在向hdfs中追加数据总是报错,在经过好几个小时的努力之下终于将他搞定

 

解决方案如下:在hadoop的hdfs-sit.xml中添加一下三项

  1. <property>  
    <name>dfs.support.append</name>  
    <value>true</value>  
    </property>

    注:hdfs默认是不支持追加数据的

  2.  

    <property>
      <name>dfs.client.block.write.replace-datanode-on-failure.policy</name>
      <value>NEVER</value>
    </property>

     

  3. <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,希望对改为有用