0005.操作HDFS


04-04-HDFS的WebConsole

Web Console:端口 50070
HDFS启动的过程.png
	1、安全模式 safe mode
		注意:HDFS正常运行的时候,安全模式一定是off(关闭状态)
		      是HDFS的一种自我保护,作用:检查数据块的副本率
			  HDFS处于安全模式,是只读的状态
	
	2、快照:是一种备份
		命令:
			[-allowSnapshot <snapshotDir>]
			[-disallowSnapshot <snapshotDir>]
			
	3、配额:Quota	
		(1)名称配额
			[-setQuota <quota> <dirname>...<dirname>]
			[-clrQuota <dirname>...<dirname>]
		
		(2)空间配额
			[-setSpaceQuota <quota> [-storageType <storagetype>] <dirname>...<dirname>]
			[-clrSpaceQuota [-storageType <storagetype>] <dirname>...<dirname>]

	4、回收站:默认HDFS的回收站禁用	


04-05-HDFS的命令行操作

HDFS操作命令(HDFS操作命令帮助信息:hdfs dfs)
命令 说明 示例
-mkdir 在HDFS上创建目录 l 在HDFS上创建目录/data hdfs dfs -mkdir /datal 在HDFS上级联创建目录/data/input hdfs dfs -mkdir -p /data/input
-ls 列出hdfs文件系统根目录下的目录和文件 l 查看HDFS根目录下的文件和目录 hdfs dfs -ls /l 查看HDFS的/data目录下的文件和目录 hdfs dfs -ls /data
-ls -R 列出hdfs文件系统所有的目录和文件 l 查看HDFS根目录及其子目录下的文件和目录 hdfs dfs -ls -R /
-put 上传文件或者从键盘输入字符到HDFS l 将本地Linux的文件data.txt上传到HDFS hdfs dfs -put data.txt /data/inputl 从键盘输入字符保存到HDFS的文件 hdfs dfs -put - /aaa.txt
-moveFromLocal 与put相类似,命令执行后源文件 local src 被删除,也可以从从键盘读取输入到hdfs file中 hdfs dfs -moveFromLocal data.txt /data/input
-copyFromLocal 与put相类似,也可以从从键盘读取输入到hdfs file中 hdfs dfs -copyFromLocal data.txt /data/input
-copyToLocal
-get 将HDFS中的文件被复制到本地 hdfs dfs -get /data/inputdata.txt /root/
-rm 每次可以删除多个文件或目录 hdfs dfs -rm < hdfs file > ... 删除多个文件hdfs dfs -rm -r < hdfs dir>... 删除多个目录
-getmerge 将hdfs指定目录下所有文件排序后合并到local指定的文件中,文件不存在时会自动创建,文件存在时会覆盖里面的内容 将HDFS上/data/input目录下的所有文件,合并到本地的a.txt文件中hdfs dfs -getmerge /data/input /root/a.txt
-cp 拷贝HDFS上的文件
-mv 移动HDFS上的文件
-count 统计hdfs对应路径下的目录个数,文件个数,文件总计大小显示为目录个数,文件个数,文件总计大小,输入路径
-du 显示hdfs对应路径下每个文件夹和文件的大小 hdfs dfs -du /
-text、-cat 将文本文件或某些格式的非文本文件通过文本格式输出
balancer 如果管理员发现某些DataNode保存数据过多,某些DataNode保存数据相对较少,可以使用上述命令手动启动内部的均衡过程
HDFS管理命令
命令 说明 示例
-report 显示文件系统的基本数据 hdfs dfsadmin -report
-safemode HDFS的安全模式命令< enter | leave | get | wait > hdfs dfsadmin -safemode enter|leave|get|wait

04-06-创建目录和HDFS的权限的问题

Java API
	依赖的jar包:
	$HADOOP_HOME/share/hadoop/common/*.jar
	$HADOOP_HOME/share/hadoop/common/lib/*.jar
	
	$HADOOP_HOME/share/hadoop/hdfs/*.jar
	$HADOOP_HOME/share/hadoop/hdfs/lib/*.jar
在HDFS上创建目录
    /*
     * 错误:
     * Permission denied: user=lenovo, access=WRITE, inode="/folder111":root:supergroup:d rwx  r-x  r-x
     * 
     * 针对其他用户,没有w的权限
     * 
     * 四种方式可以改变HDFS的权限:
     * 
     * 第一种方式:设置环境变量  HADOOP_USER_NAME = root
     * 第二种方式:通过使用Java的 -D参数
     * 第三种方式:dfs.permissions ----> false
     * 第四种方式:命令 -chmod 改变HDFS目录的权限
     */
	@Test
	public void testMkDir1() throws Exception{
		//指定当前的Hadoop的用户
		System.setProperty("HADOOP_USER_NAME", "root");
		
		//配置参数:指定NameNode地址
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://192.168.157.111:9000");
		
		//创建一个客户端
		FileSystem client = FileSystem.get(conf);
		
		//创建目录
		client.mkdirs(new Path("/folder111"));
		
		//关闭客户端
		client.close();
	}

