hadoop(一HDFS)

hadoop(一HDFS)


介绍

狭义上来说:

hadoop指的是以下的三大系统:

  • HDFS :分布式文件系统(高吞吐,没有延时要求,容错性,扩展能力)
  • MapReduce : 分布式计算系统
  • Yarn:分布式样集群资源管理

但是hadoop可不止这三个系统

广义上来说:

hadoop指的是大数据的一个生态圈


架构模型

1.X版本的架构

NameNode:集群的主节点,主要是管理集群中的各种元数据()

secondaryNameNode:主节点的辅助管理,主节点宕机后无法代替它(SecondaryNameNode 定期合并 fsimage 和 edits, 把 edits 控制在一个范围内 )

DataNode:从节点,主要用于存储集群中的各种数据



JobTracker:主节点,接收用户的计算请求,并分配给从节点

TaskTracker:负责执行主节点JobTracker分配的任务



2.x的版本架构模型

数据计算核心模块: 
ResourceManager:接收用户的计算请求任务,并负责集群的资源分配 
NodeManager:负责执行主节点APPmaster分配的任务



高可用的实现

文件管理系统多了JournalNode,目的是为了实现NameNode里面元数据的同步,当其中一个宕机,另外一个能完美代替它

多了一个备份节点,让Zookeeper来管理实现高可用


配置的作用

  1. cd /export/servers/hadoop-2.7.5/etc/hadoop
  2. vim core-site.xml
  1. <configuration>
  2. <property>
  3. <name>fs.default.name</name>
  4. <value>hdfs://node01:8020</value>
  5. </property>
  6. <property>
  7. <name>hadoop.tmp.dir</name>
  8. <value>/export/servers/hadoop-2.7.5/hadoopDatas/tempDatas</value>
  9. </property>
  10. <!-- 缓冲区大小,实际工作中根据服务器性能动态调整 -->
  11. <property>
  12. <name>io.file.buffer.size</name>
  13. <value>4096</value>
  14. </property>
  15. <!-- 开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 -->
  16. <property>
  17. <name>fs.trash.interval</name>
  18. <value>10080</value>
  19. </property>
  20. </configuration>

  1. cd /export/servers/hadoop-2.7.5/etc/hadoop
  2. vim hdfs-site.xml
  1. <configuration>
  2. <property>
  3. <name>dfs.namenode.secondary.http-address</name>
  4. <value>node01:50090</value>
  5. </property>
  6. <property>
  7. <name>dfs.namenode.http-address</name>
  8. <value>node01:50070</value>
  9. </property>
  10. <property>
  11. <name>dfs.namenode.name.dir</name>
  12. <value>file:///export/servers/hadoop-2.7.5/hadoopDatas/namenodeDatas,file:///export/servers/hadoop-
  13. 2.7.5/hadoopDatas/namenodeDatas2</value>
  14. </property>
  15. <!-- 定义dataNode数据存储的节点位置,实际工作中,一般先确定磁盘的挂载目录,然后
  16. 多个目录用,进行分割 -->
  17. <property>
  18. <name>dfs.datanode.data.dir</name>
  19. <value>file:///export/servers/hadoop-
  20. 2.7.5/hadoopDatas/datanodeDatas,file:///export/servers/hadoop-
  21. 2.7.5/hadoopDatas/datanodeDatas2</value>
  22. </property>
  23. <property>
  24. <name>dfs.namenode.edits.dir</name>
  25. <value>file:///export/servers/hadoop-
  26. 2.7.5/hadoopDatas/nn/edits</value>
  27. </property>
  28. <property>
  29. <name>dfs.namenode.checkpoint.dir</name>
  30. <value>file:///export/servers/hadoop-
  31. 2.7.5/hadoopDatas/snn/name</value>
  32. </property>
  33. <property>
  34. <name>dfs.namenode.checkpoint.edits.dir</name>
  35. <value>file:///export/servers/hadoop-
  36. 2.7.5/hadoopDatas/dfs/snn/edits</value>
  37. </property>
  38. <property>
  39. <name>dfs.replication</name>
  40. <value>3</value>
  41. </property>
  42. <property>
  43. <name>dfs.permissions</name>
  44. <value>false</value>
  45. </property>
  46. <property>
  47. <name>dfs.blocksize</name>
  48. <value>134217728</value>
  49. </property>
  50. </configuration>

HDFS 的架构

