zoukankan      html  css  js  c++  java
  • 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、代理对象
    
  • 相关阅读:
    51nod1229 序列求和 V2
    51nod 1228、1258 序列求和
    题解P3711:【仓鼠的数学题】
    伯努利数学习笔记的说...
    题解 P4692 【[Ynoi2016]谁的梦】
    积性函数与卷积
    题解 P5065 【[Ynoi2014]不归之人与望眼欲穿的人们】
    [Ynoi2018]末日时在做什么?有没有空?可以来拯救吗?
    [51nod1965]奇怪的式子
    PGCD2
  • 原文地址:https://www.cnblogs.com/RoyalGuardsTomCat/p/13833374.html
Copyright © 2011-2022 走看看