从本地上传整个目录到hdfs的java程序

首先在网上找了好久没有找到从本地文件系统上传整个目录到hdfs文件系统的程序,权威指南上也没有,都是单个文件上传,所以这里自己编写了一个程序,封装成jar包执行能够复制。

先说明一下代码:须要手动输入两个路径,一个本地文件/目录路径,第二个是hdfs目录路径。好直接上代码:

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;

/**
 *
 * @author zlqiao
 *
 */
public class Copy {
	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;
	}
}
时间: 2024-08-26 10:11:43

从本地上传整个目录到hdfs的java程序的相关文章

从本地上传整个文件夹到hdfs的java程序

首先在网上找了好久没有找到从本地文件系统上传整个文件夹到hdfs文件系统的程序,权威指南上也没有,都是单个文件上传,所以这里自己编写了一个程序,封装成jar包运行可以复制. 先说明一下代码:需要手动输入两个路径,一个本地文件/文件夹路径,第二个是hdfs文件夹路径.好直接上代码: import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.Input

从本地上传到hdfs上出现异常

hdfs dfs -put  从本地上传到hdfs上出现异常 与namenode  同台机器的datanode错误日志信息如下: 2015-12-03 09:54:03,083 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Slow BlockReceiver write data to disk cost:727ms (threshold=300ms) 2015-12-03 09:54:03,991 INFO org.apache.

使用递归方法实现,向FTP服务器上传整个目录结构、从FTP服务器下载整个目录到本地的功能

我最近由于在做一个关于FTP文件上传和下载的功能时候,发现Apache FTP jar包没有提供对整个目录结构的上传和下载功能,只能非目录类型的文件进行上传和下载操作,后来我查阅很多网上的实现方法,再结合自己的理解.以及符合自己的需求,完成了我自己的apache FTP jar包补充类. 上面是背景,基本叙述完毕,下面开始介绍实现方法和代码. 一.环境搭建: 1.使用的FileZilla Server开源免费软件,安装过后建立的本地FTP服务器. 2.使用的apache上下载FTP工具包,引用到

利用Java API通过路径过滤上传多文件至HDFS

在本地文件上传至HDFS过程中,很多情况下一个目录包含很多个文件,而我们需要对这些文件进行筛选,选出符合我们要求的文件,上传至HDFS.这时就需要我们用到文件模式. 在项目开始前,我们先掌握文件模式 1.文件模式 在某个单一操作中处理一系列文件是很常见的.例如一个日志处理的MapReduce作业可能要分析一个月的日志量.如果一个文件一个文件或者一个目录一个目录的声明那就太麻烦了,我们可以使用通配符(wild card)来匹配多个文件(这个操作也叫做globbing). Hadoop提供了两种方法

Unity3d本地上传并且裁剪图片-----Android平台

注:引擎版本unity4.x 最近项目需求,需要做用户头像,要求: 1.  可以从本地上传 2.  本地裁剪 3.  压缩控制大小 4.  在三个平台实现PC/Android/IOS 弄了好几天总是搞完了总结一下 从本地上传会用到Android系统功能,打开相册和用摄像机拍照,因此unity和Android的交互是必须要会的. Unity-android可参考到宣雨松的博客http://www.xuanyusong.com/archives/676package com.cheerflame.s

Phpcms V9网站从本地上传到服务器需要修改的地方小结

网站在本地做好后要迁移到服务器上:网站在发展的过程中,很可能多次的修改域名.那么在Phpcms V9中我们要怎么进行设置呢 请进行以下步骤的修改: 1.修改/caches/configs/system.php里面所有和域名有关的,把以前的老域名修改为新域名就可以了. 2.进行后台设置->站点管理 对相应的站点的域名进行修改. 3.更新系统缓存.点击后台右上角的"更新缓存"按钮. 4.进入内容->附件管理->附件地址替换.把附件地址批量的替换为新的地址. 5.内容-&g

Unity3d本地上传并且裁剪图片-----iOS平台

注:引擎版本unity4.x 最近项目需求,需要做用户头像,要求: 1.  可以从本地上传 2.  本地裁剪 3.  压缩控制大小 4.  在三个平台实现PC/Android/IOS 弄了好几天总是搞完了总结一下 在网上找了一段时间,有人推荐了一个插件,网盘地址忘记存了,直接上代码吧 OpenPhotoController.h : @interface OpenPhotoController : NSObject<UIApplicationDelegate,UIImagePickerContro

Git本地上传到服务器

Git本地上传到服务器 2018年05月17日 10:45:02 VV-King 阅读数:643 标签: git 1.本机window系统的话先下载msysgit  下载后在开始菜单里面找到 "Git --> Git Bash"进入命令 2.找到要上传的目录,通过命令 git init 把这个目录变成git可以管理的仓库 git init 3.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点“.”,意为添加文件夹下的所有文件 git ad

本地上传文件到服务器,从服务器下载文件到本地

最近在做项目的时候涉及到了文件的上传.下载,以前学习IO时也没有搞得多清楚,在网上找了些上传下载的例子,然后修改了部分.经测试,上传下载文件暂时能用,下面是上传和下载的方法: 1.本地上传文件到服务器 html代码: <form id="uploadDatumInfo" name="uploadDatumInfo" method="post" enctype="multipart/form-data" target=&q