HDFS由四部分组成,HDFS Client、NameNod e、DataNode和Secondary NameNode

1、Client:就是客户端。 
文件切分。文件上传 HDFS 的时候,Client 将文件切分成 一个一个的Block,然后进行存储。 
与 NameNode 交互,获取文件的位置信息。 
与 DataNode 交互,读取或者写入数据。 
Client 提供一些命令来管理 和访问HDFS,比如启动或者关闭HDFS。 
2NameNode:就是 master,它是一个主管、管理者。

​ 管理 HDFS 的名称空间 
​ 管理数据块(Block)映射信息 
​ 配置副本策略 
​ 处理客户端读写请求。 
3DataNode:就是SlaveNameNode 下达命令,DataNode 执行实际的操作。

​ 存储实际的数据块。 
​ 执行数据块的读/写操作。 
4Secondary NameNode:并非 NameNode 的热备。当NameNode 挂掉的时候,它并不能马上替换 NameNode 并提供服务。

​ 辅助 NameNode,分担其工作量。 
​ 定期合并 fsimage和fsedits,并推送给NameNode。 
​ 在紧急情况下,可辅助恢复 NameNode。



NameNode作用 :

1、NameNode元数据信息 文件名,文件目录结构,文件属性(生成时间,副本数,权限)每个 
文件的块列表。 以及列表中的块与块所在的DataNode之间的地址映射关系 在内存中加载文件 
系统中每个文件和每个数据块的引用关系(文件、block、datanode之间的映射信息) 数据会定 
期保存到本地磁盘(fsImage文件和edits文件) 
2、NameNode文件操作 NameNode负责文件元数据的操作 DataNode负责处理文件内容的读写 
请求,数据流不经过NameNode,会询问它跟那个DataNode联系 
3、NameNode副本 文件数据块到底存放到哪些DataNode上,是由NameNode决定的,NN根 
据全局情况做出放置副本的决定 
4、NameNode心跳机制 全权管理数据块的复制,周期性的接受心跳和块的状态报告信息(包 
含该DataNode上所有数据块的列表) 若接受到心跳信息,NameNode认为DataNode工作正 
常,如果在10分钟后还接受到不到DN的心跳,那么NameNode认为DataNode已经宕机 ,这时候 
NN准备要把DN上的数据块进行重新的复制。 块的状态报告包含了一个DN上所有数据块的列 
表,blocks report 每个1小时发送一次.



DataNode作用 
提供真实文件数据的存储服务。 
1、Data Node以数据块的形式存储HDFS文件 
2、Data Node 响应HDFS 客户端读写请求 
3、Data Node 周期性向NameNode汇报心跳信息 
4、Data Node 周期性向NameNode汇报数据块信息 
5、Data Node 周期性向NameNode汇报缓存数据块信息



HDFS 文件副本机制 
所有的文件都是以 block 块的方式存放在 HDFS 文件系统当中,作用如下

  1. 一个文件有可能大于集群中任意一个磁盘,引入块机制,可以很好的解决这个问题
  2. 使用块作为文件存储的逻辑单位可以简化存储子系统
  3. 块非常适合用于数据备份进而提供数据容错能力

机架感知 
HDFS分布式文件系统的内部有一个副本存放策略:以默认的副本数=3为例: 
1、第一个副本块存本机

2、第二个副本块存跟本机同机架内的其他服务器节点

3、第三个副本块存不同机架的一个服务器节点上


HDFS 的元数据辅助管理

当 Hadoop 的集群当中, NameNode的所有元数据信息都保存在了 FsImage 与 Eidts 文件当中,这两个文件就记录了所有的数据的元数据信息, 元数据信息的保存目录配置在了 hdfssite.xml 当中

  1. <property>
  2. <name>dfs.namenode.name.dir</name>
  3. <value>
  4. file:///export/servers/hadoop2.7.5/hadoopDatas/namenodeDatas,
  5. file:///export/servers/hadoop-
  6. 2.7.5/hadoopDatas/namenodeDatas2
  7. </value>
  8. </property>
  9. <property>
  10. <name>dfs.namenode.edits.dir</name>
  11. <value>file:///export/servers/hadoop-
  12. 2.7.5/hadoopDatas/nn/edits</value
  13. </property>>

11.1 FsImage 和 Edits 详解

edits

  • edits 存放了客户端最近一段时间的操作日志
  • 客户端对 HDFS 进行写文件时会首先被记录在 edits 文件中
  • edits 修改时元数据也会更新

