1.简介

Hadoop是一款开源的大数据通用处理平台,其提供了分布式存储和分布式离线计算,适合大规模数据、流式数据(写一次,读多次),不适合低延时的访问、大量的小文件以及频繁修改的文件。

*Hadoop由HDFS、YARN、MapReduce组成。

Hadoop的特点:

1.高扩展(动态扩容):能够存储和处理千兆字节数据(PB),能够动态的增加和卸载节点,提升存储能力(能够达到上千个节点)

2.低成本:只需要普通的PC机就能实现,不依赖高端存储设备和服务器。

3.高效率:通过在Hadoop集群中分化数据并行处理,使得处理速度非常快。

4.可靠性:数据有多份副本,并且在任务失败后能自动重新部署。

Hadoop的使用场景:

1.日志分析,将数据分片并行计算处理。

2.基于海量数据的在线应用。

3.推荐系统,精准营销。

4.搜索引擎。

Hadoop生态圈:

Hive:利用Hive可以不需要编写复杂的Hadoop程序,只需要写一个SQL语句,Hive就会把SQL语句转换成Hadoop的任务去执行,降低使用Hadoop离线计算的门槛。

HBase:海量数据存储的非关系型数据库,单个表中的数据能够容纳百亿行x百万列。

ZooKeeper:监控Hadoop集群中每个节点的状态,管理整个集群的配置,维护节点间数据的一致性。

Flume:海量日志采集系统。

2.内部结构

2.1 HDFS

HDFS是分布式文件系统,存储海量的文件,其中HDFS中包含NameNode、DataNode、SecondaryNameNode组件等。

Block数据块

1.HDFS中基本的存储单元,1.X版本中每个Block默认是64M,2.X版本中每个Block默认是128M。

2.一个大文件会被拆分成多个Block进行存储,如果一个文件少于Block的大小,那么其实际占用的空间为文件自身大小。

3.每个Block都会在不同的DataNode节点中存在备份(默认备份数是3)

DataNode

1.保存具体的Blocks数据。

2.负责数据的读写操作和复制操作。

3.DataNode启动时会向NameNode汇报当前存储的数据块信息。

NameNode

1.存储文件的元信息和文件与Block、DataNode的关系,NameNode运行时所有数据都保存在内存中,因此整个HDFS可存储的文件数受限于NameNode的内存大小。

2.每个Block在NameNode中都对应一条记录,如果是大量的小文件将会消耗大量内存,因此HDFS适合存储大文件。

3.NameNode中的数据会定时保存到本地磁盘中(只有元数据),但不保存文件与Block、DataNode的位置信息,这部分数据由DataNode启动时上报和运行时维护。

*NameNode不允许DataNode具有同一个Block的多个副本,所以创建的最大副本数量是当时DataNode的总数。

*DataNode会定期向NameNode发送心跳信息,一旦在一定时间内NameNode没有接收到DataNode发送的心跳则认为其已经宕机,因此不会再给它任何IO请求。

*如果DataNode失效造成副本数量下降并且低于预先设置的阈值或者动态增加副本数量,则NameNode会在合适的时机重新调度DataNode进行复制。

SecondaryNameNode

1.定时与NameNode进行同步,合并HDFS中系统镜像,定时替换NameNode中的镜像。

HDFS写入文件的流程

1.HDFS Client向NameNode申请写入文件。

2.NameNode根据文件大小,返回文件要写入的DataNode列表以及Block id (此时NameNode已存储文件的元信息、文件与DataNode、Block之间的关系)

3.HDFS Client收到响应后,将文件写入第一个DataNode中,第一个DataNode接收到数据后将其写入本地磁盘,同时把数据传递给第二个DataNode,直到写入备份数个DataNode。

4.每个DataNode接收完数据后都会向前一个DataNode返回写入成功的响应,最终第一个DataNode将返回HDFS Client客户端写入成功的响应。

