java程序向hdfs中追加数据,异常以及解决方案

今天在学习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,希望对改为有用

转载于:https://www.cnblogs.com/ljysy/p/9720266.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值