采用文件流写HDFS大文件

最近有个需求,要把笔记本上的一个近30GB的文件写到HDFS上去。无奈虚拟机服务器的本地硬盘都只有20GB的容量,原始文件无法采用copyFromLocal。试了一下笔记本通过copyFromLocal写到HDFS,无奈龟速。最后想到一个办法:

  • 压缩文件,gz文件大概到7G的样子;
  • 拷贝gz文件至服务器vm1;
  • 在vm1上写程序,读取gz文件数据流,写到HDFS文件上去;

结果看起来还不错,代码如下:

import java.io.FileInputStream
import java.util.zip.GZIPInputStream
import java.io.File
import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.Path
import java.net.URI

object CopyZipFile {
    def main(args: Array[String]) = {
        val fn = args(0);
        val hfn = args(1);
        println(s"open file: $fn, save file: $hfn");
        val in = new FileInputStream(new File(fn));
        val conf = new Configuration();
        val fs = FileSystem.get(URI.create(hfn), conf);
        val out = fs.create(new Path(URI.create(hfn)));
        val ungzip = new GZIPInputStream(in);
        var buffer = new Array[Byte](102400);

        var n = 0;
        while (n >= 0) {
            n = ungzip.read(buffer);
            if (n >= 0)
                out.write(buffer, 0, n);
        }

        out.close();
        in.close;
    }
}

代码一般,记下来,没准会有一点参考价值。第一次真心体会到gzip数据流的优势,哈哈~~

由于这是个maven项目,最后在服务器上的执行命令是:

mvn exec:java -Dexec.mainClass="CopyZipFile" -Dexec.args="/root/dblp.rdf.gz hdfs://vm122:9000/dblp.rdf"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值