5.当HDFS Client接收到整个DataNodes的确认请求后会向NameNode发送最终确认请求,此时NameNode才会提交文件。

*当写入某个DataNode失败时,数据会继续写入其他的DataNode,NameNode会重新寻找DataNode继续复制,以保证数据的可靠性。

*每个Block都会有一个校验码并存放在独立的文件中,以便读的时候来验证数据的完整性。

*文件写入完毕后,向NameNode发送确认请求,此时文件才可见,如果发送确认请求之前NameNode宕机,那么文件将会丢失,HDFS客户端无法进行读取。

HDFS读取文件的流程

1.HDFS Client向NameNode申请读取指定文件。

2.NameNode返回文件所有的Block以及这些Block所在的DataNodes中(包括复制节点)

3.HDFS Client根据NameNode的返回,优先从与HDFS Client同节点的DataNode中直接读取(若HDFS Client不在集群范围内则随机选择),如果从DataNode中读取失败则通过网络从复制节点中进行读取。

机架感知

分布式集群中通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群。

机架内的机器之间的网络速度通常都会高于跨机架机器之间的网络速度,并且机架之间机器的网络通信通常受到上层交换机间网络带宽的限制。

Hadoop默认没有开启机架感知功能,默认情况下每个Block都是随机分配DataNode,需要进行相关的配置,那么在NameNode启动时,会将机器与机架的对应信息保存在内存中,用于在HDFS Client申请写文件时,能够根据预先定义的机架关系合理的分配DataNode。

Hadoop机架感知默认对3个副本的存放策略为:

第1个Block副本存放在和HDFS Client所在的节点中(若HDFS Client不在集群范围内则随机选取)

第2个Block副本存放在与第一个节点不同机架下的节点中(随机选择)

第3个Block副本存放在与第2个副本所在节点的机架下的另一个节点中,如果还有更多的副本则随机存放在集群的节点中。

*使用此策略可以保证对文件的访问能够优先在本机架下找到,并且如果整个机架上发生了异常也可以在另外的机架上找到该Block的副本。

2.2 YARN

YARN是分布式资源调度框架(任务计算框架的资源调度框架),主要负责集群中的资源管理以及任务调度并且监控各个节点。

ResourceManager

1.是整个集群的资源管理者,管理并监控各个NodeManager。

2.处理客户端的任务请求。

3.启动和监控ApplicationMaster。

4.负责资源的分配以及调度。

NodeManager

1.是每个节点的管理者,负责任务的执行。

2.处理来自ResourceManager的命令。

3.处理来自ApplicationMaster的命令。

ApplicationMaster

1.数据切分,用于并行计算处理。

2.计算任务所需要的资源。

3.负责任务的监控与容错。

任务运行在YARN的流程

1.客户端提交任务请求到ResourceManager。

2.ResourceManager生成一个ApplicationManager进程,用于任务的管理。

3.ApplicationManager创建一个Container容器用于存放任务所需要的资源。

4.ApplicationManager寻找其中一个NodeManager,在此NodeManager中启动一个ApplicationMaster,用于任务的管理以及监控。

5.ApplicationMaster向ResourceManager进行注册,并计算任务所需的资源汇报给ResourceManager(CPU与内存)

6.ResourceManager为此任务分配资源,资源封装在Container容器中。

7.ApplicationMaster通知集群中相关的NodeManager进行任务的执行。

8.各个NodeManager从Container容器中获取资源并执行Map、Reduce任务。

2.3 MapReduce

MapReduce是分布式离线并行计算框架,高吞吐量,高延时,原理是将分析的数据拆分成多份,通过多台节点并行处理,相对于Storm、Spark任务计算框架而言,MapReduce是最早出现的计算框架。

MapReduce、Storm、Spark任务计算框架对比:

MapReduce执行流程

MapReduce将程序划分为Map任务以及Reduce任务两部分。

Map任务处理流程