fsimage

  • NameNode 中关于元数据的镜像, 一般称为检查点, fsimage 存放了一份比较完整的元数据信息
  • 因为 fsimage 是 NameNode 的完整的镜像, 如果每次都加载到内存生成树状拓扑结构,这是非常耗内存和CPU, 所以一般开始时对 NameNode 的操作都放在 edits 中
  • fsimage 内容包含了 NameNode 管理下的所有 DataNode 文件及文件 block 及 block所在的 DataNode 的元数据信息
  • .随着 edits 内容增大, 就需要在一定时间点和 fsimage 合并

11.4 SecondaryNameNode 如何辅助管理 fsimage 与 edits 文件?

SecondaryNameNode 定期合并 fsimage 和 edits, 把 edits 控制在一个范围内

配置 SecondaryNameNode

SecondaryNameNode 在 conf/masters 中指定

在 masters 指定的机器上, 修改 hdfs-site.xml

  1. <property>
  2. <name>dfs.http.address</name>
  3. <value>host:50070</value>
  4. </property>

修改 core-site.xml , 这一步不做配置保持默认也可以

  1. <!-- 多久记录一次 HDFS 镜像, 默认 1小时 -->
  2. <property>
  3. <name>fs.checkpoint.period</name>
  4. <value>3600</value>
  5. </property>
  6. <!-- 一次记录多大, 默认 64M -->
  7. <property>
  8. <name>fs.checkpoint.size</name>
  9. <value>67108864</value>
  10. </property>
  • SecondaryNameNode 通知 NameNode 切换 editlog
  • SecondaryNameNode 从 NameNode 中获得 fsimage 和 editlog(通过http方式)
  • SecondaryNameNode 将 fsimage 载入内存, 然后开始合并 editlog, 合并之后成为新的fsimage
  • SecondaryNameNode 将新的 fsimage 发回给 NameNode
  • NameNode 用新的 fsimage 替换旧的 fsimage

HDFS---API常规操作

常用Maven依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.apache.hadoop</groupId>
  4. <artifactId>hadoop-common</artifactId>
  5. <version>2.7.5</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.hadoop</groupId>
  9. <artifactId>hadoop-client</artifactId>
  10. <version>2.7.5</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.apache.hadoop</groupId>
  14. <artifactId>hadoop-hdfs</artifactId>
  15. <version>2.7.5</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.apache.hadoop</groupId>
  19. <artifactId>hadoop-mapreduce-client-core</artifactId>
  20. <version>2.7.5</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>junit</groupId>
  24. <artifactId>junit</artifactId>
  25. <version>RELEASE</version>
  26. </dependency>
  27. </dependencies>
  28. <build>
  29. <plugins>
  30. <plugin>
  31. <groupId>org.apache.maven.plugins</groupId>
  32. <artifactId>maven-compiler-plugin</artifactId>
  33. <version>3.1</version>
  34. <configuration>
  35. <source>1.8</source>
  36. <target>1.8</target>
  37. <encoding>UTF-8</encoding>
  38. <!-- <verbal>true</verbal>-->
  39. </configuration>
  40. </plugin>
  41. <plugin>
  42. <groupId>org.apache.maven.plugins</groupId>
  43. <artifactId>maven-shade-plugin</artifactId>
  44. <version>2.4.3</version>
  45. <executions>
  46. <execution>
  47. <phase>package</phase>
  48. <goals>
  49. <goal>shade</goal>
  50. </goals>
  51. <configuration>
  52. <minimizeJar>true</minimizeJar>
  53. </configuration>
  54. </execution>
  55. </executions>
  56. </plugin>
  57. </plugins>
  58. </build>

获取 FileSystem

  1. @Test
  2. public void getFileSystem2() throws URISyntaxException, IOException {
  3. FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
  4. System.out.println(fileSystem);
  5. }

hdfs文件的遍历

  1. /*
  2. hdfs文件的遍历
  3. */
  4. @Test
  5. public void listFiles() throws URISyntaxException, IOException {
  6. //1:获取FileSystem实例
  7. FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
  8. //2:调用方法listFiles 获取 /目录下所有的文件信息
  9. RemoteIterator<LocatedFileStatus> iterator = fileSystem.listFiles(new Path("/"), true);
  10. //3:遍历迭代器
  11. while (iterator.hasNext()){
  12. LocatedFileStatus fileStatus = iterator.next();
  13. //获取文件的绝对路径 : hdfs://node01:8020/xxx
  14. System.out.println(fileStatus.getPath() + "----" +fileStatus.getPath().getName());
  15. //文件的block信息
  16. BlockLocation[] blockLocations = fileStatus.getBlockLocations();
  17. System.out.println("block数:"+blockLocations.length);
  18. }
  19. }

