Hadoop学习笔记02

╄→尐↘猪︶ㄣ 提交于 2020-02-25 10:58:03

hdfs的shell操作

hadoop fs -操作命令 -参数
-ls #显示目录信息
-copyFromLocal #从本地文件系统中拷贝文件到hdfs路径
-copyToLocal #从hdfs中拷贝到本地文件系统
-put #等同于copyFromLocal
-get #等同于copyToLocal
-getmerge #合并下载多个文件
-moveFromLocal #类似剪切,本地->hdfs
-moveToLocal #类似剪切,hdfs->本地
-cp #拷贝 hdfs->hdfs
-mv #移动hdfs->hdfs
-mkdir #在hdfs上创建文件夹
-rm #删除文件或文件夹
-rmdir #删除空目录
-cat #显示文件内容

hdfs运行机制

文件系统

hdfs有一个统一的命名空间,客户端访问hdfs文件时就是通过指定目录树中路径来访问

分布式

hdfs文件都是分块(block)存储的,其大小可通过dfs.blocksize来规定,hadoop2.x默认128M,老版本64M

block分布在各个datanode服务节点上,并且可以存储多个副本(通过dfs.replication配置)

namenode负责维护目录树,以及每个文件对应的block信息

hdfs适用于一次写入,多次读出,不支持文件的修改

hdfs的Java操作

导包

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

public class Hdfsutil {
	FileSystem fs = null;
	
	@Before
	public void init() throws Exception {
		fs = FileSystem.get(new URI("hdfs://hadoop01:9000"), new Configuration(), "root");
	}
	
	/**
	 * 从hdfs中下载文件到本地
	 * @throws IOException 
	 * @throws IllegalArgumentException 
	 */
	@Test
	public void tsetDownload() throws IllegalArgumentException, IOException {
		fs.copyToLocalFile(false, new Path("/1234.txt"), new Path("C:\\"), true);
		fs.close();
	}
/**
 * 文件夹操作
 * @throws IllegalArgumentException
 * @throws IOException
 */
	@Test
	public void testMkdir() throws IllegalArgumentException, IOException {
		fs.mkdirs(new Path("/abc"));
		System.out.println("创建了一个文件夹");
		
		boolean exists = fs.exists(new Path("/abc"));
		System.out.println("/abc是否存在"+exists);
		
		fs.copyFromLocalFile(new Path("C:\\zookeeper-3.4.6.tar.gz"), new Path("/abc"));
		System.out.println("成功上传一个文件到/abc");
		
		fs.delete(new Path("/abc"), true);
		System.out.println("已经删除/abc目录");
		
		boolean exists2 = fs.exists(new Path("/abc"));
		System.out.println("/abc是否存在"+exists2);
		
		fs.close();
	}

/**
	 * 查看文件状态
	 * @param args
	 * @throws IOException 
	 * @throws IllegalArgumentException 
	 * @throws FileNotFoundException 
	 * @throws Exception
	 */
	@Test
	public void testFileStatus() throws FileNotFoundException, IllegalArgumentException, IOException {
		//只列出文件信息
		RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/aaa"), true);
		while(listFiles.hasNext()) {
			LocatedFileStatus fileStatus = listFiles.next();
			System.out.println(fileStatus.getPath().getName());
		}
		
		System.out.println("--------------------------------------------");
		
		FileStatus[] listStatus = fs.listStatus(new Path("/"));
		for(FileStatus f:listStatus) {
			String type = "-";
			if(f.isDirectory()) {
				type = "d";
			}
			System.out.println(type+"\t"+f.getPath().getName());
		}
		
		
	}
	/**
	 * 
	 * @param args
	 * @throws IOException 
	 * @throws IllegalArgumentException 
	 * @throws Exception
	 */
	@Test
	public void testOthers() throws IllegalArgumentException, IOException {
		
		BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(new Path("/hadoop-2.6.5.tar.gz"), 0, 183594876);
		for(BlockLocation location:fileBlockLocations) {
			System.out.println(location.getOffset());//获取偏移量
			System.out.println(location.getNames()[0]);//获取主机
		}
		//fs.rename(new Path("/123.txt"), new Path("/ttt.txt"));	
		//修改副本数量
		fs.setReplication(new Path("/ttt.txt"), (short)2);
	}
	public static void main(String[] args) throws Exception {
		
		//构造配置参数封装对象
		Configuration conf = new Configuration();
		//conf中会有一个参数:fs:defaultFS的默认值是file:/// 指的是一种本地文件系统URI
		conf.set("fs.defaultFS", "hdfs://192.168.1.101:9000");
		
		//构造hdfs客户端
		FileSystem fs = FileSystem.get(conf);//(需配置run configurations->Arhuments->VM arguments:-DHADOOP_USER_NAME=root)
		//FileSystem fs =	FileSystem.get(new URI("hdfs://hadoop01:9000"), conf, "root");
		
		//用hdfs文件系统的客户端对象fs来操作文件,比如上传
		fs.copyFromLocalFile(new Path("C:\\cTest"), new Path("/"));
		
		//上传完成后关闭客户端
		fs.close();
		
	}
	
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!