1.读取文件中的内容,解析成Key-Value的形式 (Key为偏移量,Value为每行的数据)

2.重写map方法,编写业务逻辑,生成新的Key和Value。

3.对输出的Key、Value进行分区(Partitioner类)

4.对数据按照Key进行排序、分组,相同key的value放到一个集合中(数据汇总)

*处理的文件必须要在HDFS中。

Reduce任务处理流程

1.对多个Map任务的输出,按照不同的分区,通过网络复制到不同的reduce节点。

2.对多个Map任务的输出进行合并、排序。

3.将reduce的输出保存到文件,存放在HDFS中。

3.Hadoop的使用

3.1 安装

由于Hadoop使用Java语言进行编写,因此需要安装JDK。

CDH中下载Hadoop 2.X并进行解压,CDH是Cloudrea公司对各种开源框架的整合与优化(较稳定)

etc目录:Hadoop配置文件存放目录。

logs目录:Hadoop日志存放目录。

bin目录、sbin目录:Hadoop可执行命令存放目录。

etc目录

bin目录

sbin目录

3.2 Hadoop配置

1.配置环境

编辑etc/hadoop/hadoop-env.sh文件,修改JAVA_HOME配置项为本地JAVA的HOME目录,此文件是Hadoop启动时加载的环境变量。

编辑/etc/hosts文件,添加主机名与IP的映射关系。

2.配置Hadoop公共属性(core-site.xml)

  1. <configuration>
  2. <!-- Hadoop工作目录,用于存放Hadoop运行时产生的临时数据 -->
  3. <property>
  4. <name>hadoop.tmp.dir</name>
  5. <value>/usr/hadoop/hadoop-2.9.0/data</value>
  6. </property>
  7. <!-- NameNode的通信地址,1.x默认9000,2.x可以使用8020 -->
  8. <property>
  9. <name>fs.default.name</name>
  10. <value>hdfs://192.168.1.80:8020</value>
  11. </property>
  12. </configuration>

3.配置HDFS(hdfs-site.xml)

  1. <configuration>
  2. <!--指定block的副本数量(将block复制到集群中备份数-1个节点的DataNode中)-->
  3. <property>
  4. <name>dfs.replication</name>
  5. <value>1</value>
  6. </property>
  7. <!-- 关闭HDFS的访问权限 -->
  8. <property>
  9. <name>dfs.permissions.enabled</name>
  10. <value>false</value>
  11. </property>
  12. </configuration>

4.配置YARN(yarn-site.xml)

  1. <configuration>
  2. <!-- 配置Reduce取数据的方式是shuffle(随机) -->
  3. <property>
  4. <name>yarn.nodemanager.aux-services</name>
  5. <value>mapreduce_shuffle</value>
  6. </property>
  7. </configuration>

5.配置MapReduce(mapred-site.xml)

  1. <configuration>
  2. <!-- 让MapReduce任务使用YARN进行调度 -->
  3. <property>
  4. <name>mapreduce.framework.name</name>
  5. <value>yarn</value>
  6. </property>
  7. </configuration>

6.配置SSH

由于在启动hdfs、yarn时都需要对用户的身份进行验证,因此可以配置SSH设置免密码登录。

  1. //生成秘钥
    ssh-keygen -t rsa
  2.  
  3. //复制秘钥到本机
  4. ssh-copy-id 192.168.1.80

3.3 启动HDFS

1.格式化NameNode

2.启动HDFS,将会启动NameNode、DataNode、SecondaryNameNode三个进程,可以通过jps命令进行查看。

*若启动时出现错误,则可以进入logs目录查看相应的日志文件。

当HDFS启动完毕后,可以访问http://localhost:50070进入HDFS的可视化管理界面,可以在此页面中监控整个HDFS集群的状况并且进行文件的上传以及下载。