hdfs创建文件夹

  1. /*
  2. hdfs创建文件夹
  3. */
  4. @Test
  5. public void mkdirsTest() throws URISyntaxException, IOException {
  6. //1:获取FileSystem实例
  7. FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
  8. //2:创建文件夹
  9. //boolean bl = fileSystem.mkdirs(new Path("/aaa/bbb/ccc"));
  10. fileSystem.create(new Path("/aaa/bbb/ccc/a.txt"));
  11. fileSystem.create(new Path("/aaa2/bbb/ccc/a.txt"));
  12. //System.out.println(bl);
  13. //3: 关闭FileSystem
  14. //fileSystem.close();
  15. }

实现文件的下载

  1. /*
  2. 实现文件的下载
  3. */
  4. @Test
  5. public void downloadFile2() throws URISyntaxException, IOException, InterruptedException {
  6. //1:获取FileSystem
  7. FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration(),"root");
  8. //2:调用方法,实现文件的下载
  9. fileSystem.copyToLocalFile(new Path("/a.txt"), new Path("D://a4.txt"));
  10. //3:关闭FileSystem
  11. fileSystem.close();
  12. }

文件的上传

  1. /*
  2. 文件的上传
  3. */
  4. @Test
  5. public void uploadFile() throws URISyntaxException, IOException {
  6. //1:获取FileSystem
  7. FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
  8. //2:调用方法,实现上传
  9. fileSystem.copyFromLocalFile(new Path("D://set.xml"), new Path("/"));
  10. //3:关闭FileSystem
  11. fileSystem.close();
  12. }

小文件的合并

  1. /*
  2. 小文件的合并
  3. */
  4. @Test
  5. public void mergeFile() throws URISyntaxException, IOException, InterruptedException {
  6. //1:获取FileSystem(分布式文件系统)
  7. FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration(),"root");
  8. //2:获取hdfs大文件的输出流
  9. FSDataOutputStream outputStream = fileSystem.create(new Path("/big_txt.txt"));
  10. //3:获取一个本地文件系统
  11. LocalFileSystem localFileSystem = FileSystem.getLocal(new Configuration());
  12. //4:获取本地文件夹下所有文件的详情
  13. FileStatus[] fileStatuses = localFileSystem.listStatus(new Path("D:\\input"));
  14. //5:遍历每个文件,获取每个文件的输入流
  15. for (FileStatus fileStatus : fileStatuses) {
  16. FSDataInputStream inputStream = localFileSystem.open(fileStatus.getPath());
  17. //6:将小文件的数据复制到大文件
  18. IOUtils.copy(inputStream, outputStream);
  19. IOUtils.closeQuietly(inputStream);
  20. }
  21. //7:关闭流
  22. IOUtils.closeQuietly(outputStream);
  23. localFileSystem.close();
  24. fileSystem.close();
  25. }

原文地址:https://www.cnblogs.com/leccoo/p/11337381.html

时间: 2024-08-26 22:24:36

hadoop(一HDFS)的相关文章

hadoop之 HDFS fs 命令总结

版本:Hadoop 2.7.4 -- 查看hadoop fs帮助信息[[email protected] sbin]# hadoop fsUsage: hadoop fs [generic options][-appendToFile <localsrc> ... <dst>][-cat [-ignoreCrc] <src> ...][-checksum <src> ...][-chgrp [-R] GROUP PATH...][-chmod [-R] &l

Hadoop之HDFS原理及文件上传下载源码分析(下)

上篇Hadoop之HDFS原理及文件上传下载源码分析(上)楼主主要介绍了hdfs原理及FileSystem的初始化源码解析, Client如何与NameNode建立RPC通信.本篇将继续介绍hdfs文件上传.下载源解析. 文件上传 先上文件上传的方法调用过程时序图: 其主要执行过程: FileSystem初始化,Client拿到NameNodeRpcServer代理对象,建立与NameNode的RPC通信(楼主上篇已经介绍过了) 调用FileSystem的create()方法,由于实现类为Dis

Hadoop之HDFS

