赞
踩
Hadoop-HDFS总结
目录
- <dependencies>
- <dependency>
- <groupId>org.apache.hadoop</groupId>
- <artifactId>hadoop-client</artifactId>
- <version>3.1.3</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>1.7.30</version>
- </dependency>
- </dependencies>

在项目的src/main/resources目录下,新建一个文件,命名为“log4j.properties”,在文件中填入
- log4j.rootLogger=INFO, stdout
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
- log4j.appender.logfile=org.apache.log4j.FileAppender
- log4j.appender.logfile.File=target/spring.log
- log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
- log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
;
在java包下创建包名:hads(前置准备工作已经准备好了)
在hdfs包下创建一个类:HdfsClient 实现文件的上传、下载、更名、删除……
- @Before
- //因为一般前面和最后的步骤一样,可以封装起来
- public void init() throws URISyntaxException, IOException, InterruptedException {
- //连接的集群地址
- URI uri = new URI("hdfs://hadoop102:8020");
- //创建一个配置文件
- Configuration configuration = new Configuration();
- //修改对应的副本数
- configuration.set("dfs.replication", "2");
- //不是对应的用户会报权限不够的错误
- String user = "nancheng";
- //1.获取到客户端对象
- fs = FileSystem.get(uri, configuration, user);
- }
-
- @After
- public void close() throws IOException {
- //3.关闭资源
- fs.close();
- }
-
- /*
- 创建目录
- */
- @Test
- public void testmkdir() throws URISyntaxException, IOException, InterruptedException {
-
- //2.创建一个文件夹
- fs.mkdirs(new Path("/xiyou1"));
- }
-
- /*
- 上传
- */
- @Test
- public void testPut() throws IOException {
- //参数解读:参数1:表示是否删除原数据;参数2:是否允许覆盖;参数3:原数据路径;参数4:目的地路径
- fs.copyFromLocalFile(false, true, new Path("D:\\Hadoopruanjian\\lanxi\\新建文本文档.txt"), new Path("hdfs://hadoop102/lianxi"));
- }
-
- //文件的下载
- @Test
- public void testGet() throws IOException {
- //参数的解读,参数1,源文件是否删除;参数二,源文件的路径;参数三,目标地址的路径;参数四
- //fs.copyToLocalFile(false, new Path("hdfs://hadoop102/xiyou/huaguoshan1/sunwukong.txt"), new Path("D:\\Hadoopruanjian\\lanxi\\下载\\"), true);
- fs.copyToLocalFile(false, new Path("hdfs://hadoop102/lianxi"), new Path("D:\\Hadoopruanjian\\lanxi\\下载\\"), false);
- }
-
- //文件的删除
- @Test
- public void testRe() throws IOException {
- //参数解读:参数一,要删除的路径,参数二,是否递归删除
- //删除文件
- //fs.delete(new Path("/xiyou/huaguoshan1/sunwukong.txt"),false);
- //删除空目录
- // fs.delete(new Path("/xiyou1"),false);
- //删除非空目录
- fs.delete(new Path("/xiyou1"), true);
- }
-
- //文件的更名与移动
- @Test
- public void testmv() throws IOException {
- //参数解读:参数一,源文件路径;参数二,目标文件路径
- // fs.rename(new Path("/xiyou/huaguoshan1/suwukong.txt"),new Path("/xiyou/huaguoshan1/sunwukong.txt"));
- //文件的移动和更名
- // fs.rename(new Path("/xiyou/huaguoshan1/sunwukong.txt"),new Path("/qitiandashen.txt"));
- //文件目录的更名
- fs.rename(new Path("/xiyou"), new Path("/wukongjia"));
- }
-
- //获取文件详情
- @Test
- public void fileDetall() throws IOException {
- //获取文件信息
- RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
- //遍历文件
- while (listFiles.hasNext()) {
- LocatedFileStatus fileStatus = listFiles.next();
-
- System.out.println("**************" + fileStatus.getPath() + "**************");
- System.out.println(fileStatus.getPermission());
- System.out.println(fileStatus.getOwner());
- System.out.println(fileStatus.getGroup());
- System.out.println(fileStatus.getLen());
- System.out.println(fileStatus.getModificationTime());
- System.out.println(fileStatus.getReplication());
- System.out.println(fileStatus.getBlockSize());
- System.out.println(fileStatus.getPath().getName());
-
- //获取块信息
- BlockLocation[] blockLocations = fileStatus.getBlockLocations();
- System.out.println(Arrays.toString(blockLocations));
-
-
-
- }
- }
- //判断是文件夹是文件
- @Test
- public void testFile() throws IOException {
- FileStatus[] listStatus = fs.listStatus(new Path("/"));
-
- for (FileStatus status : listStatus) {
- if (status.isFile()) {
- System.out.println("文件:"+status.getPath().getName());
- }else {
- System.out.println("目录:"+status.getPath().getName());
- }
-
- }
- }

HDFS文件写入流程:
(图片来自尚硅谷) 、
网络拓扑-节点距离:两个节点到达最近的共同祖先的距离总和。
机架感知(副本存储节点选择)
HDFS读数据流程:
HDFS读数据流程
(图片来自尚硅谷)
数据存储在内存:好处:计算快 坏处:可靠性差 磁盘:好处:可靠性高 坏处:计算慢 内存+磁盘->效率底 fslmage 存储数据(如果是随机读写效率a=10 a+10->a=20) Edits 追加->
Namenode:HDFS的守护进程,用来管理文件系统的命名空间,负责记录文件是如何分割成数据块的,以及这些数据块分别被存储到那些数据节点上,它的主要功能是对内存及IO进行集中管理
Secondary Namenode :辅助后台程序,与Namenode进行通信,以便定期保存HDFS元数据的快照,用以备份和恢复数据。
HDFS-API-Fsimage和Edits解析
(图片来自尚硅谷)
一、oiv查看Fsimage文件
- [atguigu@hadoop102 current]$ hdfs
- oiv apply the offline fsimage viewer to an fsimage
- oev apply the offline edits viewer to an edits file
;
基本语法
hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径
;
下载到win电脑
在win系统中查看
二、oev查看Edits文件
基本语法
hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径
1)第一阶段:NameNode启动
(1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
(2)客户端对元数据进行增删改的请求。
(3)NameNode记录操作日志,更新滚动日志。
(4)NameNode在内存中对元数据进行增删改。
2)第二阶段:Secondary NameNode工作
(1)Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。
(2)Secondary NameNode请求执行CheckPoint。
(3)NameNode滚动正在写的Edits日志。
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件fsimage.chkpoint。
(7)拷贝fsimage.chkpoint到NameNode。
(8)NameNode将fsimage.chkpoint重新命名成fsimage。
- <property>
- <name>dfs.namenode.heartbeat.recheck-interval</name>
- <value>300000</value>
- </property>
-
- <property>
- <name>dfs.heartbeat.interval</name>
- <value>3</value>
- </property>
;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。