*进入HDFS监控页面下载文件时,会将请求重定向,重定向后的地址的主机名为NameNode的主机名,因此客户端本地的host文件中需要配置NameNode主机名与IP的映射关系。

3.4 启动YARN

启动YARN后,将会启动ResourceManager以及NodeManager进程,可以通过jps命令进行查看。

当YARN启动完毕后,可以访问http://localhost:8088进入YARN的可视化管理界面,可以在此页面中查看任务的执行情况以及资源的分配。

3.5 使用Shell命令操作HDFS

HDFS中的文件系统与Linux类似,由/代表根目录。

  1. hadoop fs -cat <src>:显示文件中的内容。
  2.  
  3. hadoop fs -copyFromLocal <localsrc> <dst>:将本地中的文件上传到HDFS
  4.  
  5. hadoop fs -copyToLocal <src> <localdst>:将HDFS中的文件下载到本地。
  6.  
  7. hadoop fs -count <path>:查询指定路径下文件的个数。
  8.  
  9. hadoop fs -cp <src> <dst>:在HDFS内对文件进行复制。
  10.  
  11. hadoop fs -get <src> <localdst>:将HDFS中的文件下载到本地。
  12.  
  13. hadoop fs -ls <path>:显示指定目录下的内容。
  14.  
  15. hadoop fs -mkdir <path>:创建目录。
  16.  
  17. hadoop fs -moveFromLocal <localsrc> <dst>:将本地中的文件剪切到HDFS中。
  18.  
  19. hadoop fs -moveToLocal <src> <localdst> :将HDFS中的文件剪切到本地中。
  20.  
  21. hadoop fs -mv <src> <dst> :在HDFS内对文件进行移动。
  22.  
  23. hadoop fs -put <localsrc> <dst>:将本地中的文件上传到HDFS
  24.  
  25. hadoop fs -rm <src>:删除HDFS中的文件。

3.6 JAVA中操作HDFS

  1. /**
  2. * @Auther: ZHUANGHAOTANG
  3. * @Date: 2018/11/6 11:49
  4. * @Description:
  5. */
  6. public class HDFSUtils {
  7.  
  8. private static Logger logger = LoggerFactory.getLogger(HDFSUtils.class);
  9.  
  10. /**
  11. * NameNode URL
  12. */
  13. private static final String NAMENODE_URL = "192.168.1.80:8020";
  14.  
  15. /**
  16. * HDFS文件系统连接对象
  17. */
  18. private static FileSystem fs = null;
  19.  
  20. static {
  21. Configuration conf = new Configuration();
  22. try {
  23. fs = FileSystem.get(URI.create(NAMENODE_URL), conf);
  24. } catch (IOException e) {
  25. logger.info("初始化HDFS连接失败:{}", e);
  26. }
  27. }
  28.  
  29. /**
  30. * 创建目录
  31. */
  32. public static void mkdir(String dir) throws Exception {
  33. dir = NAMENODE_URL + dir;
  34. if (!fs.exists(new Path(dir))) {
  35. fs.mkdirs(new Path(dir));
  36. }
  37. }
  38.  
  39. /**
  40. * 删除目录或文件
  41. */
  42. public static void delete(String dir) throws Exception {
  43. dir = NAMENODE_URL + dir;
  44. fs.delete(new Path(dir), true);
  45. }
  46.  
  47. /**
  48. * 遍历指定路径下的目录和文件
  49. */
  50. public static List<String> listAll(String dir) throws Exception {
  51. List<String> names = new ArrayList<>();
  52. dir = NAMENODE_URL + dir;
  53. FileStatus[] files = fs.listStatus(new Path(dir));
  54. for (FileStatus file : files) {
  55. if (file.isFile()) { //文件
  56. names.add(file.getPath().toString());
  57. } else if (file.isDirectory()) { //目录
  58. names.add(file.getPath().toString());
  59. } else if (file.isSymlink()) { //软或硬链接
  60. names.add(file.getPath().toString());
  61. }
  62. }
  63. return names;
  64. }
  65.  
  66. /**
  67. * 上传当前服务器的文件到HDFS中
  68. */
  69. public static void uploadLocalFileToHDFS(String localFile, String hdfsFile) throws Exception {
  70. hdfsFile = NAMENODE_URL + hdfsFile;
  71. Path src = new Path(localFile);
  72. Path dst = new Path(hdfsFile);
  73. fs.copyFromLocalFile(src, dst);
  74. }
  75.  
  76. /**
  77. * 通过流上传文件
  78. */
  79. public static void uploadFile(String hdfsPath, InputStream inputStream) throws Exception {
  80. hdfsPath = NAMENODE_URL + hdfsPath;
  81. FSDataOutputStream os = fs.create(new Path(hdfsPath));
  82. BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
  83. byte[] data = new byte[1024];
  84. int len;
  85. while ((len = bufferedInputStream.read(data)) != -1) {
  86. if (len == data.length) {
  87. os.write(data);
  88. } else { //最后一次读取
  89. byte[] lastData = new byte[len];
  90. System.arraycopy(data, 0, lastData, 0, len);
  91. os.write(lastData);
  92. }
  93. }
  94. inputStream.close();
  95. bufferedInputStream.close();
  96. os.close();
  97. }
  98.  
  99. /**
  100. * 从HDFS中下载文件
  101. */
  102. public static byte[] readFile(String hdfsFile) throws Exception {
  103. hdfsFile = NAMENODE_URL + hdfsFile;
  104. Path path = new Path(hdfsFile);
  105. if (fs.exists(path)) {
  106. FSDataInputStream is = fs.open(path);
  107. FileStatus stat = fs.getFileStatus(path);
  108. byte[] data = new byte[(int) stat.getLen()];
  109. is.readFully(0, data);
  110. is.close();
  111. return data;
  112. } else {
  113. throw new Exception("File Not Found In HDFS");
  114. }
  115. }
  116.  
  117. }