04-07-使用JavaAPI上传数据

使用JavaAPI上传数据
	@Test
	public void test1() throws Exception{
		//指定当前的Hadoop的用户
		System.setProperty("HADOOP_USER_NAME", "root");

		//配置参数:指定NameNode地址
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://192.168.157.111:9000");

		//创建一个客户端
		FileSystem client = FileSystem.get(conf);	

		//构造一个输入流,从本地读入数据
		InputStream input = new FileInputStream("d:\temp\hadoop-2.7.3.tar.gz");

		//构造一个输出流 指向HDFS
		OutputStream output = client.create(new Path("/folder111/a.tar.gz"));

		//构造一个缓冲区
		byte[] buffer = new byte[1024];
		//长度
		int len = 0;

		//读入数据
		while((len=input.read(buffer)) > 0){
			//写到输出流中
			output.write(buffer, 0, len);
		}

		output.flush();

		//关闭流
		input.close();
		output.close();
	}
简写
	@Test
	public void test2() throws Exception{
		//指定当前的Hadoop的用户
		System.setProperty("HADOOP_USER_NAME", "root");

		//配置参数:指定NameNode地址
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://192.168.157.111:9000");

		//创建一个客户端
		FileSystem client = FileSystem.get(conf);	

		//构造一个输入流,从本地读入数据
		InputStream input = new FileInputStream("d:\temp\hadoop-2.7.3.tar.gz");

		//构造一个输出流 指向HDFS
		OutputStream output = client.create(new Path("/folder111/b.tar.gz"));

		//使用HDFS的一个工具类简化代码
		IOUtils.copyBytes(input, output, 1024);
	}

04-08-HDFS的Java其他操作

数据下载
	@Test
	public void testDownload() throws Exception{
		//数据下载
		//指定当前的Hadoop的用户
		System.setProperty("HADOOP_USER_NAME", "root");
		
		//配置参数:指定NameNode地址
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://192.168.157.111:9000");
		
		//创建一个客户端
		FileSystem client = FileSystem.get(conf);	
		
		//构造一个输入流,从HDFS中读取数据
		InputStream input = client.open(new Path("/folder111/a.tar.gz"));
		
		//构造一个输出流,输出到本地的目录
		OutputStream output = new FileOutputStream("d:\temp\xyz.tar.gz");
		
		//使用工具类
		IOUtils.copyBytes(input, output, 1024);
	}
获取DataNode的信息(伪分布的环境)
	@Test
	public void testDataNode()  throws Exception{
		//获取DataNode的信息(伪分布的环境)
		//指定当前的Hadoop的用户
		System.setProperty("HADOOP_USER_NAME", "root");
		
		//配置参数:指定NameNode地址
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://192.168.157.111:9000");
		
		//创建一个HDFS客户端
		//FileSystem client = FileSystem.get(conf);		
		DistributedFileSystem fs = (DistributedFileSystem) FileSystem.get(conf);	
		
		//获取数据节点的信息: Stats ---> 统计信息
		DatanodeInfo[] list = fs.getDataNodeStats();
		for(DatanodeInfo info:list){
			System.out.println(info.getHostName()+"	"+ info.getName());
		}
		
		fs.close();
	}
获取数据块的信息
	@Test
	public void testFileBlockLocation() throws Exception{
		//获取数据块的信息
		//指定当前的Hadoop的用户
		System.setProperty("HADOOP_USER_NAME", "root");
		
		//配置参数:指定NameNode地址
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://192.168.157.111:9000");
		
		//创建一个客户端
		FileSystem client = FileSystem.get(conf);
		
		//获取文件的status信息
		FileStatus fileStatus = client.getFileStatus(new Path("/folder111/a.tar.gz"));
		
		//获取文件的数据块信息(数组)
		BlockLocation[] locations = client.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
		/*
		 * 伪分布的环境,数据块的冗余度是:1
		 */
		for(BlockLocation blk:locations){
			System.out.println(Arrays.toString(blk.getHosts()) + "	" + Arrays.toString(blk.getNames()));
		}
		
		client.close();
	}
	1、RPC
	2、代理对象
原文地址:https://www.cnblogs.com/RoyalGuardsTomCat/p/13833374.html