上传本地文件到HDFS_如何上传文件到hdfs-程序员宅基地

技术标签: hdfs  hadoop  文件系统  

1. 根据配置文件得到三个待用目录

   本地文件目录 (待上传目录)

  hdfs远程文件备份目录(hdfs备用目录)

  hdfs远程文件归档目录(hdfs正式路径)

  hdfs的文件操作封装成工具类,随时供调用

public class HDFSUtil {

	protected static Configuration conf;
	protected FileSystem hdfs;
	private Comparator<? super LocatedFileStatus> fileCompare;

	public HDFSUtil() {
		try {
			if (conf == null) {
		      conf = new Configuration();
			}
            //获取配置的文件系统
			hdfs = FileSystem.get(conf);
		} catch (IOException e) {
			throw new BaseException("HDFS读取配置文件获取连接操作异常!");
		}
        //文件比较器定义,即修改时间不同的文件,即为“不同的”文件
		fileCompare = new Comparator<LocatedFileStatus>() {
			@Override
			public int compare(LocatedFileStatus o1, LocatedFileStatus o2) {
				int rs = 0;
				long l1 = o1.getModificationTime();
				long l2 = o2.getModificationTime();
				if (l1 > l2) {
					rs = 1;
				} else if (l1 < l2) {
					rs = -1;
				}
				return rs;
			}
		};
	}

/**
	 * 是否存在目录或文件 .
	 * 
	 */
	public boolean existFile(String hdfsPath) throws IOException {
		Path path = new Path(hdfsPath);
		return hdfs.exists(path);
	}
	/**
	 * 删除目录或文件
	 * 
	 * @param dir
	 *            目录名
	 */
	public boolean deleteFileOrDir(String dir) {
		boolean flag = false;
		try {
			flag = hdfs.delete(new Path(dir), true);
			if (!flag) {
				throw new BaseException("删除目录或文件失败,请检查'" + dir + "'目录或文件是否存在!");
			}
		} catch (IOException e) {
					throw new BaseException("HDFS删除目录或文件失败!");
		}
		return flag;
	}
/**
	 * 将本地文件上传到HDFS服务器上
	 * 
	 * @param source
	 *            源文件路径
	 * @param dest
	 *            目标文件路径
	 */
	public boolean uploadLocalFile2HDFS(String source, String dest) {
		boolean flag = false;
		Path src = new Path(source);
		try {
			Path dst = new Path(dest);
			if (hdfs.exists(dst)) { // 如果目标文件已存在,则先删除再上传
				deleteFileOrDir(dest);
			}
			hdfs.copyFromLocalFile(src, dst);
			// 设置上传者本身有删除权限
			hdfs.setPermission(dst, FsPermission.valueOf("-rwxrwxr-x"));
			flag = true;
		} catch (Exception e) {
		
				throw new BaseException(dest, e.getMessage());
			}
			throw new BaseException("HDFS上传文件失败.");
		}
		return flag;
	}
	/**
	 * 新建目录
	 * 
	 * @param dir
	 *            目录名
	 */
	public boolean makeDir(String dir) {
		boolean flag = false;
		try {
			Path path = new Path(dir);
			if (hdfs.exists(path)) {
				flag = true; // 如果路径存在,直接返回true
			} else {
				flag = hdfs.mkdirs(new Path(dir));
			}
		} catch (IOException e) {
			throw new BaseException("创建目录失败!");
		}
		return flag;
	}

}

2.扫描本地文件目录中存在的文件名

//获取本地路径, pathName不可为null,否则会抛空指针异常

File file=new File(pathName);

/**

将此路径下的所有文件和目录名(当前名称,不包含此目录或文件的父目录名称)以数组形式列出,如果pathName放入的不是目录,而是文件名,则此函数返回null,如果该目录下无文件则返回空。

**/
String filename[]=file.list();

3. 本地文件目录+文件名 即为完整的需要上传的文件整体目录信息。

4. 新建对列以存储文件目录信息,将文件信息放入队列,等待上传

    private static ConcurrentLinkedQueue<String> upLoadHdfsqueue = new ConcurrentLinkedQueue<>();
    public static void add(String pathName) {
        upLoadHdfsqueue.add(pathName);
        logger.info(ILoggerBusiness.LOGTYPE_BUSINESS, ILoggerBusiness.ERRORCODE_NULL, "hdfs队列增加一个元素:" + str);
    }
    
    public static int GetQueueSize() {
        return upLoadHdfsqueue.size();
    }

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zzooeefly/article/details/88634234

智能推荐

Python实现迪杰斯特拉算法和贝尔曼福特算法求解最短路径_使用迪杰斯特拉算法获得从源结点(source)到目的结点的最短路径长度-程序员宅基地

文章浏览阅读2k次,点赞3次,收藏24次。(一)、题目本题采用带权无向图作为例子。要求实现:绘制带权无向图获得从源结点到目的结点的最短路径所有结点两两之间的最短路径实现最短路径高亮(二)、导库最短路径问题主要使用的库是:networkx——内置常用的图与复杂网络分析算法matplotlib——使用matplotlib库进行绘图import networkx as nx #内置常用的图与复杂网络分析算法..._使用迪杰斯特拉算法获得从源结点(source)到目的结点的最短路径长度

