linux cpu占用率如何看
296
2022-11-16
【Hadoop】HDFS操作、数据上传与下载原理解析、高级特性及底层原理
HDFS操作、数据上传与下载原理解析、高级特性及底层原理
1 HDFS操作
1.1 Web Console网页工具1.2 命令行
1.2.1 普通的操作命令1.2.2 管理员命令
1.3 Java API
2 HDFS的原理解析
2.1 数据上传的过程2.2 数据下载的过程2.3 使用Java API获取HDFS中的元信息
3 HDFS的高级特性
3.1 回收站3.2 配额Quota
3.2.1 名称配额3.2.2 空间配额
3.3 快照Snapshot3.4 安全模式与权限管理3.5 HDFS的集群
4 HDFS的底层原理
4.1 Java的代理对象Proxy4.2 RPC协议
作者:Be_melting
1 HDFS操作
可以通过三种方式来操作HDFS,分别是: Web Console网页工具、命令行和Java API。接下来就分别介绍这三种方式
1.1 Web Console网页工具
需要先启动虚拟机bigdata111,然后进入伪分布模式中,开启HDFS:start-all.sh。对于NameNode和SecondaryNameNode有不同的网页端口进行监控,具体如下
(1)NameNode:端口50070。注意里面有个参数safemode,在进行操作的时候这个值一定要是关闭的状态,下图中的截图只截取了部分,后面的内容还有一些其它的介绍
为了补全上面的截图,后面的内容也全部截取如下。主要注意一下,正常运行期间,下面的Dead Nodes(死掉的节点)个数一定要为0,不为0的时候表明有些节点是不可用,我们就必须关注一下这些死掉的节点为什么处于不健康的状态,因为每一个节点都相当于是一个完整体系中重要的一环,都不能出问题,否则最后的处理就会垮掉
另外,除了首页之外,还有其它的菜单栏,可以查看,比如下面的HDFS的启动过程,一共分为四步。第一步就是加载原信息文件(但是这个文件并没有体现HDFS最新的状态),因此第二步就是加载客户端日志文件(edit文件中包含了最新的状态信息),然后第三步,出发检查点,SecondaryNameNode就会把edits中的最新状态信息合并到fsimage文件中,最后一步就是整个HDFS会进入一个安全模式。这四个流程正常之后,系统就会自动退出安全模式(第四步存在的必要就是检查数据块的完整性,检查无误就会自动退出)。在utilities菜单栏里面会有HDFS里面的文件和操作的log文件,可以直接在网页上进行查看或者下载
(2)SecondaryNameNode:端口50090。可以发现该网页中出现最多的一个单词就是checkpoint,这个也和SecondaryNameNode的主要职责有关系,当触发检查点时候,SecondaryNameNode就会进行日志信息的合并。
1.2 命令行
通过命令行操作HDFS也有两种方式:
第一种是普通的操作命令:hdfs dfs ****;还有一种是管理员命令:hdfs dfsadmin ****
需要提醒一下,我们不需要对于每个指令都牢记于心,就像python中模块内部的方法一样,使用的时候调用帮助文档查看即可,对于HDFS的操作也是如此,打开Xshell启动biadgdata111上的HDFS,然后直接输入前面的指令,后面的具体参数就会出来的,比如以普通操作命令为例(只截取部分参数信息)
1.2.1 普通的操作命令
-mkdir 在HDFS中创建目录 hdfs dfs -mkdir /aaa hdfs dfs -mkdir -p /bbb/ccc 如果父目录不存在,使用-p参数先创建父目录-ls 查询HDFS的某个目录-ls -R 查询HDFS的某个目录,包含子目录 简写:-lsr-put 上传数据-copyFromLocal 上传数据-moveFromLocal 上传数据,本质ctrl+x 剪切-copyToLocal 下载数据-get 下载数据从hdfs中下载文件到本地:hdfs dfs -get /input/data.txt .-rm 删除目录-rmr 删除目录,包含子目录 举例:hdfs dfs -rmr /bbb 日志:Deleted /bbb(注意对比有无打开回收站)-getmerge:先把某个目录下的文件合并,再下载 [root@bigdata111 ~]# vi student01.txt [root@bigdata111 ~]# vi student02.txt [root@bigdata111 ~]# hdfs dfs -mkdir /students [root@bigdata111 ~]# hdfs dfs -put student0* /students [root@bigdata111 ~]# hdfs dfs -ls /students Found 2 items -rw-r--r-- 1 root supergroup 19 2020-02-24 10:19 /students/student01.txt -rw-r--r-- 1 root supergroup 10 2020-02-24 10:19 /students/student02.txt [root@bigdata111 ~]# hdfs dfs -getmerge /students ./allstudents.txt-cp:拷贝 hdfs dfs -cp /input/data.txt /input/data2.txt-mv:剪切-count:举例 hdfs dfs -count /students[root@bigdata111 ~]# hdfs dfs -count /students 1 2 29 /students 意思就是当前文件夹下有1个文件夹,2个文件,一共29个字节 -du:类似-count,更详细 hdfs dfs -du /students 19 /students/student01.txt 10 /students/student02.txt -text、-cat 查看文本文件的内容 hdfs dfs -cat /students/student01.txt balancer:平衡操作 hdfs balancer 就是将DataNode各个节点的数据块尽量保持均衡提高性能, 但是执行这个操作的时候应该在系统空闲的时候
1.2.2 管理员命令
-report:hdfs dfsadmin -report 打印报告,观察HDFS的状态,这个信息和在Web console上面看到的信息一致-safemode 安全模式 [root@bigdata111 ~]# hdfs dfsadmin -safemode Usage: hdfs dfsadmin [-safemode enter | leave | get | wait] 进入 | 离开 | 获取当前安全模式状态 | 等待安全模式自动退出 [root@bigdata111 ~]# hdfs dfsadmin -safemode get Safe mode is OFF [root@bigdata111 ~]# hdfs dfsadmin -safemode enter Safe mode is ON 安全模式打开后,程序进入只读的状态,无法进行文件的创建 [root@bigdata111 ~]# hdfs dfs -mkdir /xyz mkdir: Cannot create directory /xyz. Name node is in safe mode. [root@bigdata111 ~]# hdfs dfsadmin -safemode leave Safe mode is OFF
1.3 Java API
包含的jar包(需要把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
这里使用的开发环境为Eclipse,然后就是使用WinSCP软件将bigdata111虚拟机上面的HDFS中的对应的jar包下载到本地(建议在桌面创建一个空文件夹,然后将下载的jar包都放置在其中),下载完毕后,桌面创建的HDFS文件夹中一共有74个jar包(注意核实个数)
然后打开Eclipse,创建工程项目,把下载的jar全部放置到工程项目中,并添加到环境路径,操作分解如下:第一步:创建/找一个已有文件放置工程项目文件
然后新建一个Java 的工程项目,进行命名后确认
第二步,将桌面HDFS文件夹中的所有jar包全选后复制粘贴到创建的工程下面的lib文件夹中(lib文件夹要先自己新建)
然后再复制粘贴全部jar,进行环境路径的添加
至此环境就搭建完成了,桌面的HDFS文件夹就可以直接删除了。接下来就是创建Java程序,跑代码,先在src文件夹下先创建一个demo为名的package,然后创建一个DemoMkDir的Java class
然后检查的方法采用JUnit方式进行测试,代码输入完成后如下
package demo;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import org.junit.Test;public class DemoMkDir { @Test public void test1() throws Exception{ //指定NameNode地址,Configuration是在apache.hadoop.conf下 Configuration conf = new Configuration(); //在设置伪分布模式,hdfs配置第二个文件core-site.xml是 //用来设置NameNode地址,键:fs.defaultFS,值:hdfs://192.168.124.111:9000 conf.set("fs.defaultFS","hdfs://192.168.124.111:9000"); //创建一个HDFS的客户端,注意导入的也是apache.hadoop的抽象类 FileSystem client = FileSystem.get(conf); //返回的是DistributeFileSystem //创建目录 client.mkdirs(new Path("/folder1")); //关闭客户端 client.close(); }}
运行Java文件,最后输出的结果如下,具体的报错信息直接看不方便,可以新建一个记事本,复制粘贴上去
还是在桌面创建一个新的记事本,报错信息上传后,内容如下,这里就涉及到之前介绍的HDFS的权限管理了,这里的用户user为lenovo,对应的就是其它用户了,权限码就是最后的r-x,只有读和执行的权限,没有进行写权限,所以这里创建文件夹,程序报错说Permission denied
解决问题的方式有四种:
(1) 设置执行的用户是root:HADOOP_USER_NAME = root(2) 通过Java的-D参数来设置:HADOOP_USER_NAME(3) 通过chmod的命令执行:hdfs dfs -chmod 777 /folder1(4)禁用HDFS的权限检查:dfs.permission = false
(1)先来介绍第一种方式,既然上传的用户是其它用户,那么把执行的用户设置为root用户自然也就有了写的权权力,就能够完成文件夹的创建,需要添加一行代码:System.setProperty("HADOOP_USER_NAME", "root");
输出结果如下,完美的解决问题
在上机操作中验证一下这个folder1是否创建成功(核实无误)
//java -Dp1=helloword TestDpublic class TestD{ public static void main(String[] args) { method1(); } public static void method1() { //在这里获取命令行参数 String value = System.getProperty("p1"); System.out.println(value); }}
书写完毕后进行保存,然后进行编译,最后在命令行上执行上面注释掉的指令,可以发现最后直接输出了p1对应的值,这里就相当于把HelloWord传递到String value = System.getProperty("p1")中了,可以发现利用这种方式本质上也是和第一种方式的实现原理一样,都是设置用户为root
然后就开始解决一下问题,将原来的函数复制一份重命名为test3,将之前添加的那行代码进行删除(注意为了显示出效果,创建的文件夹名称改为folder2),然后运行,这次是选择下面的一种方式
最后运行结果如下
然后上机核实一下文件目录是否有增多,可以发现确实增加了一个folder2的文件夹
(3) 通过chmod的命令执行,之前介绍过权限管理,这里把所有的权限都改为可读、可写、可执行,对应的指令码就为777,然后新建一个test4函数,在folder2文件夹下再创建一个folder3文件夹,运行程序后在xshell中查看文件信息如下(证明修改权限后,直接可以对文件进行写入操作了)
(4) 禁用HDFS的权限检查,之前在进行hdfs设置时hdfs-site.xml文件的时候有个权限检查的参数。先将启动的hdfs进行关闭,然后进入hdfs-site.xml文件进行参数修改
修改完成后再次运行test1函数,这个函数是最初的报错程序,再设置不进行权限检查后再次运行结果如下(为了对比出区别,把文件夹的名称这次随便修改为aaa),注意这里有一个小细节,如果是在hdfs刚刚启动就执行下面的程序,程序也是会报错,显示hdfs正在安全模式中,需要等待一会再运行就可以了
然后再上机操作中核实一下情况。注意看这里多出来的信息中正是test1创建的aaa文件,还有一个就是用户名就是使用本地的用户
至此使用Java API的方式操作HDFS的过程就全部梳理完毕
2 HDFS的原理解析
2.1 数据上传的过程
依然是在Eclipse中进行操作,然后新建一个TestUpLoad的Java Class,前面的部分还是一样保持不变,有差别的就是最后面的数据输入和输出流的创建
然后上机查看一下是否已经将文件进行上传(核实无误)
代码简化,关于上方Java代码的输入输出流,可以直接使用一个工具类进行简化,代码优化如下(另建一个test2的函数,尽量不修改原来的函数,然后把上传的文件名称修改一下)
然后再上机核实一下结果,可以发现folder1文件夹中比原来多了一个b.tag.gz的文件,说明上传无误
以下通过图示的方式介绍HDFS数据上传的过程和原理
2.2 数据下载的过程
既然前面使用了Java程序实现了本地文件的上传,那么同样可以进行文件的下载,还是以Java程序为例,新建一个Java Class文件为TestDownLoad。可以发现基本上是和上传的代码几乎一致,只修改了两行的代码,就是构建输出流和输入流的部分,然后桌面就生成了指定的文件
同样也是可以使用工具类进行简化代码,就是要注意工具类是来自于hadoop,然后桌面也生成了指定的文件
以下通过图示的方式介绍HDFS数据下载的过程和原理
2.3 使用Java API获取HDFS中的元信息
创建一个新的Java Class文件,命名为TestHDFS,比如要完成查找某个文件在HDFS中的DataNode位置、查看HDFS的数据节点、删除HDFS数据等
(1)查看文件位置,注意知道了数据的大小是超过一个数据块,所以得到的肯定是多个结果,所以使用列表进行存放,然后遍历输出每一个数据的信息
(2)查看HDFS的数据节点,这里使用的伪分布模式,最终输出的就是只有一台虚拟机的主机名,如果是全分布的模式,输出结果就会是多个主机,这里使用的是FileSystem的子类FileSystem的子类进行客户端的创建
(3)删除HDFS数据,也很简单,直接使用client.delete的命令,注意里面递归参数的使用
3 HDFS的高级特性
3.1 回收站
默认是关闭回收站功能,如果启用回收站,可以通过在core-site.xml中添加fs.trash.interval来打开幵配置时间阀值
删除文件时,其实是放入回收站/trash回收站里的文件可以快速恢复可以设置一个时间阈值,当回收站里文件的存放时间超过返个阈值,就被彻底删除,并且释放占用的数据块
上机实际操作如下,注意设置的时间是1440分钟,这个时间就是一天的时间
进行一个文件夹的删除,看看系统反馈的结果如何(注意对比之前删除的系统反馈)
如果要进行数据恢复,直接进行mv/cp即可,代码指令:hdfs dfs -mv /user/root/.Trash/Current/aaa *** ,最后面的***代表要恢复的文件路径
3.2 配额Quota
3.2.1 名称配额
名称配额:规定的是某个HDFS目录下文件的个数,
比如:设置名称配额是N,表示只能在该目录下存放N-1个文件或者目录(因为创建的这个目录也算是文件)
hdfs dfsadmin [-setQuota …]hdfs dfsadmin [-clrQuota …]
举例: hdfs dfs -mkdir /t1 设置该目录的名称配额是3 hdfs dfsadmin -setQuota 3 /t1
上机实例如下,如果超过名称配额之后就会进行报错
3.2.2 空间配额
空间配额:规定的是某个HDFS目录下文件的大小
比如:设置某个HDFS目录的空间配额是200M,只能存放200M以下的文件
hdfs dfsadmin [-setSpaceQuota [-storageType ] …]hdfs dfsadmin [-clrSpaceQuota [-storageType ] …]
举例: hdfs dfs -mkdir /t2 设置该目录的空间配额是1M (逻辑单位) hdfs dfsadmin -setSpaceQuota 1M /t2
尝试把a.xml文件上传至t2,结果核心报错如下,说明虽然文件的实际内存没有1m,但是实际上使用了128m(说明在传输和处理的时候不到128m的文件,最后也是一128m的数据块进行处理)
3.3 快照Snapshot
一个snapshot(快照)是一个全部文件系统、或者某个目录在某一时刻的镜像(本质:就是cp命令),作用如下:
防止用户的错误操作备份试验/测试灾难恢复
开启快照 hdfs dfsadmin -allowSnapshot /input创建快照(备份) hdfs dfs -createSnapshot /input backup_input_01往/input目录再存放一个文件,创建快照 hdfs dfs -put a.xml /input hdfs dfs -createSnapshot /input
最后上机实操,进行快照之后,会提示里快照保存的地址,然后我们查看一下地址就可以知道快照的信息了
然后可以通过指令:hdfs lsSnapshottableDir 查看是否有快照的文件信息
还有一个实用的操作就是对比快照的差异,通过这种方式,就可以知道对比的两个文件信息之间的差异性,操作如下:hdfs snapshotDiff /input backup_input_01 backup_input_02,结果说明第二个备份比第一个备份中多出来一个a.xml文件
3.4 安全模式与权限管理
安全模式是hadoop的一种保护机制,用于保证集群中的数据块的安全性。如果HDFS处于安全模式,则表示HDFS是只读状态(之前的操作中也是有遇到过)。
当集群启动的时候,会首先进入安全模式。当系统处于安全模式时会检查数据块的完整性。假设我们设置的副本数(即参数dfs.replication,冗余度)是5,那么在datanode上就应该有5个副本存在,假设只存在3个副本,那么比例就是3/5=0.6。在配置文件hdfs-default.xml中定义了一个最小的副本的副本率0.999。我们的副本率0.6明显小于0.99,因此系统会自动的水平复制副本到其他的dataNode,使得副本率不小于0.999.如果系统中有8个副本,超过我们设定的5个副本,那么系统也会删除多余的3个副本。关于安全模式相关的超过可以查看之前的介绍,这里就进行回顾一下
HDFS的权限管理和Linux的权限管理是一致的,实操如下,就不再进行赘述了
3.5 HDFS的集群
集群的两大功能:
(1)负载均衡 (一个人默默扛下来所有,时间久了也会累,再找一个伴)(2)失败迁移,就是实现HA(给一个备用节点,随时待命)
针对两个功能实现的方式分别为:联盟和HA(注意其中的NameNode的状态),只有HDFS才有联盟,之前介绍的其它主从架构的都没有,HA的话主从架构的都有。
然后就是ZooKeeper的介绍:是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等
4 HDFS的底层原理
4.1 Java的代理对象Proxy
注意在前面的数据上传过程中的第三步,特意进行标红,“建立RPC通信,得到NameNode的代理对象”,接下来就介绍一下代理对象的相关知识,RPC放在最后面进行介绍
使用代理对象的过程可以理解为购买火车票,火车票最终是由火车站(12306售出),但是可以使用其它的软件或者网站购买,这些软件或者网站就是代理对象,而且代理对象还可以增加一些原来没有的附加服务,比如增选座位靠窗、卧铺上中下、增值餐饮服务等。
实战操作,还是使用Eclipse,新建一个proxy的package,然后创建一个MyService的接口
接口文件里面输入两个实例的方法:method1和method2,然后在创建一个Java Class来实现接口的类
该文件中的信息如下,为了更好地展示调用了哪个方法,在每个方法中都输出对应的方法名称
最后在创建一个实现的Java Class来运行,结果可以发现接口中的两个方法均可正常运行,最后输出打印了对应方法中的内容
然后就有了需求,对于method2中的功能我觉得可以在完善,就要基于此接口的上丰富我想要的功能(在不修改源码的基础上,对method2进行重写)
代理对象实现的类,通过查找Java API文档可以发现,使用的是newProxyInstance(ClassLoader loader, Class>[] interfaces, InvocationHandler h)
4.2 RPC协议
Remote Procedure Call,远程过程调用。也就是说,调用过程代码并不是在调用者本地运行,而是要实现调用者与被调用者二地之间的连接与通信。
RPC的基本通信模型是基于Client/Server进程间相互通信模型的一种同步通信形式;它对Client提供了远程服务的过程抽象,其底层消息传递操作对Client是透明的。
在RPC中,Client即是请求服务的调用者(Caller),而Server则是执行Client的请求而被调用的程序 (Callee)。
具体的流程如下,开发时候,首要HDFS会有自己的接口(12306买火车票),然后我们会基于此创建自己的业务接口,然后再创建一个类实现这个接口。这里面有一个问题:既然是开发接口,就可以有很多的类来实现这个业务,所以为了明确指定由哪个类实现这个接口,就要指定一个签名的信息(比如2号类来实现),然后就和业务进行绑定,从而提高效率。最后就是客户端开发程序实现这个过程
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~