3.7 执行一个MapReduce任务

Hadoop中提供了hadoop-mapreduce-examples-2.9.0.jar,其封装了一些任务计算方法,可以直接进行调用。

*使用hadoop jar命令执行JAR包。

1.创建一个文件,将此文件上传到HDFS中。

2.使用Hadoop提供的hadoop-mapreduce-examples-2.9.0.jar执行wordcount词频统计功能,然后在YARN管理页面中进行查看。

YARN管理页面中可以查看任务的执行进度:

3.当任务执行完毕后,可以查看任务的执行结果。

*任务的执行结果将会放到HDFS的文件中。

Hadoop大数据通用处理平台的更多相关文章

  1. 单机,伪分布式,完全分布式-----搭建Hadoop大数据平台

    Hadoop大数据——随着计算机技术的发展,互联网的普及,信息的积累已经到了一个非常庞大的地步,信息的增长也在不断的加快.信息更是爆炸性增长,收集,检索,统计这些信息越发困难,必须使用新的技术来解决这 ...

  2. 【HADOOP】| 环境搭建:从零开始搭建hadoop大数据平台(单机/伪分布式)-下

    因篇幅过长,故分为两节,上节主要说明hadoop运行环境和必须的基础软件,包括VMware虚拟机软件的说明安装.Xmanager5管理软件以及CentOS操作系统的安装和基本网络配置.具体请参看: [ ...

  3. 数据仓库和Hadoop大数据平台有什么差别?

    广义上来说,Hadoop大数据平台也可以看做是新一代的数据仓库系统, 它也具有很多现代数据仓库的特征,也被企业所广泛使用.因为MPP架构的可扩展性,基于MPP的数据仓库系统有时候也被划分到大数据平台类 ...

  4. hadoop大数据平台安全基础知识入门

    概述 以 Hortonworks Data Platform (HDP) 平台为例 ,hadoop大数据平台的安全机制包括以下两个方面: 身份认证 即核实一个使用者的真实身份,一个使用者来使用大数据引 ...

  5. TOP100summit:【分享实录-Microsoft】基于Kafka与Spark的实时大数据质量监控平台

    本篇文章内容来自2016年TOP100summit Microsoft资深产品经理邢国冬的案例分享.编辑:Cynthia 邢国冬(Tony Xing):Microsoft资深产品经理.负责微软应用与服 ...

  6. hadoop大数据技术架构详解

    大数据的时代已经来了,信息的爆炸式增长使得越来越多的行业面临这大量数据需要存储和分析的挑战.Hadoop作为一个开源的分布式并行处理平台,以其高拓展.高效率.高可靠等优点越来越受到欢迎.这同时也带动了 ...

  7. (第1篇)什么是hadoop大数据?我又为什么要写这篇文章?

    摘要: hadoop是什么?hadoop是如何发展起来的?怎样才能正确安装hadoop环境? 这些天,有很多人咨询我大数据相关的一些信息,觉得大数据再未来会是一个朝阳行业,希望能尽早学会.入行,借这个 ...

  8. 《Hadoop大数据架构与实践》学习笔记

    学习慕课网的视频:Hadoop大数据平台架构与实践--基础篇http://www.imooc.com/learn/391 一.第一章 #,Hadoop的两大核心:     #,HDFS,分布式文件系统 ...

  9. 奇点云数据中台技术汇(一) | DataSimba——企业级一站式大数据智能服务平台

    在这个“数据即资产”的时代,大数据技术和体量都有了前所未有的进步,若企业能有效使用数据,让数据赚钱,这必将成为企业数字化转型升级的有力武器. 奇点云自研的一站式大数据智能服务平台——DataSimba ...

随机推荐

  1. DEDE整站动态/静态转换

    方法一:使用DEDE后台的SQL命令行工具 入口:织梦后台-系统-SQL命令行工具 DEDE整站动态化 将所有栏目设置为“使用动态页”: 将所有文档设置为“仅动态”: DEDE整站静态化 将所有栏目设 ...

  2. 简单的C#实体映射 AutoMapper

    AutoMapper是对象到对象的映射工具.在完成映射规则之后,AutoMapper可以将源对象转换为目标对象. 要映射实体 public class SourceModel { public int ...

  3. C# 内插字符串与字符串复合格式

    var name = "Tom"; ; string aa = string.Format("name:{0},age:{1}", name, age);//字 ...

  4. DVWA-暴力破解学习笔记

    DVWA-暴力破解 1.暴力破解 2.burp安装证书 3.万能密码 一.暴力破解 burp四种暴力破解类型: sniper   一个字典,两个参数,先匹配第一项再匹配第二项 Battering ra ...

  5. leetcode题解-122买卖股票的最佳时期

    题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...

  6. openstack 2019/4/28

    官网参考地址:https://docs.openstack.org/keystone/queens/install/index-rdo.html (但愿能看懂) 环境:这个部分解释如何按示例架构配置控 ...

  7. 揽货最短路径解决方案算法 - V2(增加了时间维度-客户允许的服务时间段,C#/JAVA同步实现,带python作图)

    继上篇,这里改进增加了客户允许服务的时间范围这个维度,并且把C#版本翻译成java,加强了更加形象的图表展示路径(继续是用python的matplotlib作图). 这里的时间范围维度是指:每个客户都 ...

  8. Characterization of Dynkin diagrams

    Nowadays, I am reading D.J.Benson's nice book, volume I of Representations and cohomology. I found i ...

  9. Element ui 日期限制范围

    时间限定范围: <el-date-picker type="date" placeholder="选择日期" v-model="addForm. ...

  10. 个人jQuery的使用总结

    一.使用方法 参考内容有: http://www.w3school.com.cn/jquery/jquery_ref_events.asp http://www.cnblogs.com/zhangzi ...