hadoop

📝 1 篇文章
📅 最新: 2024/12/19

Hadoop 知识整理

# hadoop知识点整理 ## 第一章 大数据的概念 大数据是指无法用现有的软件工具提取、存储、搜索、共享、分析和处理的海量的复杂的数据图集。 ### 特征 **4个V**: - Volume:数据体量巨大 - Variety:数据种类繁多 - Value:数据价值密度低 - Velocity:处理速度快 ### hadoop生态圈 大数据工具主要包括:Hadoop、Hbase、ZooKeeper、Hive、Mahout、Sqoop、Storm等 #### Hadoop **Doug Cutting**开发,受到**Map/Reduce**启发,核心是**MapReduce编程模型和HDFS分布式文件系统**。 采用分而治之的思想,Map用来切分大的数据,Reduce用来合并Map计算的结果。 HDFS 分布式文件系统,为海量数据提供存储服务,将大文件拆分为块,多节点存放,具有高吞吐量、高容错性的特点。 #### HBASE HBASE是Apache开源的KV型数据库,是建立在HDFS之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。 仅支持单行事务。 主要用来存储非结构化和半结构化的松散数据。 #### Hive Apache Hive数据仓库软件提供对存储在分布式中的大型数据集的查询和管理,它本事是建立在Hadoop之上的 #### Storm Apache Storm是一个免费、开源的分布式实时计算机系统,简化了数据流的可靠处理。 #### ZooKeeper zooKeeper是一个高性能、分布式的开源分布式应用协调服务,他是storm、hbase的重要组件,它是一个为分布式应用提供一致性服务的软件。 服务端跑在JAVA上 ZooKeeper有两个角色,一个是leader,负责写服务和数据同步,剩下的是follower,提供读服务。 **特点**: - 顺序一致性:按照客户端发送请求的顺序更新数据 - 原子性 - 单一性:无论客户端连接哪个server都看到同一个视图 - 可靠性:一旦数据更新成功将一直保持,直到新的更新 - 及时性:客户会在一个确定的时间内得到最新的数据 **运用场景**: - 数据发布订阅 - 名空间服务 - 分布式通知 - 分布式锁 - 集群管理 #### sqoop sqoop是Apache顶级项目,允许用户将数据从关系型数据库中抽取数据到Hadoop中 #### mahout mahout是一个强大的数据挖掘工具,是一个分布式机器学习算法的集合,包括分布式协同过滤的实现、分类、聚类等 ### Hadoop历史和版本 历史: - 2011年12月,Apache基金会发布了Apache Hadoop 版本1.0 - 2013年8月,版本2.0.6可用 - 2017年12月发布Apache Hadoop3 发行版: Hadoop有许多变体: - Cloudera Hadoop分布:是Coludera Enterprise的核心,包括Apache Hadoop、Apache Spark,Apache Kafka 以及十多个其他紧密继承的领先开源项目 - Hortonworks Hadoop分布:是基于YARN的安全性强、企业就绪的开源版本 - MapR Hadoop分布:是Hadoop的完成整企业级发行版 - PivotalHD:是领先的基于标准的Hadoop该发行版,为Business Data Lake架构奠定了基础 优势: - 高可靠性 - 高拓展性 - 高效性 - 高容错性 ## 第二章 Hadoop 组成与结构 Hadoop1的三大核心模块: - Common模块:支持其他模块的工具模块 - HDFS模块:一个高可靠、高吞吐量的分布式文件系统 - MapReduce模块:一个分布式的资源调度和离线并行计算系统 Hadoop2的组成: MapReduce模块仅作为分布式计算框架存在,资源调度功能交给YARN来调度处理 ### HDFS 一个分布式文件系统。 HDF的设计适合一次写入多次读出的场景且不支持文件修改。适合用来做数据分析,并不适合做网盘使用。 Master-Slave结构,Master是NameNode,Slave是DataNode client职责如下: - 文件切分 - 与NameNode交互获取文件的位置信息 - 与DataNode交互读取或写入数据 - 提供一些明恋来管理HDFS,比如启动或者关闭HDFS - 可以通过一些命令来访问HDFS NameNode职责如下: - 配置副本策略 - 处理client读写请求 - 管理block(数据块)映射信息,以元数据的形式存储在Fsimage镜像文件中 - 管理HDFS命名空间 DataNode的职责: - 执行实际的数据块 - 执行数据块的读写操作 SecondaryNameNode,第二名称节点,并非名称节点的热备,晋档NameNode重启或者热备NameNode激活时将宕机前所保留集群的快照发送给NameNode以恢复此前集群的状态。具体功能为: - 存辅NameNode,分担其工作量 - 定期合并Fsimage和Edits,并推送给NameNode - 在紧急情况下可辅助恢复NameNode 优点: - 高容错性 - 适合大数据处理 - 支持流式数据访问 - 可构建在廉价机器上 缺点: - 不适合低延时数据访问 - 无法高效的对大量小文件进行存储 - 不支持并发写入文件和随机修改 ### YARN架构 MRv1的局限: - 扩展性差 - 可靠性差 - 资源利用率低 - 无法支持多种计算机框架 YARN是一个弹性计算平台,他的目标已经不局限于支持MapReduce一种计算框架,而是朝着对多种框架的统一管理前进 优点: - 资源利用率高 - 运维成本低 - 数据共享 对比: | | V1 | V2 | | ----------- | ---------------------------------------------------------------- | -------------------------------------------------------------------------- | | 基本框架 | JobTracker由资源管理和作业控制两部分组成 | 将JobTracker的两个功能拆分成两个独立的进程,资源管理进程负责整个集群的资源,而作业控制则是直接与应用程序相关的模块,每个进程只负责一个作业 | | 编程模型与数据处理引擎 | | MRv2重用了v1中的编程模型与数据处理引擎 | | 运行时环境 | 由JobTracker和TaskTracker两类服务组成,JT负责资源和任务的管理与调度,TT负责单个节点的资源管理和任务进行 | 将资源部管理与应用程序管理分开,分别又YARN和ApplicationMaster负责 | #### YARN基本架构 总体上仍然是Master/Slave架构 YARN的组成成分如下: - ResourceManager:一个全局的资源管理器,负责整个系统的资源管理与分配。它由两个组件构成: - 调度器(Scheduler):根据容量、队列等限制条件将资源分配给各个正在运行的应用程序 - 应用程序管理器(Application Manager ASM):负责整个系统中所有应用程序 - ApplicationMaster(AM)的主要功能有: - 与RM调度器协商以获取资源(Container) - 将得到的任务进一步分给内部任务 - 与NM通信以启动/停止任务 - 监控所有任务运行状态 - NodeManager:是每个节点上资源和任务管理器 - Container:是YARN山中的资源抽象,它封装了某个节点上的多维度资源 ## 第三章 Hadoop运行模式与大数据技术框架 Hadoop的运行模式主要有四种: - 本地模式 - 伪分布式 - 全分布式 - 高可用模式 ### 伪分布式模式 Hadoop可以运行在单个节点上,其中每一个Hadoop守护进程运行在单独的Java进程中,这个模式称之为伪分布式模式。Hadoop所有进程都运行在一台服务器以模拟全分布式模式,常用于学习阶段。 后台的五个进程为: - NameNode - DataNode - SecondaryNameNode - ResourceManager - NodeManager ### 高可用模式 Hadoop是一种主从式架构,这样就会有**单点故障**的问题 ## HDFS - 数据块(block) - HDFS默认的最基本的存储单位是128MB的数据块 - 128M为一块 - 一个文件如果小于一个数据块的大小,并不占用整个数据块的空间 - 存放策略(3副本) - 第一个和client同node - 第二个放在与第一个节点的不同机架中的随机的一个node - 第三个放在与第一个节点不同的机架中与第二个不同的随机node中 - NameNode 和DataNode - HDFS体系结构中有两类节点,一类是NameNode ( Master) ,又叫"元数据节点";另一类是DataNode (Slave) ,又叫"数据 节点”。 - 元数据节点用来管理文件系统的命名空间,作用如下: - 其将所有的文件和文件夹的元数据保存在一个文件 系统树中 - 这些信息也会在硬盘上保存成以下文件:命名空间镜像(namespace image)及修改日志(edit log) - 还保存了一个文件包括哪些数据块,分布在哪些数据节点上,然而这些信息并不存储在硬盘上,而是在系统启动的时候从数据节点收集而成的 - 数据节点是文件系统中真正存储数据的地方,作用如下: - 客户端(clien)或者 元数据信息(namenode)可以向数据节点请求写入或者读出数据块 - 周期性的向元数据节点回报其存储的数据块信息 - `hadoop.tmp.dir`,临时目录,其他临时目录的父目录,默认 `/tmp/hadoop-${user.name}`,在`core-site.xml`中配置 - 元数据节点目录结构,在`hdfs-site.xml`中配置`dfs.name.dir`参数,以`,`分隔,默认在`{hadoop.tmp.dir}/dir/name` - 数据节点目录结构 - 在`hdfs-site.xml`中配置参数`dfs.data.dir`,以`,`分隔 - HDFS通信协议 - 所有HDFS通信协议都是构建在TCP/IP协议上的 - HDFS安全模式 - Namenode启动后会进入一种称为安全模式的特殊状态。处于安全模式的Namenode是不会进行数据块的复制的。Namenode从所有的DataNode接受心跳信号和块状态报告 **Name Node、DataNode 和Client** - Namencodte 是分布式文件素统中的管理者, 主要负责管理 文件系统的命名空间、集群配置信息和存储块的复制等。NameNode 会将文件系统的Meta-data 存储在内存中,这些信息主要包括了文件信息,每个文件对应的文件块的信息和每个 文件块DataNode的信息等。 - DataNode是文件存储的基本单元, 它将Block 存储在本地文件系统中,保存了Block 的meta-data,同时 周期性地将所有存在的Block信息发送给NameNode. - Client 就是需要获取分布式文件系统文件的应用程序。 - Client读取文件信息 ### Hadoop Shell命令 实际上是属性,命令为:`hadoop fs -xx` - `cat`: - `chgrp`: change group - `chmod`: - `chown` - `copyFromLocal` - `copyToLocal` - `cp`: copy - `du`:显示目录中所有文件的大小 - `dus`:显示单个文件大小 - `expunge`:清空回收站 - `get`:复制到本地 - `getmerge`:将 source dir 中的文件链接成 local target dir - ls - lsr:递归ls - mkdir - movefromLocal - mv - put:本地到远程 - rm - rmr:递归rm - setrep:改变副本数 - stat:返回指定路径的统计信息 - tail:将尾部1kb的字节输出到stdout - test:检测文件是否存在 - text:将源文件输出为文本格式 - touchz:新建一个0自己的文件 Hadoop管理命令: - distcp:分布式拷贝(集群之间) - fsck:检查整个文件系统的健康情况 - jar:运行java文件 - job:用于和MapReduce交互 - balancer:运行集群平衡工具 - dfsadmin:运行一个dfs admin客户端 - namenode: 运行namenode ### java接口 Hadoop中关于文件操作类基本都在`org.apache.hadoop.fs`包中 Hadoop类库中最终面向用户提供接口是`FileSystem` ```java // 获取FileSystem具体类 static FileSystem get(Configuration conf); // 写文件 public FSDataOutputStream create(Path f) throws IOException; //读文件 // 上传文件到HDFS public void copyFileLocalFile(Path src,Path dist); // 重命名文件 public abstract boolean rename(Path src, Path dist); // 删除文件&目录 public abstract boolean delete(Path f, boolean recursive) throws IOException; // 创建目录 public boolean mkdirs(Path f) throws IOException; // 遍历目录 public abstract FileStatus[] listStatus(Path f) throws FileNotFoundException, IOException ``` ## MapReduce ```java public void map(Object Key,Text value,Context context) throws IOExcetion, InterruptedException{ } ``` ### MapReduce工作原理 MapReduce框架的运作完全基于“键值对”,即数据的输入是一批“键值对” (key-value) ,生成的结果也是批“键值对”,只是有时候它们的类型不一样而已。Key和value的类由于需要支持被序列化 (Serealire) 操作,所以它们必须要实现`Writable` 接口,而且key的类还必须实现`WirtableComparable`接口,使得可以让框架对数据集的执行排序操作,MapRedtre运行机制,按照时间顺序包括:输入分片(input split)、map 阶段、combiner 阶段、shuffle阶段和reduce阶段。 在进行map计算之前,MapReduce会根据输入文件计算输入分片 ### YARN运行流程 1. JobClient 向YARY中提交应用程序,其中 包括ApplicationMaster 程序、启动ApplicationMaster的命令、用户程序、环境变量、作业信息、文件位置信息等 2. RecourseManager为该应用程序分配第一个 Container. 并与对应的 Node-Manager 通信(通过心跳方式),更求它在这个Container中启动应用程序的ApplicationMaster 3. ApplicationMaster首先向ReoourceManager注册,这样用 户可以直接通过ResourceManager查看应用程序的运行状态。然后它将为各个任务申请资源,并监控它的运行状,直到运行结束 4. ApplicationMaster 采用轮询的方式通过RPC协议向ResourceManager申请和领取资源 5. 一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务 6. NodeManager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中, 并通过运行该脚本启动任务。 7. 各个任务通过某个RPC协议向AplcationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。 8. 应用程序运行完成后, ApplicationMaster向ResourceManager注销并关闭自己 ### 作业关键过程详解 **map**:map任务最终是交给Map任务执行器 **Reduce**:从所有map节点取到属于自己的map输出 **Partitioner**:当Mapper处理好数据后,需要使用Partitioner(分区器)确定怎样合理地将Mapper输出分配到Reduce上 **Combiner**:相当于一个本地的Reduce,主要是对Mapper输出的大量本地文件进行一次合并。Combiner函数执行时机可能是在map的merge操作完成之前 ### MapReduce各种输入输出 **InputFormat**:负责处理MR的输入部分,来决定Map的数量,InputFormat **FileInputFormat**:是所有以文件作为数据源的InputFormat实现的基类,FileInputFormat保存作为job输入的所有文件 ## MapReduce 设计模式 - **过滤器模式**:设定某种条件,当负责条件时保留数据,不符合条件时丢弃数据 - **Top N**:根据数据集的排名,获取前N条记录 - **去重模式**:去重 - **数据重组**:按照一定的规划整理数据。数据重组要求划分的分区数量已经确定,划分分区的条件已经确定 -