Hadoop的理解笔记
1.2Hadoop与云计算的关系
1.什么是云计算:一种基于互联网的计算,在其中共享的资源、软件和信息以一种按需的方式提供给计算机和设备 , 就如同日常生活中的电网一样。
什么是Hadoop:Hadoop 是Apache 旗下的一款开源软件 ,它实现了包括分布式文件系统 HDFS 和 MapReduce 框架在内的云计算软件平台的基础架构,并且在其上整合了数据库、云计算管理、数据仓储等一系列平台 。
Hadoop 不等于云计算, Hadoop 是一种技术的实现,而云计算更偏重于业务的建设 。 更具体一点来讲, Hadoop 这款产品的技术实现,体现了云计算体系中的一部分功能的应用技术架构 。
2.云计算的分类:基础架构即服务(IaaS),平台即服务(PaaS),软件即服务(SaaS)
3.《 云计算标准化白皮书》按云计算部署模式分为 4 类,即公有云、私有云、社区云和混合云 。
4.云计算演避历史:技术发展推动-国际标准化组织 、 协会推动-国内云计算发展工作驱动-社会需求推动
5.云架构层次:客户端-SaaS-Paas-IaaS-数据来源
6.云计算是分布式计算、并行计算、效用计算、网络存储 、虚拟化、负载均衡、热备份冗余 等传统计算机和网络技术发展融合的产物。
7.Hadoop 在云项目中扮演的角色:Hadoop 主要解决的是分布存储、分布式计算的问题 , 是云计算的 PaaS 层的解决方案之一,但不等同于 PaaS 。
1.3 Hadoop 与大数据的关系
1.大数据产业链
从商业角度分析大数据产业链:大数据(提供)者;大数据技术提供者;大数据服务提供者
从技术角度分析大数据产业链:大数据采集 ;大数据存储、管理和处理;大数据分析和挖掘;大数据呈现和应用
2.什么是大数据:大数据或称巨量数据、海量数据、大资料 ,指的是所涉及的数据量规模巨大到无法通过人工在合理时间内达到截取、管理、处理并整理成为人类所能解读的信息。
3.大数据的5v特征:
(1)多样性:结构化-非结构化-多因素-概率性
(2)速度快;批处理-实时-多进程-数据流
(3)数据量大;TB级-记录/日志-事务-表&文件
(4)价值密度低;统计学-事件性-相关性-假设性
(5)真实性:可信性-真伪性-来源&信誉-有效性-可审计性
4.大数据的存储结构
(1)分布式存储与访问是大数据存储的关键技术
(2)分布式文件系统
(3)文档存储
(4)列式存储
(5)键值存储:即 Key-Value 存储,简称 KV 存储,是 NoSQL 存储的一种方式。
(6)图形数据库
(7)关系模型
(8)内存存储
5.大数据的计算模式(目前主要的数据处理计算模型)
MapReduce 计算模型、 DAG 计算模型、 BSP计算模型等
6.Hadoop 在大数据中扮演的角色:Hadoop 是Apache 的一个开源项目 ,它是一个对大量数据进行分布式处理的软件架构,框架最核心的设计就是:
为海量的数据提供了存储的 HDFS 技术,以及为海量的数据提供了计算的 MapReduce 技术。 它具有低成本、高可靠性、高吞吐量的特点。尤其在数据仓库方面, Hadoop 是非常强大的,但在数据集市
及实时的分析展现层面 , Hadoop 也有着明显的不足。
7.MapReduce 是一个高性能的批处理分布式计算框架,用于对海量数据进行并行分析和处理.MapReduce 适合处理各种类型的数据,包括结构化、半结构化和非结构化数据,并且可以处理数据量为 TB 和 PB 级别的超大规模数据
2.2Hadoop 版本演化
1.Hadoop 1 时代:Hadoop Common 项 目更多是隐藏在幕后为 Hadoop 架构提供基础支持,主要包括文件系统( File System )、远程过程调用 ( RPC )和数据串行化库( Serialization Libraries )。
HDFS 是一个分布式文件系统,具有低成本、高可靠性、高吞吐量的特点,由一个 :NameNode和多个 DataNode 组成
NameNode 是 HDFS 管理者,负责管理文件系统命名空间,维护文件系统的文件树,以及所有的文件、目录的元数据。 这些信息存储在 NameNode 维护的两个本地的磁盘文件中一一命名空间镜像文件( FSimage )和编辑日志文件( Edit logs )。
DataNode 是 HDFS 中保存数据的节点 。 DataNod巳 定期向 NameNode 报告其存储的数据块列表,以备使用者通过直接访问DataNode 获得相应的数据 。
MapReduce 是一个基于计算框架的编程模型 ,适用于在大规模计算机集群上编写离线的、大数据量的、相对快速处理的并行化程序,它由一个 JobTracker 和多个 TaskTracker 组成。
2.Hadoop 2 时代
3.Common ( Hadoop O却 版本前被称为 Hadoop Core )为 Hadoop 整体框架提供支撑性功能 HDFS 负责存储数据 ; MapReduce 负责数据计算。 区别是 Hadoop2 时代引入 通用资源管理框架 YARN 后 , HDFS 资源可供 MapReduce 以外的框架(如 Sp础、 Storm 等共用),以及 NameNode 主节点进行全备份。 故 Hadoop 运行机制发生了部分改变。 基于 YARN , 用户可以运行各种类型的应用程
序(不再像 Hadoopl 那样仅局限于 MapReduce 一类应用),从离线计算的 MapReduce 到在线计算( 流式处理)的 Storm 等 。
2.3RPC 工作原理
1.Hadoop 的远程过程调用( Remote Procedure Call , RPC )是 Hadoop 中 的核心通信机制 , RPC 主要用于所有 Hadoop 的组件元数据交换,如 MapReduce 、 Hadoop 分布式文件系统( HDFS ) 和 Hadoop的数据库( HBase )。
2.RPC是什么:RPC 是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 假定某些传输协议(如 TCP 或 UDP ) 存在,为通信程序之间携带信息数据。
3.RPC 的主要功能:让构建分布式计算(应用 ) 更容易 , 在提供强大的远程调用能力时, 不损失本地调用的语义简洁性。
4.RPC特点:透明性-高性能-可控性
5.实现 RPC 的程序包括 5 个部分 , 即 User、 User-stub , RPCRuntime 、 Server-stub , Server。
6.Hadoop RPC 分为 4 个部分 :序列化层-函数调用层 -网络传输层-服务器端框架层
7.Hadoop 中 RPC 的设计技术:动态代理-反射一一动态加载类-序列化-)非阻塞异步 IO ( NIO )
8.使用 Hadoop RPC 的步骤:
定义 RPC 协议:RPC 协议是客户端和服务器端之间的通信接口,它定义了服务器端对外提供的服务接口 。
实现 RPC 协议:Hadoop RPC 协议通常是一个 Java 接口,用户需要实现该接口 。
构造和启动 RPCServer:直接使用静态类 Builder 构造一个 RPC K凹町, 并调用函数 start()启动该 Server。
构造 RPC Client 并发送请求:使用静态方法 getProxy 构造客户端代王B才象,直接通过代理对象调用远程端的方法。
9.Hadoop RPC 应用实例:(代码)电子书P31
10.RPColB 和 JVM一旁路缓冲管理方案:在高性能网络 lnfiniBand 上数据交换的改进
2.4 MapReduce 工作原理
1.有代表性的并行计算模型包括 PRAM 模型、 BSP 模型、 LogP模型、 C"3 模型等 。
2.MapReduce是什么:在 HDFS 将一个大文件切分成众多小文件分别存储于不同节点的基础上 , 尽量在数据所在的节点上完成小任务计算再合并成最终结果。其中这个大任务分解为小任务再合并的过程是一个典型的合并计算过程,以尽量快速地完成海量数据的计算
3.MapReduce的演示计算模型:一个 MapReduce 作业( job )通常会把输入的数据集切分为若干独立的数据块Block ,由 Map 任务( task ) 以完全并行的方式处理它们。框架会对 Map 的输出先进行排序,然后把结果输入给 Reduce 任务。 典型的是作业的输入和输出都会被存储在文件系统中 。整个框架负责任务的调度、监控和已经失败的任务的重新执行。
HDFS : 存储了大文件切分后的数据块,图中 Block 大小为 128MB。
分片 : 在进行 Map 计算之前, MapReduce 会根据输入文件计算输入分片( input split ),每个输入分片针对一个 Map 任务,输入分片存储的并非数据本身,而是一个分片长度和一个记录数据的位置的数组。
Map任务
Shuffle 任务 : Hadoop 的核心思想是 MapReduce ,而 Shuffle 是 MapReduce 的核心 。 Shuffle 的主要工作是从 Map 结束到 Reduce 开始之间的过程。 Shuffie 阶段完成了数据的分区、分组、 排序的工作
Reduce 任务
输出 : 记录 MapReduce 结果的输出 。
从 HDFS 上获取指定的 Block 进行分片后,将分片结果输入 Mapper 进行 Map处理 , 将结果输出给 Shuffie 完成分区、排序、分组的计算过程, 之后计算结果会被 Reducer 按指定业务进一步处理,最终将计算出的结果输出到指定的位置,
4.MapReduce 自身的设计特点决定了数据源必须是静态的 , 故不能处理动态变化的数据,如流式计算等。
5.MapReduce 经典案例:计算不同文件所在的指定数据集中 同一个单词出现的次数。(百度代码)
2.6 HDFS 工作原理
1.GFS 架构中有 3 类角色,即客户( client )、主服务器( master server )和数据块服务器( chunk server ),这 3 类角色的节点会构成一个 GFS 群 , 这个群包含一个单个的 master 节点、多台 chunk 服务器,多个客户端。
2.Hadoop 分布式文件系统( HDFS )是一种为了在普通商用硬件上运行而设计的分布式文件系统,HDFS 高度容锚,可部署在低成本硬件上。 由FS 提供对应用程序数据的高吞吐量访问,适用于具有大数据集的应用程序。 HDFS 放宽了→阶 POSIX 约束, 来实现流式读取文件系统数据的曰的 。
3.HDFS 为了更好地服务于应用,提供了类似于 Linux 命令的 Shell 接口(具体使用方法详见 4.2节)和 API 的接口(具体使用方法详见 4.4 节)。此外 HDFS 还可以通过 HTTP 协议支持用户通过浏览器客户端对 HDFS 平台上的文件目录和数据进行检索服务
4. ApacheHDFS的特点:功能强大,操作简单、易用 -良好的扩展性-高容错性-支持流式数据访问-适合 PB 量级以上海量数据的存储-异构软硬件平台间的可移植性。
5.HDFS 采用 master/slave 架构。一个 HDFS 集群由一个 NameNode 和一定数目的 DataNode 组成 。
NameNode 是一个中心服务器( mater 机), 负责管理文件系统的命名空间( NameSpace )及客户端对文件的访问。集群中的 DataNode 一般是集群中-台服务器( slave 机)充当一个 node (节点),启动一个 DataNode 的守护进程,负责管理它所在节点上的存储。
6.从 NameNode与 DataNode 的体系结构来理解两者的含义
从内部看,一个文件其实被分成一个或多个数据块( Block ),这些块( Block ) 被存储在一组DataNode 上 。 NameNode 执行文件系统的命名空 间操作 ,如打开、关闭 、重命名文件或目录 。 它也负责确定数据块( Block )到具体 DataNode 的映射。 DataNode 负责处理文件系统客户端的读写请求 ,并在 NameNode 的统-调度下进行数据块的创建、删除和复制 。
7.NameNode 不会定期地向各个 DataNode 去“索取”块的信息,而是各个 DataNode 定期向NameNode 汇报块的信息。
整个 HDFS 的启动速度由两个因素决定 :
第一,执行各个 edits 文件的时间,这个也是要重点讨论的 ;
第二,各个 DataNode向 NameNode 汇报块信息的进度,当 99.9%的 Block 汇报完毕后 , 才会离开安全模式。
8.HDFS 中 Block 副本放置策略:
副本存放:NameNode 选择一个 DataNode 去存储 Block 副本的过程
由于 Hadoop 的 HDFS 对数据文件的分布式存放是按照分块( Block )存储,每个 Block 会有多个副本(默认为 3 ),并且为了数据的安全和高效,
Hadoop 默认的方案如下 。
( 1 )把第一个副本放在和客户端同一个节点上,如果客户端不在集群中, 就会随机边一个节点存放。
( 2 ) 第二个副本会在和第一个副本不同的机架上随机选一个。
( 3 ) 第三个副本会在与第二个副本相同的机架上随机选一个不同的节点。
(4 )剩余的副本就完全随机选择节点了 。
9.NameNode 启动后会进入一个被称为安全模式( Safemode ) 的特殊状态 。 处于安全模式的NameNode 是不会进行数据块的复制的。
NameNode 接收来自 DataNode 的心跳信号( Heartbeat )和块状态报告( Blockr巳port )。 Blockreport 包含了某个 DataNode 托管的 Block 列表。 每个 Block 都有一个指定的最小副本数。 当 NameNode 检测确认某个 Block 的副本数目达到这个最小值时,该 Block
就会被认为是副本安全( safely replicated )的 , 即该 Block 被安全地复制。在一定百分比 ( 这个参数可配置)的数据块被 NameNode 检测确认是安全的之后(加上一个额外的 30 秒等待时间), NameNode将退出安全模式状态。然后确定还有哪些 Block 的副本没有达到指定数目,并将这些数据块复制到其他 DataNode 上。
10.HDFS的机架感知
HDFS 和 MapReduce 的组件是能够感知机架的。 NameNode 和 JobTracker通过调用管理员配置模块中的 API resolve 来获取集群里每个 slave 的机架 ID 。该 API 将 slave 的 DNS名称(或者 IP 地址)转换成机架 ID 。
HDFS 和 YARN 组件是机架感知的 。 NameNode 和 ResourceManager 通过调用管理员配置模块中的 API resolve 来获取集群中从属机架( slave )的机架信息。 API 将 slave 的 DNS 名称(也被称为 E 地址) 解析为机架 ID 。
11.NameNode 存储 Block 数目是有限的,根据 Block 切分策略和磁盘文件读取理论, HDFS 不适合小文件的存储。
2.7 YARN 工作原理
1.HDFS 是典型的 master/slave 结构 , 它是负责大数据存储的分布式系统,典型结构如图 2-24 所示 ,客户端 Client、主节点 NameNode 和数据节点 DataNode 之间进行交互完成 Hadoop 集群数据的存储与读取等操作。
2.HDFS架构包含两层,即 NameSpace 和 Block Storage Service
NameSpace 层面包含目录、文件及块的信息,它支持所有 NameSpace 相关文件系统的操作,如创建、删除、修改,以及文件和 目录的列举。
Block Storage Service 层面又包含( 1 ) Block Management (块管理);( 2) Storage (存储)
3.为了解决 HDFSl 的不足, HDFS2 的 NameNode 可以以集群的方式布署,增强了 NameNode 的水平扩展能力和高可用性,分别是 HDFS Federation 与 HA ( High Availability )。
HDFS Federation 在现有 HDFS 基础上添加了对多个 NameNode/NameSpace 的支持,可以同时部署多个 NameNode , 这些 NameNode 之间相互独立,彼此之间不需要协调 , DataNode 同时在所有NameNode 中注册 , 作为它们的公共存储节点,定时向所有的这些 NameNode 发送心跳块使用情况的报告,并处理所有 NameNode 向其发送的指令,
该架构引入了两个新的概念一一存储块池( Block Pool )和集群 ID ( Cluster ID )。
YARN 的出现取消了 Slot 的概念,把 JobTracker 由一个守护进程分为 Resource1在anager 和 ApplicationMaster 两个守护进程,将 JobTra伽 所负责的资源管理与作业调度分离 。 其中 ResourceManager 负责原来 JobTracker 管理的所有应用程序计算资源的分配、监控和管理; ApplicationMaster 负责每一个具体应用程序的调度和协调。
1.MapReduce 作业的具体工作过程:作业的提交-作业的初始化-作业任务的分配-作业任务的执行-作业的完成
2.YARN 工作中几个重要组件:ResourceManager(RM)-ApplicationMaster(AM)-NodeManager(NM)
3.3 伪分布模式搭建
1.配置过程看电子书P80
2.在伪分布平台下,除了本地模式的基础配置外,建议至少指明 HDFS 路径的逻辑名称、 Block 副本数量、 MapReduce 以 YARN 模式运行及NodeManager 上运行 MapReduce 程序的附属服务。
core-site.xml 配置:<name>fs . defaultFS</name>
〈value>hdfs://localhost : 8020</value >一- HDFS 路径的逻辑名称一 -
hdfs-site.xml 配置:<name>dfs . replication< /name>
<value>l</value> ---Block 副本数量设置为 1一-
mapred-site.xrnl 配置:〈name>mapreduce . framework.name</name>
<value>yarn</value> 一-指定 MapReduce 作业在 YARN 模式下运行一-
yam-site.xrnl 配置:<name>yarn . nodemanager . aux - services</name>
<value>mapreduce shuffle</value> 一一配置成 mapreduce_shuffle ,运行 MapReduce 程序一-
3.环境参数配置成功后,在 Hadoop 服务启动之前,需要对 Hadoop 平台进行格式化操作 。 格式化
命令如下 。
[user@master - ] $ hadoop namenode -format
4.Hadoop 进程启停与验证
( 1 )启动 NameNode 守护进程和 DataNode 守护进程。
[user@master ~]$ sbin/start-dfs sh
( 2) Hadoop 守t月挂程日志输出写入$HADOOP_LOG_DIR 目录(默认为$ HADOOP_HO~伍/logs )。
( 3 )浏览 NameNode 的 Web 界面。 默认情况下,它可为 NameNode - http://localhost:50070 /。
( 4 )使 HDFS 目 录能够执行 MapReduce 作业。
[user@master - ]$ bin/hdfs dfs - mkdir/user
[user@master -]$ bin/hdfs dfs - mkdir/user/<username>
( 5 )将输入文件复制到分布式文件系统中。
[user@master - ]$ bin /hdfs dfs - put etc/hadoop input
( 6 )运行一些提供的示例。
[user@master - ] $ bin/hadoop jar share/hadoop/mapreduce/hadoop- mapreduce - examples-
2 . 6 . 1.jar grep input output ’ dfs [a- z.] +’
( 7 )检查输出文件,将输出文件从分布式文件系统复制到本地文件系统并检查它们。
[user@master ~]$ bin /h dfs dfs -get input output
[user@master ~]$ cat output/*
( 8 )查看分布式文件系统上的输出文件。
[user@master - ]$ bin/hdfs dfs - cat output/*
( 9 ) 完成后,停止守护进程。
[user@master ~]$ sb 工 n/stop - dfs . sh
如果对 YARN 进行了配置 , 启停 Y成N 的配置如下。
( 1 )启动 ResourceManag巳r 守护进程和 NodeManager 守护进程。
[user@master ~]$ shin / start- yarn . sh
( 2 )浏览 ResourceManager 的 Web 界面。 默认情况下 , 它可在 ResourceManager - htφ : //localhost:
8088 /运行 MapReduce 作业。
( 3 )完成后,停止守护进程。
[user@master - ] $ shin/stop- yarn . sh
如果不指定启动内容, 也可以通过 start-all.sh 或者 stop-all.sh 进行所有进程的启动与停止操作。
4.2 HDFS 常用命令行操作概述
1.hadoop -help:查询列 出所有 Hadoop Shell 支持的命令。
2.hadoop version:打印当前平台所用 Hadoop 版本信息。
3.hadoop distcp:可以显示所有该命令的使用说明 。
( 1 )将/test/test.txt 文件复制到/test/cp 目录下。
[user@master ~]$ hadoop distcp /test/test . txt /test/cp
( 2 )将 masterl 集群/test 目录(包含内容)复制至 master2 集群/test_cp 目录下。
[user@master -)$ hadoop distcp hdfs : //masterl/test hdfs://master2/test一cp
4.hadoop jar 气jar> [mainClass] args:用户可以把 MapReduce 代码捆绑到 jar 文件中,使用这个命令执行 jar 文件。
命令选项 :<jar> jar 文件
[mainClass] 指定 jar 文件中的包名+类名
args 运行 jar 文件时需要的参数如下 。
[user@master ~] $ hadoop jar hadoop- mapreduce - examples-2 . 6 . 1. jar grep input output ’ dfs [a- z . ]+’
5.hadoop archive - archiveName <src>* <dest> 。
命令选项 :
- archiveName 要创建的存档文件的名字
src 文件系统的路径名,和通常含正则表达式的一样
dest 保存存档文件的目录索引坐标
6.文件归档
[user@master ~]$ hadoop archive - archiveName part - 20170906-0 . har - p /input/ childl child2 /ah input/har
将 input 文件夹下两个子文件夹 childl 和 child.2 里的文件归档成一个叫 part-20170906-0 .har 的文档,并存储在/ah_input/har 文件夹下
7.查看归档后的目录结构
hado op fs - lsr I
8.查看结果文件 part-0 的内容
hadoop fs -cat /test/in/har/0825 . har/part-0
9.使用 har m 访问原始数据
hadoop fs lsr har : ///ah i nput/har/part- 20170906- 0 . har
10.用 har uri 访问下一级目录
hdfs dfs -lsr har : ///ah input/har/ part - 20170906- 0 . har/input
11.远程访问
hadoop fs - lsr har : //master : 8020/ ah_input/har/part- 20170906 - 0.har
其中 master 是 NameNode 所在节点的主机名 , 8020 是 core-site.xml 文件中 fs.defaultFS 参数配置中对应的端口号 。
12.删除 har 文件
hadoop fs -rmr /ah_input /har/part- 20170906 - 0.har
13.HDFS 常用命令行操作
hadoop dfsadmin help:help 命令会在屏幕客户端列出 dfsadmin 下命令的列表及语法应用格式的帮助信息
查询某个命令的详细信息,格式为$ bin/hadoop fs -help command-name。
hadoop dfsadmin - report:报告 HDFS 的基本信息和统计信息 。 有些信息也可以在 NameNode Web 服务首页看到。
hadoop dfsadmin -safemode get:获取当前 Hadoop 平台安全模式状态, OFF 表示当前系统安全模式处于离开的状态
hadoop dfsadmin - safemode enter:打开当前 Hadoop 平台安全模式状态。
hadoop dfsadm 工n - safemode leave:离开当前 Hadoop 平台安全模式状态。
hadoop fs - help:获取每个命令的详细帮助文件
bin/hadoop job - history output -dir:在指定路径下查看历史日志汇总。
hadoop job -history /user/test/output:显示作业的细节信息,包括失败和终止的任务细节。
hadoop dfs -mkd工 r /testmkdir:在 HDFS 上创建一个/tes础d让 目录 。
hadoop fs - put ~ / f 工 le* . txt /input:上传本地 file 到 HDFS 指定目录 。
hadoop fs -lsr /:递归查询 HDFS 下的文件列表信息。
hadoop fs 一 cat /input/filel . txt:查看 HDFS 上的文件内容。
hadoop fs -rm /input/file*.txt:删除 HDFS 上的指定文件。
hadoop fs -rm -r /input:删除 HDFS 上的文件夹及文件夹内的内容
hadoop fs -chmod 777 /input/testl.txt:更改 HDFS 文件权限
5.2 1/0 序列化类型
P133
Writable接口:IntWritable与VIntWritable类,Text类,BytesWritable类,NullWritable类,ObjectWritable类
6.MapReduce编程基础
6.1 .MapReduce 程序在编写时,大体上分成三大模块-一-Mapper、 Reducer 和 Job。其中 Mapper 负责局部小任务的执行, Reducer负责汇总 Mapper 输出的结果并计算作业 ( Job )任务的最终结果, Job 负责整个作业任务的启动与运行。
6.2.JobClient 是用户提交的作业和 ResourceManager ( Hadoop 1 时代是 JobTracker )交互的主要接口 。JobClient 提供提交作业 、 追踪进程 、 访问子任务的日志记录、获得 MapReduce 集群状态信息等功能 。
InputFormat 为 MapReduce 作业描述输入的细节规范
OutputFormat 描述 MapReduce 作业的输出样式
6.3.MapReduce是Google公司发明的一种面向大规模海量数据处理的高性能并行计算平台和软件编程框架,是目前最为成功和最易于使用的大规模海量数据并行处理技术,广泛应用于搜索引擎(文档倒排索引,网页链接图分析与页面排序等)、Web日志分析、文档分析处理、机器学习、机器翻译等各种大规模数据并行计算应用领域
6.4.MapReduce并行处理的基本过程
1.有一个待处理的大数据,被划分为大小相同的数据块(如64MB),及与此相应的用户作业程序
2.系统中有一个负责调度的主节点(Master),以及数据Map和Reduce工作节点(Worker)
3.用户作业程序提交给主节点
4.主节点为作业程序寻找和配备可用的Map节点,并将程序传送给map节点
5.主节点也为作业程序寻找和配备可用的Reduce节点,并将程序传送给Reduce节点
6.主节点启动每个Map节点执行程序,每个map节点尽可能读取本地或本机架的数据进行计算
7.每个Map节点处理读取的数据块,并做一些数据整理工作(combining, sorting等)并将中间结果存放在本地;同时通知主节点计算任务完成并告知中间结果数据存储位置
8.主节点等所有Map节点计算完成后,开始启动Reduce节点运行;Reduce节点从主节点所掌握的中间结果数据位置信息,远程读取这些数据
9.Reduce节点计算结果汇总输出到一个结果文件即获得整个处理结果
6.5.计算优化:把一个Map计算任务让多个Map节点同时做,取最快完成者的计算结果
6.6.用数据分区解决数据相关性问题:在Map阶段进行了Combining以后,可以根据一定的策略对Map输出的中间结果进行分区(partitioning),这样既可解决以上数据相关性问题避免Reduce计算过程中的数据通信
6.7.MapReduce基本算法:分布式排序、
分布式GREP(文本匹配查找)、
关系代数操作(选择、投影、求交集、并集……)
、矩阵向量相乘
词频统计(Word count),词频重要性分析(TF-IDF)、
词频同现关系分析
、文档倒排索引
6.8.Mapper<LongWritable, Text, Text, IntWritable>的4 个参数的含义如下。
第l 个参数类型LongWritable : 输入key 类型,记录数据分片的偏移位置。
第2 个参数类型Text : 输入value 类型, 对应于分片中的文本数据。
第3 个参数类型Text : 输出key 类型,对应map 方法计算结果的key 值。
第4 个参数类型IntWritab le : 输出value 类型,对应map 方法计算结果的value 值。
6.9.作业(Job):MapReduce程序指
定的一个完整计算过
程
6.10.任务(Task)
MapReduce框架中
进行并行计算的基本
事务单元
6.11.MapReduce程序
我们编写的程序
6.12.JobClient
替程序与MapReduce运行框架交互的对象
6.13.JobTracker
MapReduce框架的管理者
、协调MapReduce作业、
分配任务
、监控任务
6.14.TaskTracker
执行JobTracker分配的任务、
分为Map和Reduce两类
6.15.一共分为Map(分解)、 Shuffle(重组/洗牌)、 Reduce(归并)三个阶段。
map阶段,每个节点调用程序员编写的map函数,作用于每一个在此节点存放的键值对,map函数的输出同样是一些键值对,中间结果进入shuffle阶段
shuffle阶段,shuffle系统自动完成,程序员无须也无法控制,shuffle阶段会把所有中间结果里的键相同的所有键-值对通过网络传递给同一个目标节点
在最后的reduce阶段,每个节点会对所有键相同的键值对调用程序员编写的reduce函数,输出最终结果。
6.16.作业初始化
1.1 MapReduce程序创建新的JobClient实例
1.2 JobClient向JobTracker请求获得一个新的JobId标识本次作业
1.3 JobClient将运行作业需要的相关资源放入作业对应的HDFS目录、
计算分片数量和map任务数量
1.4 向JobTracker提交作业,并获得作业的状态对象句柄
6.17.作业调度
2.1 作业提交请求放入队列等待调度
2.2 从HDFS中取出作业分片信息,创建对应数量的TaskInProgress调
度和监控Map任务
6.18.Map任务执行
4.1 从HDFS提取相关资源(Jar包、数据)
4.2 创建TaskRunner运行Map任务
4.3 在单独的JVM中启MapTask执行map函数
4.4 中间结果数据定期存入缓存
4.5 缓存写入磁盘
4.6 定期报告进度
6.19.Reduce任务执行
5.1 分配Reduce任务
5.2 创建TaskRunner运行Reduce任务
5.3 在单独的JVM中启动ReduceTask执行reduce函数
5.4 从Map节点下载中间结果数据
5.5 输出结果临时文件
5.6 定期报告进度
6.20.作业完成
6.1 JobClient轮询获知任务完成
6.2 通知用户
6.21.计算容错:TaskTracker
黑名单机制
Job黑名单:
-每个Job会维护一个TaskTracker黑名单
-集群黑名单:整个集群的TaskTracker黑名单
- 恢复:重启TaskTracker
6.22.文档倒排索引算法
1.一个倒排索引由大量的posting list构成
2.一个posting list由多个posting构成(按doc id排序)
3.
一个posting list与一个term关联
4.
一个posting包含一个document和其他的属性内容(称为payload)
5.
Payload上载有term在document中出现情况的相关信息
6.23.调优
1.部分属性除了配置文件之外还可以在MapReduce作业中动态修改
2.在MapReduce执行过程中,特别是Shuffle阶段,尽量使用内存缓冲区存储数据,减少磁盘溢写次数;同时在作业执行过程中增加并行度,都能够显著提高系统性能,这也是配置优化的一个重要依据。
3.由于每个Hadoop集群的机器和硬件之间都存在一定差别,所以Hadoop框架应根据其集群特性做配置优化
6.24.任务级别参数调优
Map Task和Reduce Task调优的一个原则就是减少数据的传输量、尽量使用内存、减少磁盘IO的次数,增大任务并行数,除此之外还有根据自己集群及网络的实际情况来调优。
6.25 优化
设置combiner
选择合适的writable类型
6.26.作业级别参数调优
1.合理规划任务数目
2.增加输入文件的副本数
3.启动推测执行机制
4.适当打开JVM重用功能
5.设置失败容忍度
6.设置任务超时时间
7.跳过坏记录
8.提高作业优先级
9.合理控制Reduce Task的启动时间
7.MapReduce高级编程
1.任务计数器主要包括 MapReduce任务计数器、内置的文件系统任务计数器、内置的输入文件任务计数器和内置的输出文件任务计数器
2.作业计数器由 YARN 应用的主机维护,主要进行 MapReduce 整个作业过程中主要属性的统计,它无须在网络间传输。
3.为了能在 WebUI 上查看计数器的结果 , 首先需要在配置文件 mapred-site且nl 中增加如下参数。
<property>
<name>mapreduce . jobhistory . address</name>
<value>master : 10020</value>
</property>
<property>
<name>mapreduce . jobhistory.webapp . address </口ame>
<value>master : l9888</value>
</property>
启动服务 ,命令如下 。
$ sbin/mr-jobhistory-daemon.sh start historyserver
4.内连接与外连接
内连接 : 交集,即两张表都符合筛选条件的值出现
左外连接 : 左表都显示,右表符合条件的值显示,不符合条件的记 NULL
右外连接 : 右表都显示 , 左表符合条件的值显示,不符合条件的记 NULL
全外连接 : 完整外部连接,返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,另一个表的选择列表列包含 NULL
5.Reduce 端连接很好理解,可以依据业务通过关联 key (类似 SQL 中的主键、外键)将多个大的数据集连接起来。
6.连接操作是由 Mapper 执行的操作,称之为 Map 端连接。
8.4 基于 HBase API 程序设计(P246)
1.对表进行管理的主要步骤如下:获取 HBase 集群资源信息-创建连接的工厂-创建 Admin 实例-添加列族描述符到表描述符中-表维护-检查表是否可用或者修改成功-关闭对象连接
2.数据库的初始基本操作通常被称为 CRUD ( Create, Read, Update, Delete ),具体指增、查、改、删 。 其中对表的管理操作主要由 Admin 类提供,对表数据的管理操作主要由 Table 类提供
3. 表数据管理的编辑步骤:获取 HBase 集群资源信息-创建连接-创建 tab le 实例-构造表信息,如 put、 get 、 de let巳对象的构造-通过 tab le 实例执行表的构造信息-如果是查询 ,此处可对查询出的内容进行读取和输出-关闭打开的资源
4.通过 Scan 技术可以对指定范围内的内容进行查询
5.过滤器:对行键、 列名或列值进行过滤,以减少服务器端通过网络返回到客户端的数据量
6.在应用过滤器时,按行键过滤时,使用 RowFilter;按列限定符过滤时,使用 QualifierFilter;按值过滤时 ,使用 SingleColumnYalu巳Filter , 这些过滤器可以用 SkipFilter 和 WbileMatchFilter 封装来添加更多的控制,也可以使用 FilterList 组合多个过滤器。
7.协处理器框架提供了直接在管理数据的 Region Server 上运行自定义代码的机制,帮助用户透明地完成这些工作 。
8.HBase 基本 Shell 操作
hbase shell:HBase Shell 启动
hbase(main) : 001 : 0> list:使用 List 命令查看当前 HBase 下的表格
create 'test table','faml': 建立一张表,表名为“ tes忧able”,现时建立一个名为“faml ”的列族 。
put 'test table','myrow - 1','faml : coll','value-1':
put 'test table','myrow - 2','faml : col2','value-2':把新增数据添加到这两个不同的行中
scan 'testtable':采用 scan 命令 , 查看表 “testable”中的所有数据。
delete 'test table','myrow - 2','faml : col2':删除表“ tes忧able”中行键为“myrow-2”,列为“faml:col2 '’ 的行。
disable ’ testtable '/drop ’ testtable ’:删除“ testtable ” 表。
9.HBase是一个分布式的、多版本的、面向列的开源数据库
利用Hadoop HDFS作为其底层存储系统,提供高可靠性、高吞吐、列存储、可伸缩、实时读写的数据库系统。
利用Hadoop MapReduce来处理HBase中的海量数据
利用Zookeeper作为协同服务。
10.HBase与传统关系数据库的对比分析
数据类型-数据操作-存储模式-数据索引-数据维护-可伸缩性
11.HBase中表的特点
大-面向列-稀疏-每个cell中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳-HBase中的数据都是字符串,没有类型-强一致性-水平伸缩-行事务-按列存储 + 三维有序-支持有限查询方式和一级索引-高性能随机读写-和Hadoop无缝集成
12.HBase 数据表中一些关键概念
1.Row key键:表中行的键是字节数组(最大长度是 64KB )
2.Column Family列族
3.Cell qualifier列族修饰符(列)
4.Timestamp时间戳
5.Region区域
6.Cell单元格
13.HFile分为六个部分:(Hfile的压缩支持两种方式:Gzip,Lzo)
1.Data Block 段:保存表中的数据
2.Meta Block段 (可选的):保存用户自定义的kv对,可以被压缩
3.File Info 段:HFile的元信息,不被压缩
4.Data Block Index 段:Data Block的索引
5.Meta Block Index段 (可选的):Meta Block的索引
6.Trailer段:这一段是定长的
14.HBase 体系结构
1.Client
2.Zookeeper
3.Master
4.Region Server
5.-ROOT-
6..META.
15.HBase 优化——客户端优化
1.客户端写
2.客户端读
HBase 优化——业务优化
HBase 优化——设计优化
1.充分利用硬件资源, Pre-Creating Regions
2.合理设计Row Key
3.少Column Family(低于3个为宜)
4.In Memory
5.Max Version
6.Time To Live
7.启用LZO压缩
9.4 HiveQL 基本查询
1. hive> DESC userinfo;表结构
SELECT * FROM userinfo;查询表中所有数据
SELECT DISTINCT address.province FROM userinfo ;查询用户都来自于哪些省,即查询 province 指定的值,且值不能重复
SELECT uname,salary :使用列值进行计算
SELECT uname , salary FROM userinfo LIMIT 2 ;LIMIT 查询前几行值-一取查询结果的前两条数据
SELECT uname,salary , address FROM userinfo WHERE country=’ AA ’; 指定分区数据查询
SELECT uname , salary , address FROM userinfo WHERE address.city LIKE '%Ch%’:查询所有城市中带有“ Ch ” 字样的信息
SELECT uname , address FROM user info WHERE address . city RLIKE ’.*( Harbin|WuChang).* ’:-查询所有城市是 Harbin 或 WuChang 的信息
2.嵌套 SELECT 语句
hive> FROM (
>SELECT uname , salary,
> salar y * (1- deductions[ ” I 口 come Taxes " ]-deductions [” Provident Fund"]-deductions[” Insurance”] ) AS l_salary
> FROM userinfo
> WHERE salary>7000
> ) t
> SELECT t.uname , t.salary,t.l salary
> ;
这里把整个查询结果当作一个表,并起了别名 t,即用 t 代表这张表。
3.Hive 函数
Hive 提供了很多内置的运算符及函数供用户使用总体上分为运算符、内置函数( 四川、内置聚合函数 ( UDAF )和内置表生成函数( UDTF )几大类。同时, Hive 也为用户提供了 UDF, UDTF 和 UDAF 的接口,供用户按业务需求进行自定义处理。
SHOW FUNCTIONS;-显示系统函数
SELECT uname , salary , address FROM userinfo WHERE salary<BOOO ;
SELECT uname , salary , address
> FROM userinfo
> WHERE uname IN (”Manager Li ”,” ManagerZha 。 ”):查询用户名在(”ManagerLi”,”ManagerZha。”)中的所有用户的用户名、工资等信息。
SELECT count(*) , avg(salary) FROM userinfo:求表中一共有多少员工,以及所有员工的平均薪水 。
4.GROUP BY 语句
> SELECT province , year(ymd) , sum(increase)
> FROM shoppinginfo
>GROUP BY province , year(ymd) :查询该店每个地区每年的销售总额
SELECT manager , year(ymd ), avg(increase )
> FROM shoppinginfo
> WHERE province =’ HLJ ’
>GROUP BY manager , year (ymd)
> HAVING avg (工 ncrease) >5:查询黑龙江地区(且J) 年销售额的平均增长大于 5 万元的店
>;
5.JOIN 语句
内连接(显示 ManagerSun 和 ManagerLi 两个店按天销售额的对比表)
> SELECT a.ymd, a . manager , a.increase , b . manager,b.increase
> FROM (SELECT ymd,increase , manager FROM s hoppinglnfo WHERE manager=’ ManagerLi ’) a
> INNER JOIN (SELECT ymd , 工ncrease,manager FROM shoppinglnfo WHERE manager=’ ManagerSun ’ ) b > ON a . ymd=b.ymd ;
左外连接
> SELECT a .ymd , a . manager , a.increase , b . manager , b . increase
> FROM (SELECT ymd , increase , manager FROM s hoppi nginfo WHERE manager=’ Manager Li 『 ) a
> LEFT OUTER JOIN (SELECT ymd , 工 ncrease , manager FROM shoppinginfo WHERE manager=’ ManagerSun ’ ) b
> ON a.ymd=b . ymd ;
右外连接
> SELECT a .ymd , a.manager , a . increase , b . manager , b . increase
>FROM (SELECT ymd , increase , manager FROM shoppinginfo WHERE manage r =’ ManagerLi ’ ) a
>RIGHT OUTER JOIN (SELECT ymd , increase, manager FROM shoppinginfo WHEREma nager=’ Manage r Sun ’) b
> ON a . ymd=b . ymd ;
全外连接
> SELECT a.ymd , a.ma 口ager , a . 工 ncrease , b . manager , b . increase
>FROM (SELECT ymd , increase ,manager FROM shoppinginfo WHERE manager=’ Manage r Li ’) a
> FULL OUTER JOIN (SELECT ymd ,工口 crease , manager FROM shoppinginfo WHERE manager=『 ManagerSun ’) b
> ON a . ymd=b.ymd ;
Map 连接
Map 连接可以利用分桶的表,因为作用于桶的 Mapper 加载右侧表中对应的桶,即可执行连接 。这时使用的语法和前面提到的在内存中进行连接是一样的 , 只不过还需要用下面的语法启用优化选项 。
SET hive . optirnize.bucketrnapjoin=true;
多表连接
> SELECT a . yrnd , a . rnanager,a . increase , b . rnanager , b 工 ncrease , c . rnanager , c . 1ncrease
> FROM shoppinginfo a
> JOIN shoppinginfo b ON a . yrnd = b . yrnd
> JOIN shoppinginfo c ON a . 严nd = c. yrnd ;
6.UNION ALL 语句:UNION 丛L 可以将两个或多个表进行合并。每个 UNION 子查询都必须具有相同的列,而且对应的每个字段的字段类型必须是一致的 。
7.ORDER BY 和 SORT BY 语句
SELECT *
> FROM shoppinginfo
>ORDER BY to_da te(ymd ) ASC , increase DESC;使用 ORDER BY 实现该连锁店按日期升序、销售额降序排序的排名表。
SELECT *( SORT BY 只能保证每个 Reducer 的输出是局部有序的,那么不同 Reducer 的输出就可能会有重叠。)
> FROM shoppinginfo
>SORT BY to_date(ymd) ASC , increase DESC;使用 SORT BY 实现该连锁店按日期升序、销售额降序排序的排名表。
8.含有 SORT BY 的 DISTRIBUTE BY 语句
SELECT *
> FROM shoppinginfo
> DISTRIBUTE BY manager
>SORT BY to_date(ymd) ASC , increase DESC ;
实现该连锁店按日期升序、销售额降序排序的排列表,确保所有具有相同 Manager 的行最终都在同一个 Reducer分区中 。
如果 SORT BY 和 DIST阳BUTE BY 中所用的列相同 , 可以缩写为 CLUSTER BY , 以便同时指定两者所用的列。
9.CLUSTER BY 语句
使用 DISTRIBUTE BY···SORTBY 语句或其简化版的 CLUSTER BY 语句,会剥夺 SORT BY 的并行性 , 然而这样可以使输出文件的数据是全局排序的 。
查询数据库:show databases;
模糊搜索表:show tables like '*name*';
删除数据库:drop database dbname;
删除数据表:drop table tablename;
查看表结构信息:desc table_name;
查看详细表结构信息: desc formatted table_name;
查看分区信息: show partitions table_name;
查看hdfs文件列表信息:hadoop fs -ls /user/hive/warehouse/
查看hdfs文件内容:hadoop fs -cat /user/hive/warehouse/file.txt
Hadoop的理解笔记的更多相关文章
- Hadoop入门学习笔记---part3
2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...
- Hadoop入门学习笔记---part2
在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...
- Hadoop入门学习笔记---part1
随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...
- Hadoop入门学习笔记---part4
紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...
- batch normalization学习理解笔记
batch normalization学习理解笔记 最近在Andrew Ng课程中学到了Batch Normalization相关内容,通过查阅资料和原始paper,基本上弄懂了一些算法的细节部分,现 ...
- Hadoop入门学习笔记总结系列文章导航
一.为何要学习Hadoop? 这是一个信息爆炸的时代.经过数十年的积累,很多企业都聚集了大量的数据.这些数据也是企业的核心财富之一,怎样从累积的数据里寻找价值,变废为宝炼数成金成为当务之急.但数据增长 ...
- Hadoop入门学习笔记(一)
Week2 学习笔记 Hadoop核心组件 Hadoop HDFS(分布式文件存储系统):解决海量数据存储 Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度 Hadoop Map ...
- Hadoop概括——学习笔记<一>
之前有幸在MOOC学院抽中小象学院hadoop体验课. 这是小象学院hadoop2.X概述第一章的笔记 第一章主要讲的是hadoop基础知识.老师讲的还是比较全面简单的,起码作为一个非专业码农以及数据 ...
- 学习Hadoop整体理解
HDFS是Hadoop的核心模块之一,围绕HDFS是什么.HDFS的设计思想和HDFS的体系结构三方面来介绍. Hadoop的设计思想受到Google公司的GFS设计思想的启示,基于一种开源的理念实现 ...
随机推荐
- ICEM-缺角正方体(拓块)
原视频下载地址:https://yunpan.cn/cqFIqQWrNqzNc 访问密码 6fb4
- OpenResty之ngx.shared.DICT
参考链接: resty.core.shdict ngx_shared.DICT 源码正文: dict.lua 部分源码如下: local ffi = require 'ffi' local base ...
- httpPostedFile实现WEBAPI文件上传
public void PostUpload() { var httpPostedFile = HttpContext.Current.Request.Files; foreach(string p ...
- 【Oracle/Java】多表插删数据单多线程比较
源码下载:https://files.cnblogs.com/files/xiandedanteng/OracleAccessComparison20191117.rar 做这个比较工程初衷是:我在单 ...
- SQL-W3School-函数:SQL HAVING 子句
ylbtech-SQL-W3School-函数:SQL HAVING 子句 1.返回顶部 1. HAVING 子句 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使 ...
- AppCompatTextView可改变文本字体大小
有这样一个需求,要求在一个列表中的每个条目中展示字数不限个数的文本.而且每个条目的宽度都是固定的,展示的文本如果过长,不可以用省略号显示,只能动态的调整(缩小)文本的字号来达到文本能完全显示的效果,而 ...
- Windows 操作系统 端口转发
在Windows 下可以使用netsh interface portproxy 命令实现端口转发功能. 例:netsh interface portproxy add v4tov4 listenpor ...
- JavaScript——closures(待续)
问答原文:How do JavaScript closures work?
- FastCGI模式下安装Xcache
PHP执行的时候,会被编译成opcode,然后 zend引擎会执行opcode.也就是说,如果你两次执行同一个php程序,每次执行,他都要把php代码编译成opcodexcache的意义在于,当你第一 ...
- self-attention详解
编写你自己的 Keras 层 对于简单.无状态的自定义操作,你也许可以通过 layers.core.Lambda 层来实现.但是对于那些包含了可训练权重的自定义层,你应该自己实现这种层. 这是一个 K ...