摘要:HDFS是Hadoop的核心模块之一,围绕HDFS是什么.HDFS的设计思想和HDFS的体系结构三方面来介绍. 关键词:Hadoop  HDFS   分布式存储系统 HDFS是Hadoop的核心模块之一,HDFS是什么?它是Hadoop分布式文件系统(Hadoop Distributed File System),摘录Apache 组织关于HDFS的介绍"The Hadoop Distributed File System (HDFS) is a distributed file syst

Hadoop之HDFS文件操作

摘要:Hadoop之HDFS文件操作常有两种方式,命令行方式和JavaAPI方式.本文介绍如何利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件    命令行     Java API HDFS是一种分布式文件系统,为MapReduce这种框架下的海量数据分布式处理而设计. Hadoop之HDFS文件操作常有两种方式,一种是命令行方式,即Hadoop提供了一套与Linux文件命令类似的命令行工具:另一种是JavaAPI,即利用Hadoop的Java库,采用编程的方式操作HDFS的文件.

hadoop和hdfs环境搭建

参考链接:http://blog.csdn.net/zolalad/article/details/11470449 环境:ubuntu14.04 hadoop1.0.1 下面以3台机器为例,讲解安装过程 1) 准备3台机器,一台作为nameNode,命名为master,两台作为dataNode,命名为slave01, slave02.强调命名是为了方便管理,其实命名无所谓.如果已命名为其它名称,可通过编辑/etc/hostname进行更改. 2) 为所有主从节点配置静态ip,因为主从节点间需要

Hadoop之——HDFS

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45849029 Hadoop 主要由HDFS和MapReduce 引擎两部分组成.最底部是HDFS,它存储Hadoop 集群中所有存储节点上的文件.HDFS 的上一层是MapReduce 引擎,该引擎由JobTrackers 和TaskTrackers组成.  一.HDFS基本概念    1.数据块 HDFS默认的最基本的存储单位是64M的数据块,这个数据块可以理解和一般的文件里面

浅谈Hadoop下HDFS文件系统

Hadoop下HDFS文件系统 在这里我们对Hadoop的基本概念,历史功能就不做过多的阐述,重点在对于他的文件系统做一些了解和阐述. HDFS(Hadoop distributed file system)是一个分布式文件系统.具有高容错性(fault-tolerant),使得他能够部署在低廉的硬件上.他可以提供高吞吐率来访问应用程序的数据.HDFS放宽了可移植操作系统接口的要求.这样就可以实现以流式的形式来访问文件系统的数据. HDFS的设计目标: 检测和快速回复硬件故障 流式的数据访问 简

【Hadoop】HDFS - 创建文件流程详解

1.本文目的 通过解析客户端创建文件流程,认知hadoop的HDFS系统的一些功能和概念. 2.主要概念 2.1 NameNode(NN): HDFS系统核心组件,负责分布式文件系统的名字空间管理.INode表的文件映射管理.如果不开启备份/故障恢复/Federation模式,一般的HDFS系统就只有1个NameNode,当然这样是存在单点故障隐患的. NN管理两个核心的表:文件到块序列的映射.块到机器序列的映射. 第一个表存储在磁盘中,第二表在NN每次启动后重建. 2.2 NameNodeSe

hadoop学习;hdfs操作;运行抛出权限异常: Permission denied;api查看源码方法;源码不停的向里循环;抽象类通过debug查找源码

eclipse快捷键alt+shift+m将选中的代码封装成方法:alt+shift+l将选中的代码添加对应类型放回参数 当调用一个陌生方法时,进入源码不停的向里循环,当找不到return类似方法的时候,可以看到最原始的方法 package com.kane.hdfs; import java.io.InputStream; import java.net.URL; import org.apache.hadoop.fs.FsUrlStreamHandlerFactory; import org

介绍hadoop中的hadoop和hdfs命令

有些hive安装文档提到了hdfs dfs -mkdir ,也就是说hdfs也是可以用的,但在2.8.0中已经不那么处理了,之所以还可以使用,是为了向下兼容. 本文简要介绍一下有关的命令,以便对hadoop的命令有一个大概的影响,并在想使用的时候能够知道从哪里可以获得帮助. 概述 在$HADOOP_HOME/bin下可以看到hadoop和hdfs的脚本. hdfs的相当一部分的功能可以使用hdoop来替代(目前),但hdfs有自己的一些独有的功能.hadoop主要面向更广泛复杂的功能. 本文介绍