将linux本地文件夹上传到hdfs服务器

来源:互联网 发布:java程序员每天做什么 编辑:程序博客网 时间:2024/06/06 00:49
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;


//运行方式:指定两个输入参数,依次为 本地文件(或文件夹)路径、HDFS文件(或文件夹)路径
public class UploadAll {

public static void main(String[] args) throws Exception {
if(args.length < 2){
System.out.println("Please input two number");
System.exit(2);
}
String localSrc = args[0];
String dst = args[1];
Configuration conf = new Configuration();
File srcFile = new File(localSrc);
if(srcFile.isDirectory()){
copyDirectory(localSrc , dst , conf);
}else{
copyFile(localSrc, dst, conf);
}
}
/**
* 拷贝文件
* @param src
* @param dst
* @param conf
* @return
* @throws Exception
*/
public static boolean copyFile(String src , String dst , Configuration conf) throws Exception{
FileSystem fs = FileSystem.get(conf);
fs.exists(new Path(dst));
//FileStatus status = fs.getFileStatus(new Path(dst));
File file = new File(src);

InputStream in = new BufferedInputStream(new FileInputStream(file));
/**
* FieSystem的create方法可以为文件不存在的父目录进行创建,
*/
OutputStream out = fs.create(new Path(dst) , new Progressable() {
public void progress() {
System.out.print(".");
}
});
IOUtils.copyBytes(in, out, 4096, true);

return true;
}
/**
* 拷贝文件夹
* @param src
* @param dst
* @param conf
* @return
* @throws Exception 
*/
public static boolean copyDirectory(String src , String dst , Configuration conf) throws Exception{

FileSystem fs = FileSystem.get(conf);
if(!fs.exists(new Path(dst))){
fs.mkdirs(new Path(dst));
}
System.out.println("copyDirectory:"+dst);
FileStatus status = fs.getFileStatus(new Path(dst));
File file = new File(src);

if(status.isFile()){
System.exit(2);
System.out.println("You put in the "+dst + "is file !");
}else{
dst = cutDir(dst);
}
File[] files = file.listFiles();
for(int i = 0 ;i< files.length; i ++){
File f = files[i];
if(f.isDirectory()){
copyDirectory(f.getPath(),dst,conf);
}else{
copyFile(f.getPath(),dst+files[i].getName(),conf);
}

}
return true;
}
public static String cutDir(String str){
String[] strs = str.split(File.pathSeparator);
String result = "";
if("hdfs"==strs[0]){
result += "hdfs://";
for(int i = 1 ; i < strs.length  ; i++){
result += strs[i] + File.separator;
}
}else{
for(int i = 0 ; i < strs.length  ; i++){
result += strs[i] + File.separator;
}
}

return result;
}

}

如果是windows,先把windows的文件夹用pscp -r命令上传到linux服务器,在linux服务器运行上述代码导出的jar包即可。

注意:上述代码是将本地的文件夹下所有子文件夹的所有文件,上传到hdfs的同一个目录下

若想保留原来文件夹下的子文件夹及其文件,将红色部分代码修改为:

String dstName=dst+f.getName();
copyDirectory(f.getPath(),dstName,conf);

即可。另外,这个是只创建子文件夹,不会创建父文件夹,可以在指定hdfs的路径的时候带上父文件夹即可。

0 0
原创粉丝点击