采用文件流写HDFS大文件

来源:互联网 发布:mac玲珑加速器装不进去 编辑:程序博客网 时间:2024/05/16 18:30

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

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

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

import java.io.FileInputStreamimport java.util.zip.GZIPInputStreamimport java.io.Fileimport org.apache.hadoop.fs.FileSystemimport org.apache.hadoop.conf.Configurationimport org.apache.hadoop.fs.Pathimport java.net.URIobject 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"
原创粉丝点击