最近有个需求,要把笔记本上的一个近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"