大数据学习04_Hadoop: HDFS操作

HDFS操作

HDFS的Shell操作

  1. 基本语法
    bin/hadoop fs 具体命令
    
    bin/hdfs dfs 具体命令
    
    其中dfsfs的实现类

HDFS常用命令

  1. 启动Hadoop集群
    sbin/start-dfs.sh
    sbin/start-yarn.sh
    
  2. -help: 输出这个命令参数
    hadoop fs -help rm
    
  3. -ls: 显示目录信息
    hadoop fs -ls /
    
  4. -mkdir: 在HDFS上创建目录
    hadoop fs -mkdir -p /dir0/dir1
    
  5. -moveFromLocal: 从本地剪切粘贴到HDFS
    hadoop fs -moveFromLocal ./myfile.txt /dir0/dir1
    
  6. -appendToFile: 追加一个文件到已经存在的文件末尾
    hadoop fs -appendToFile ./myfile.txt /dir0/dir1
    
  7. -cat: 显示文件内容
    hadoop fs -cat /dir0/dir1/myfile.txt
    
  8. -chgrp,-chmod,-chown: Linux文件系统中的用法一样,修改文件所属权限
    hadoop fs  -chmod  666 /dir0/dir1/myfile.txt
    hadoop fs  -chown myuser:mygroup /dir0/dir1/myfile.txt
    
  9. -copyFromLocal: 从本地文件系统中拷贝文件到HDFS路径去
    hadoop fs -copyFromLocal ./myfile.txt /dir0/dir1
    
  10. -copyToLocal: 从HDFS拷贝到本地
    hadoop fs -copyToLocal /dir0/dir1/myfile.txt ./
    
  11. -cp: 从HDFS的一个路径拷贝到HDFS的另一个路径
    hadoop fs -cp /dir0/dir1/myfile.txt /dir2
    
  12. -mv: 在HDFS目录中移动文件
    hadoop fs -mv /dir0/dir1/myfile.txt /dir2
    
  13. -get: 等同于copyToLocal,就是从HDFS下载文件到本地
    hadoop fs -get /dir0/dir1/myfile.txt ./
    
  14. -getmerge: 合并下载多个文件,用于将文档合并下载
    hadoop fs -getmerge /logs/* ./logs.txt
    
  15. -put: 等同于-copyFromLocal:
    hadoop fs -put ./myfile.txt /dir0/dir1
    
  16. -tail: 显示一个文件的末尾
    hadoop fs -tail /dir0/dir1/myfile.txt
    
  17. -rm: 删除文件或文件夹
    hadoop fs -rm /dir0/dir1/myfile.txt
    
  18. -rmdir: 删除空目录
    hadoop fs -mkdir /emptydirectory
    
  19. -du: 统计文件夹的大小信息
    hadoop fs -du -s -h /dir0/dir1/myfile.txt
    
  20. -setrep: 设置HDFS中文件的副本数量
    hadoop fs -setrep 10 /dir0/dir1/myfile.txt
    

HDFS客户端操作

HDFS客户端环境准备

  1. hadoop的jar包拷贝到非中文,无空格的路径之下,如D:\Develop\hadoop-2.7.2.并新建环境变量HADOOP_HOME,其值为hadoop的jar包路径.
  2. %HADOOP_HOME%/bin%JAVA_HOME%/bin加入到环境变量Path中.
  3. 新建一个Maven工程HDFSClientDemo,在工程下的pom.xml中配置依赖如下:
    <dependencies>
    	<dependency>
    		<groupId>junit</groupId>
    		<artifactId>junit</artifactId>
    		<version>RELEASE</version>
    	</dependency>
    	<dependency>
    		<groupId>org.apache.logging.log4j</groupId>
    		<artifactId>log4j-core</artifactId>
    		<version>2.8.2</version>
    	</dependency>
    	<dependency>
    		<groupId>org.apache.hadoop</groupId>
    		<artifactId>hadoop-common</artifactId>
    		<version>2.7.7</version>
    	</dependency>
    	<dependency>
    		<groupId>org.apache.hadoop</groupId>
    		<artifactId>hadoop-client</artifactId>
    		<version>2.7.7</version>
    	</dependency>
    	<dependency>
    		<groupId>org.apache.hadoop</groupId>
    		<artifactId>hadoop-hdfs</artifactId>
    		<version>2.7.7</version>
    	</dependency>
    	<!-- 若JDK版本高于1.8,则不存在tools.jar包,可以不用配置下边依赖 -->
    	<dependency>
    		<groupId>jdk.tools</groupId>
    		<artifactId>jdk.tools</artifactId>
    		<version>1.8</version>
    		<scope>system</scope>
    		<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
    	</dependency>
    </dependencies>
    
  4. src/main/java中创建包cn.maoritian.hdfs,在该包下创建类HdfsClient如下:
    package cn.maoritian.hdfs;
    
    import java.net.URI;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    
    public class HdfsClient {
    	public static void main(String[] args) throws Exception {
    		// 1 获取文件系统操作对象
    		// Configuration configuration = new Configuration();
    		// configuration.set("fs.defaultFS", "hdfs://hadoop102:9000");
    		// 第一个参数指定NameNode的位置
    		// 第二个参数创建参数对象
    		// 第三个参数指定登录的用户名
    		FileSystem fs = FileSystem.get(new URI("hdfs://192.168.111.102:9000"), new Configuration(), "root");
    
    		// 2 创建目录
    		fs.mkdirs(new Path("/dir1/dir2"));
    
    		// 3 关闭资源
    		fs.close();
    	}
    }
    
    执行上边程序,在http://hadoop102:50070/中看到HDFS文件系统上创建了新目录/dir1/dir2,证明客户端准备成功

HDFS的API操作

  1. 文件上传

    @Test
    public void testCopyFromLocalFile() throws IOException, InterruptedException, URISyntaxException {
    
    	// 1. 获取文件系统操作对象
    	Configuration configuration = new Configuration();
    	configuration.set("dfs.replication", "2");
    	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "root");
    
    	// 2. 上传文件
    	fs.copyFromLocalFile(new Path("D:/myfile.txt"), new Path("/dir1/myfile.txt"));
    
    	// 3. 关闭资源
    	fs.close();
    }
    

    可以在http://hadoop102:50070/中看到上传文件的备份数为2,说明在程序中的优先级高于配置中的优先级.

  2. 文件下载

    public void testCopyToLocalFile() throws IOException, InterruptedException, URISyntaxException {
    	// 1 获取文件系统操作对象
    	Configuration configuration = new Configuration();
    	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "root");
    
    	// 2. 执行下载操作,参数如下
    	// boolean delSrc 是否将原文件删除
    	// Path src 要下载的文件路径
    	// Path dst 将文件下载到的路径
    	// boolean useRawLocalFileSystem 是否开启文件校验
    	fs.copyToLocalFile(false, new Path("/dir1/myfile.txt"), new Path("e:/myfile.txt"), true);
    
    	// 3. 关闭资源
    	fs.close();
    }
    
  3. 删除文件或目录

    @Test
    public void testDelete() throws IOException, InterruptedException, URISyntaxException {
    	// 1. 获取文件系统操作对象
    	Configuration configuration = new Configuration();
    	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "root");
    
    	// 2. 执行删除
    	// 第二个参数: boolean recursive 表示是否递归删除(针对目录)
    	fs.delete(new Path("/dir1"), true);
    
    	// 3. 关闭资源
    	fs.close();
    }
    
  4. 文件名更改

    @Test
    public void testRename() throws IOException, InterruptedException, URISyntaxException {
    	// 1 获取文件系统
    	Configuration configuration = new Configuration();
    	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "root");
    	
    	// 2 修改文件名称
    	fs.rename(new Path("/myfile1.txt"), new Path("/myfile2.txt"));
    	
    	// 3 关闭资源
    	fs.close();
    }
    
  5. 文件详情查看
    查看文件名称、权限、长度、块信息

    @Test
    public void testListFiles() throws IOException, InterruptedException, URISyntaxException {
    	// 1. 获取文件系统操作对象
    	Configuration configuration = new Configuration();
    	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "root");
    
    	// 2 获取文件详情
    	RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
    
    	// 迭代获取每个文件
    	while (listFiles.hasNext()) {
    		LocatedFileStatus status = listFiles.next();
    		
    		System.out.println(status.getPath().getName());		// 文件名称
    		System.out.println(status.getLen());				// 长度			
    		System.out.println(status.getPermission());			// 权限			
    		System.out.println(status.getGroup());				// 分组
    
    		// 获取存储的块信息
    		BlockLocation[] blockLocations = status.getBlockLocations();
    		// 遍历所有块
    		for (BlockLocation blockLocation : blockLocations) {
    			// 获取块存储的主机节点
    			String[] hosts = blockLocation.getHosts();
    			for (String host : hosts) {
    				System.out.println(host);
    			}
    		}
    		System.out.println("-----------分割线----------");
    	}
    
    	// 3 关闭资源
    	fs.close();
    }
    
  6. 文件和文件夹判断

@Test
public void testListStatus() throws IOException, InterruptedException, URISyntaxException {

	// 1 获取文件系统操作对象
	Configuration configuration = new Configuration();
	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "root");

	// 2 判断是文件还是目录
	FileStatus[] listStatus = fs.listStatus(new Path("/"));
	for (FileStatus fileStatus : listStatus) {
		if (fileStatus.isFile()) {
			// 是文件
			System.out.println("f:" + fileStatus.getPath().getName());
		} else {
			// 是目录
			System.out.println("d:" + fileStatus.getPath().getName());
		}
	}

	// 3 关闭资源
	fs.close();
}

HDFS的I/O流操作

将HDFS的I/O操作封装在I/O流中

// 文件上传
@Test
public void putFileToHDFS(String srcPath, String destPath) throws IOException, InterruptedException, URISyntaxException {
	// 1. 获取文件系统操作对象
	Configuration configuration = new Configuration();
	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "root");
	// 2. 创建输入流
	FileInputStream fis = new FileInputStream(new File(srcPath));
	// 3. 获取输出流
	FSDataOutputStream fos = fs.create(new Path(destPath));
	// 4. 流对拷
	IOUtils.copyBytes(fis, fos, configuration);
	// 5 关闭资源
	IOUtils.closeStream(fos);
	IOUtils.closeStream(fis);
	fs.close();
}

// 文件下载
@Test
public void getFileFromHDFS(String srcPath, String destPath) throws IOException, InterruptedException, URISyntaxException {
	// 1. 获取文件系统操作对象
	Configuration configuration = new Configuration();
	FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "root");
	// 2. 获取输入流
	FSDataInputStream fis = fs.open(new Path(srcPath));
	// 3. 获取输出流
	FileOutputStream fos = new FileOutputStream(new File(destPath));
	// 4 流的对拷
	IOUtils.copyBytes(fis, fos, configuration);
	// 5 关闭资源
	IOUtils.closeStream(fos);
	IOUtils.closeStream(fis);
	fs.close();
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值