程序员实用算法.pdf免费下载_程序员算法pdf 网盘下载-程序员宅基地

文章浏览阅读1.5k次。《程序员实用算法》重点关注的是实用、立即可用的代码,并且广泛讨论了可移植性和特定于实现的细节。《程序员实用算法》作者介绍了一些有用但很少被讨论的算法,它们可用于语音查找、日期和时间例程(直到公元1年)、B树和索引文件、数据压缩、任意精度的算术、校验和与数据验证,并且还最全面地介绍了查找例程、排序算法和数据结构。译者序前言致谢第1章 绪论1.1 评估算法1.2 修改算法1_程序员算法pdf 网盘下载

Python做的一个精简版学生信息管理系统【简单】【实用】_学生信息管理系统开发(简单版)。 功能能点: 展示学生信息-程序员宅基地

文章浏览阅读4.5k次,点赞9次,收藏46次。因为最近打算开发一个信息管理系统,有点复杂。作为初学者的我不是很懂。所以从简单的开始,先练练手。一步一步来,踏踏实实的走。千里之行始于足下。所以参考网上的一片技术文章,稍微修改了一下,做了这个系统。截图:废话不多说,上代码!代码:student_information.py#!/usr/bin/python# -*- coding: UTF-8 -*-students = ..._学生信息管理系统开发(简单版)。 功能能点: 展示学生信息

Pandas DataFrame 根据不同列分组,分组后对不同列使用不同的聚合函数_dataframe按某列分组-程序员宅基地

文章浏览阅读5.8k次,点赞3次,收藏15次。1. groupBy基本操作:import pandas as pdimport numpy as npdf = pd.DataFrame({'A': ['a', 'b', 'a', 'c', 'a', 'c', 'b', 'c'], 'B': [2, 8, 1, 4, 3, 2, 5, 9], 'C': [102, 98, 107, 104, 115, 87, 92, 123]})df# 输出 A B C0_dataframe按某列分组

ubuntu oracle 12c,在Ubuntu上怎么装oracle12c-程序员宅基地

文章浏览阅读715次。安装开始前,确认你的系统符合oracle的最小安装要求:1gb内存(oracle 默认922m内存)1 gb 交换分区(估计你得自己增加,ubuntu默认的swap比较小,自己搜教程吧)非常重要的一点:sudo apt-get install libstdc++5,安装c++类库,不行的话安装6的类库1.1. 设置用户创建组#addgroup oinstall#addgroup dba#addgr..._ubuntu 20.04 oracle 12c

ubuntu14 apt-get 安装java8 ppa_webup8 java-程序员宅基地

文章浏览阅读3.6k次。echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | tee /etc/apt/sources.list.d/webupd8team-java.listecho "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu xenial mai_webup8 java

随便推点

vue商品秒杀倒计时-程序员宅基地

文章浏览阅读871次。今天做项目需要倒计时具体代码如下:showTimes(val) { let that = this; let interval = setInterval(() => { let nowTime = new Date().getTime(); let startDate = that.obj.endTime; startDate = startDate.replace(new RegExp('-', 'gm'), '/'); let startDate

[javascript]关于帧动画的操作_js逐帧动画-程序员宅基地

文章浏览阅读597次。使用css或者css+js实现帧动画。_js逐帧动画

【图像拼接】SIFT+RANSAC图像拼接与融合【含Matlab源码 3231期】-程序员宅基地

文章浏览阅读1.1k次,点赞27次,收藏12次。SIFT+RANSAC图像拼接与融合完整代码,直接运行,适合小白!可提供运行操作视频!

vmwareworkstation的linux虚拟机关闭屏保【自动锁屏】,掌门一对一java面试题_linux虚拟机如何取消锁屏-程序员宅基地

文章浏览阅读370次,点赞4次,收藏6次。给大家送一个小福利附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。跳槽、自身职业规划迷茫的朋友们。[外链图片转存中…(img-VzhL7L8l-1711087689878)]本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录。_linux虚拟机如何取消锁屏

【5G】PDSCH/PUSCH DMRS CDM(OCC)原理_occ和pusch-程序员宅基地

文章浏览阅读591次,点赞9次,收藏9次。5G协议解读与原理解析:DMRS CDM需求及码分权值生成原理_occ和pusch

QML ListView实现惰性加载_qlistview实现懒加载-程序员宅基地

文章浏览阅读2.9k次。移动开发中,经常会看到这样的需求,用户拖动列表至列表最下端时,软件自动加载新的内容。这就是惰性加载,也叫延时加载。实现的关键是监控当用户拖动列表至最下端时的事件。上拉加载原理:contentY为列表上拉后列表左上角点距显示框左上解点的高度,listView1.height为可显示部分的高度,假设列表单元的高度为listViewCellHeight,列表个数为li_qlistview实现懒加载