赞
踩
4个V:
本文所涉及到的相关简写介绍如下:
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。主要解决:海量数据的存储和分析计算的问题。(大数据技术涉及到的问题有:海联数据的收集、存储和计算。)
广义上Hadoop通常指一个更广泛的概念——Hadoop生态圈。
1)Hadoop创始人Doug Cutting,为了实现与Google类似的全文搜索功能,他在Lucene框架基础上进行优化升级,查询引擎和索引引擎。
2)2001年年底Lucene成为Apache基金会的一个子项目。
3)对于海量数据的场景,Lucene框架面对与Google同样的困难,存储海量数据困难,检索海量速度慢。
4)学习和模仿Google解决这些问题的办法 :微型版Nutch。
5)可以说Google是Hadoop的思想之源(Google在大数据方面的三篇论文):
GFS —>HDFS
Map-Reduce —>MR
BigTable —>HBase
6)2003-2004年,Google公开了部分GFS和MapReduce思想的细节,以此为基础Doug Cutting等人用
了2年业余时间实现了DFS和MapReduce机制,使Nutch性能飙升。
7)2005 年Hadoop 作为 Lucene的子项目 Nutch的一部分正式引入Apache基金会。
8)2006 年 3 月份,Map-Reduce和Nutch Distributed File System (NDFS)分别被纳入到 Hadoop 项目
中,Hadoop就此正式诞生,标志着大数据时代来临。
9)名字来源于Doug Cutting儿子的玩具大象
Hadoop 三大发行版本:Apache、Cloudera、Hortonworks。
Apache 版本最原始(最基础)的版本,对于入门学习最好。2006
Cloudera 内部集成了很多大数据框架,对应产品 CDH,PaaS。2008
Hortonworks 文档较好,对应产品 HDP,PaaS。2011
Hortonworks 现在已经被 Cloudera 公司收购,推出新的品牌 CDP。
1)高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元 素或存储出现故障,也不会导致数据的丢失。
2)高扩展性:在集群间分配任务数据,可方便的动态扩展数以千计的节点。
3)高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。
4)高容错性:能够自动将失败的任务重新分配。
Hadoop Distributed File System,简称 HDFS,是一个分布式文件系统。
Yet Another Resource Negotiator 简称 YARN ,另一种资源协调者,是 Hadoop 的资源管理器。
MapReduce 将计算过程分为两个阶段:Map 和 Reduce
经由客户端client提交一个Task给ResouceManager,RM选择一台节点建立Container将此Task的APP Mstr放入,然后APP Mstr通过分析任务向RM申请计算资源,RM将对应的计算资源分配给APP Mstr进行MapTask的计算,计算结束后将新建一个ReduceTask接受Map Task的结果,然后将结果进行汇总、存储并报告NameNode进行记录,然后SecondaryNameNode一段时间后也会根据NameNode的内容进行更新。
图中涉及的技术名词解释如下:
(这一节配合PDF以及思维导图进行学习。)
(这一节配合PDF以及思维导图进行学习。)
(这一节配合PDF以及思维导图进行学习。)
优点:
缺点:
1)NameNode(NN):就是Master,它是一个主管、管理者,存储着整个集群所有数据的相关信息。
(1)管理HDFS的名称空间;
(2)配置副本策略;
(3)管理数据块(Block)映射信息;
(4)处理客户端读写请求。
2)DataNode:就是Slave。NameNode下达命令,DataNode执行实际的操作。
(1)存储实际的数据块;
(2)执行数据块的读/写操作
3)Client:能够对HDFS文件系统进行操作的地方就等价于客户端。
(1)文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传;
(2)与NameNode交互,获取文件的位置信息;
(3)与DataNode交互,读取或者写入数据;
(4)Client提供一些命令来管理HDFS,比如NameNode格式化;
(5)Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作;
4)Secondary NameNode:并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。
(1)辅助NameNode,分担其工作量,比如定期合并Fsimage镜像文件和Edits,并推送给NameNode;
(2)在紧急情况下,可辅助恢复NameNode。
HDFS中的文件在物理上是分块存储(Block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在Hadoop2.x/3.x版本中是128M,1.x版本中是64M。
思考:为什么块的大小不能设置太小,也不能设置太大?
(1)HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置;
(2)如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢。
总结:HDFS块的大小设置主要取决于磁盘传输速率,。
hadoop fs + 命令 === hadoop dfs + 命令
1)-moveFromLocal:从本地剪切粘贴到 HDFS
[atguigu@hadoop102 hadoop-3.1.3]$ vim shuguo.txt
输入:
shuguo
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -moveFromLocal ./shuguo.txt /sanguo
2)-copyFromLocal:从本地文件系统中拷贝文件到 HDFS 路径去
[atguigu@hadoop102 hadoop-3.1.3]$ vim weiguo.txt
输入:
weiguo
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -copyFromLocal weiguo.txt /sanguo
3)-put:等同于 copyFromLocal,生产环境更习惯用 put
[atguigu@hadoop102 hadoop-3.1.3]$ vim wuguo.txt
输入:
wuguo
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -put ./wuguo.txt /sanguo
4)-appendToFile:追加一个文件到已经存在的文件末尾
[atguigu@hadoop102 hadoop-3.1.3]$ vim liubei.txt
输入:
liubei
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -appendToFile liubei.txt /sanguo/shuguo.txt
1)-copyToLocal:从 HDFS 拷贝到本地
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -copyToLocal /sanguo/shuguo.txt ./
2)-get:等同于 copyToLocal,生产环境更习惯用 get
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -get /sanguo/shuguo.txt ./shuguo2.txt
1)-ls: 显示目录信息
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -ls /sanguo
2)-cat:显示文件内容
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -cat /sanguo/shuguo.txt
3)-chgrp、-chmod、-chown:Linux 文件系统中的用法一样,修改文件所属权限
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -chmod 666 /sanguo/shuguo.txt
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -chown atguigu:atguigu /sanguo/shuguo.txt
4)-mkdir:创建路径
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /jinguo
5)-cp:从 HDFS 的一个路径拷贝到 HDFS 的另一个路径
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -cp /sanguo/shuguo.txt /jinguo
6)-mv:在 HDFS 目录中移动文件
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mv /sanguo/wuguo.txt /jinguo
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mv /sanguo/weiguo.txt /jinguo
7)-tail:显示一个文件的末尾 1kb 的数据
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -tail /jinguo/shuguo.txt
8)-rm:删除文件或文件夹
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -rm /sanguo/shuguo.txt
9)-rm -r:递归删除目录及目录里面内容
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -rm -r /sanguo
10)-du 统计文件夹的大小信息
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -du -s -h /jinguo
27 81 /jinguo
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -du -h /jinguo
14 42 /jinguo/shuguo.txt
7 21 /jinguo/weiguo.txt
6 18 /jinguo/wuguo.tx
说明:27 表示文件大小;81 表示 27*3 个副本总共的大小;/jinguo 表示查看的目录
11)-setrep:设置 HDFS 中文件的副本数量
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -setrep 10 /jinguo/shuguo.txt
这里设置的副本数只是记录在 NameNode 的元数据中,是否真的会有这么多副本,还得看 DataNode 的数量。因为目前只有 3 台设备,最多也就 3 个副本,只有节点数的增加到 10台时,副本数才能达到 10。
本地文件想要上传到HDFS中:
在 HDFS 写数据的过程中,NameNode 会选择距离待上传数据最近距离的 DataNode 接收数据。那么这个最近距离怎么计算呢?
节点距离:两个节点到达最近的共同祖先的距离总和。
备份的数量为3的时候:
那如果备份数量是3个以上呢?怎么选择节点?
本地客户端想要从集群中拉取数据:
(但是实际企业实践中我们不用2NN,我们会设置NameNode的高可用,两个NameNode。)
下图就是NN中所存储的信息:
2NN中的内容如下图:
思考:NameNode 中的元数据是存储在哪里的?
对于SecondaryNameNode:
DataNode中存储的文件如下图:
在DN本地会对数据进行CRC-32校验生成校验码,在Client想DN申请数据时,会将所需的数据以及生成的校验信息一同发给Client,然后Client在本地在使用CRC-32循环校验生成检验码,查看与DN传输来的是否一致,借此来判断数据是否发生损坏。
在DN本地会对数据进行CRC-32校验生成校验码,在Client想DN申请数据时,会将所需的数据以及生成的校验信息一同发给Client,然后Client在本地在使用CRC-32循环校验生成检验码,查看与DN传输来的是否一致,借此来判断数据是否发生损坏。
下述的设置推荐在最一开始配置集群的时候进行操作,因为涉及到多次集群重启。
详细的设置参数查看PDF06,具体可以设置:
MapReduce 是一个分布式运算程序的编程框架,是用户开发“基于 Hadoop 的数据分析应用”的核心框架。
MapReduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个 Hadoop 集群上。
优点:
缺点:
WordCount案例
一个完整的 MapReduce 程序在分布式运行时有三类实例进程:
(1)MrAppMaster:负责整个程序的过程调度及状态协调。
(2)MapTask:负责 Map 阶段的整个数据处理流程。
(3)ReduceTask:负责 Reduce 阶段的整个数据处理流程。
什么是序列化?
为什么要序列化?
为什么不用java自己的Serializable框架,而使用Writable?
在企业开发中往往常用的基本序列化类型不能满足所有需求,比如在 Hadoop 框架内部传递一个 bean 对象,那么该对象就需要实现序列化接口。
具体实现 bean 对象序列化步骤如下 7 步。
(1)必须实现 Writable 接口
(2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造
public FlowBean() {
super();
}
(3)重写序列化方法
@Override
public void write(DataOutput out) throws IOException {
out.writeLong(upFlow);
out.writeLong(downFlow);
out.writeLong(sumFlow);
}
(4)重写反序列化方法
@Override
public void readFields(DataInput in) throws IOException {
upFlow = in.readLong();
downFlow = in.readLong();
sumFlow = in.readLong();
}
(5)注意反序列化的顺序和序列化的顺序完全一致
(6)要想把结果显示在文件中,需要重写 toString(),可用"\t"分开,方便后续用。
(7)如果需要将自定义的 bean 放在 key 中传输,则还需要实现 Comparable 接口,因为
MapReduce 框中的 Shuffle 过程要求对 key 必须能排序。详见后面排序案例。
@Override
public int compareTo(FlowBean o) {
// 倒序排列,从大到小
return this.sumFlow > o.getSumFlow() ? -1 : 1;
}
Job提交流程源码解析
我们具体在集群上运行任务时,该怎样分配机器(MapTask)的数量,来完成这个job任务呢?肯定与任务的规模相关,大一点的任务我们分配较多的机器来提高任务处理的并行度;小一点的我们分配的机器也就小一点。
那么这个标准是什么呢?该怎么划分呢?
splitSize = computeSplitSize(
blockSize,
Math.max(1, ("mapreduce.input.fileinputformat.split.minsize"中的设定值)),
(("mapreduce.input.fileinputformat.split.maxsize"), Long.MAX_VALUE); // 如果前面的设定值存在,则取设定值,否则取Long.MAX_VALUE的值
protected long computeSplitSize(long blockSize, long minSize, long maxSize) {
return Math.max(minSize, Math.min(maxSize, blockSize)); // 默认每一个切片的大小等于数据分块的大小
}
// 使用 输入的文件数据的大小/切片的大小 如果大于SPLIT_SLOP(数值1.1)才会进行后续切片。
// 这里说明一个split的最大的大小为split设定值的1.1倍。
while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);
splits.add(makeSplit(path, length-bytesRemaining, splitSize,
blkLocations[blkIndex].getHosts(), blkLocations[blkIndex].getCachedHosts()));
bytesRemaining -= splitSize;
}
我们在编写MapReduce程序时,输入文件的格式有很多:比如基于行的日志文件、二进制格式文件、数据库的表等。我们上述的案例都是使用的默认的TextInputFormat格式来按行获取输入数据,它并不能满足所有的数据输入情况。除了这个数据的输入格式之外,我们还有KeyValueTextInputFormat、NLineInputFormat、CombineTextInputFormat 和自定义 InputFormat 等格式。
TextInputFormat 是默认的 FileInputFormat 实现类。按行读取每条记录。键是存储该行在整个文件中的起始字节偏移量, LongWritable 类型。值是这行的内容,不包括任何行终止符(换行符和回车符),Text 类型。
以下是一个示例,比如,一个分片包含了如下 4 条文本记录。
Rich learning form
Intelligent learning engine
Learning more convenient
From the real demand for more close to the enterprise
每条记录表示为以下键/值对:
(0,Rich learning form)
(20,Intelligent learning engine)
(49,Learning more convenient)
(74,From the real demand for more close to the enterprise)
默认的 TextInputFormat 切片机制是对任务按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个 MapTask,这样如果有大量小文件,就会产生大量的MapTask,处理效率极其低下。
Shuffle指的是Map方法之后,Reduce方法之前数据的处理过程。
Shuffle过程的图示:
默认的Partition分区的划分方法是根据数据对中key的hashCode值对ReduceTasks个数取模获得的,用户不能控制哪个key值划分到某个分区。
但是我们可以重写Partitioner方法,来实现想要的分区划分方式。
ReduceTask的数量和getPartition的数量设置关系:
1)分区号必须从零开始设置,逐一累加。 理论上好像分区号好像可以随便划分,只要其数目能对上你最终的想要结果就行,但反映到具体的分区序号的数值上必须从0开始逐一增加,因为这个数值是和ReduceTask一一对应的,并不只是数值上的相等。(在源码中有一步会判断这个:partition < 0 || partition >= partitions,如果这个表达式为真则会报异常。而partition代表当前数据所属的分区号,partitions代表了任务会申请几个ReduceTask来进行处理,过多的ReduceTask会白白浪费资源。)
2)如果ReduceTask的数量 > getPartition的结果数,则会多产生几个空的输出文件part-r-000xx;
3)如果1 < ReduceTask的数量 < getPartition的结果数,则有一部分分区数据无处安放,会Exception;
4)如果ReduceTask的数量 = 1,则不管MapTask端输出多少个分区文件,最终结果都交给这一个
ReduceTask,最终也就只会产生一个结果文件 part-r-00000;
例如:假设自定义分区数为5,则
(1)job.setNumReduceTasks(1); // 会正常运行,只不过会产生一个输出文件,失去了分区为5个的效果
(2)job.setNumReduceTasks(2); // 会报错
(3)job.setNumReduceTasks(6); // 大于5,程序会正常运行,多余的序号会产生空文件
在Hadoop中Key对象一定是要能够进行排序的,否则就无法使用Hadoop的框架,这是因为在Hadoop的业务处理MapReduce中最后一步Reduce阶段需要将所有Key相同的数据进行聚合,如果数据是无序的每次在聚合相同的Key值时,都要遍历数据才行了。
对于MapTask,它会将处理的结果暂时放到环形缓冲区中,当环形缓冲区使用率达到一定阈值后,再对缓冲区中的数据进行一次快速排序,并将这些有序数据溢写到磁盘上,而当数据处理完毕后,它会对磁盘上所有文件进行归并排序。
对于ReduceTask,它从每个MapTask上远程拷贝相应的数据文件,如果文件大小超过一定阈值,则溢写磁盘上,否则存储在内存中。如果磁盘上文件数目达到一定阈值,则进行一次归并排序以生成一个更大文件;如果内存中文件大小或者数目超过一定阈值,则进行一次合并后将数据溢写到磁盘上。当所有数据拷贝完毕后,ReduceTask统一对内存和磁盘上的所有数据进行一次归并排序。
排序方法的分类:
OutputFormat是MapReduce输出的基类,所有实现MapReduce输出都实现了OutputFormat
接口。下面我们介绍几种常见的OutputFormat实现类。
默认的输出格式是TextOutputFormat。我们还可以根据自己的需求自定义数据的输出格式,以满足我们的实际需求,像是输出到数据库等数据存储仓库中。
步骤:
1.自定义一个Output类继承FileOutputFormat。
2.改写RecordWriter中的write()方法使其满足我们的需求。
MapTask的数据处理步骤:
回顾:MapTask 并行度由切片个数决定,切片个数由输入文件的个数(可以通过设置输入数据的类型为CombineTextInputFormat来对小文件进行聚合)和切片规则决定(max(1, min(Long.MAX_VALUE, blockSize)),默认为blockSIze)。
思考:ReduceTask 并行度由谁决定?
1 ) 设置 ReduceTask 并行度(个数)
ReduceTask 的并行度同样影响整个 Job 的执行并发度和执行效率,但与 MapTask 的并发数由切片数决定不同,ReduceTask 数量的决定是可以直接手动设置:
// 默认值是 1,手动设置为 4
job.setNumReduceTasks(4);
注意事项:
首先我们在map阶段将数据处理成TableBean对象,然后使用Pid作为Key,方便进行分区和排序以及后续的Reduce阶段的数据拉取任务。这样在Reduce阶段具有相同Key值也就是Pid值的数据就会同时被进行处理,然后我们从存储了商品名称的的TableBean对象中取出商品名称,然后赋值给存储了订单信息的TableBean对象,这样就完成了两张表的join操作。
数据清洗ETL,是用来描述将数据从来源端经过抽取Extract、转换Transform、加载Load至目的端的过程。ETL一词较常用在数据仓库,但不仅限于数据仓库。
在运行核心业务 MapReduce 程序之前,往往要先对数据进行清洗,清理掉不符合用户要求的数据。清理的过程往往只需要运行 Mapper 程序,不需要运行 Reduce程序(job.setNumReduceTask(0))。
MapReduce处理流程:
1 ) 输入数据接口:InputFormat。
2 ) 逻辑处理接口:Mapper,用户根据业务需求实现其中三个方法:
3 )Partitioner 分区
4 )Comparable 排序
5 )Combiner 合并
6 ) 逻辑处理接口:Reducer用户根据业务需求实现其中三个方法:
7 ) 输出数据接口:OutputFormat
压缩的优点:减少磁盘IO(数据量少,你传输数据的时候也就读取次数少)、减少占用的磁盘空间 ?(不理解,为什么?存储的时候确实是省空间了,但是用的时候不还得解压吗?)
压缩的缺点:会增加CPU的开销(多了一个加压和解压的过程,都需要使用CPU进行操作
压缩算法 | Hadoop是否自带 | 算法 | 文件扩展名 | 是否可以切片 | 进行压缩后,原始程序是否需要进行修改 | 优点 | 缺点 |
---|---|---|---|---|---|---|---|
DEFLATE | 是,直接使用 | DEFLATE | .deflate | 否 | 和文本处理一样,不需要修改 | - | - |
Gzip | 是,直接使用 | DEFLATE | .gz | 否 | 和文本处理一样,不需要修改 | 压缩率较高 | 不支持切片;压缩和解压缩速度一般 |
bzip2 | 是,直接使用 | bzip2 | .bz2 | 是 | 和文本处理一样,不需要修改 | 压缩率高,支持切片 | 压缩和解压缩速度慢 |
LZO | 否,需要安装并编译 | LZO | .lzo | 是 | 需要建立索引,还需要指定输入格式 | 压缩和解压缩速度快;支持切片 | 压缩率一般;想要切片的话需要额外创建索引 |
Snappy | 是,直接使用 | Snappy | .snappy | 否 | 和文本处理一样,不需要修改 | 压缩和解压缩速度极快 | 不支持切片;压缩率一般 |
压缩性能对比: | |||||||
压缩算法 | 原始文件大小 | 压缩后文件大小 | 压缩速度 | 解压速度 | |||
– | – | – | – | – | |||
gzip | 8.3g | 1.8g | 17.5MB/s | 58MB/s | |||
bzp2 | 8.3g | 1.1g | 2.4MB/s | 9.5MB/s | |||
LZO | 8.3g | 2.9g | 49.3MB/s | 74.6MB/s |
查看案例
查看PDF
Yarn 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而 MapReduce 等运算程序则相当于运行于操作系统之上的应用程序。
YARN 主要由 ResourceManager、NodeManager、ApplicationMaster 和 Container 等组件构成。
这里可以画一个思维导图,将三者的合作关系串联起来
Hadoop中Yarn的作业调度器算法有三种:FIFO先来先服务、容量Capacity Scheduler和公平Fair Scheduler算法。ApacheHadoop默认的资源调度器是Capacity Scheduler。CDH的Hadoop默认是Fair Scheduler算法。
具体设置详见:yarn-default.xml 文件
<property>
<description>The class to use as the resource scheduler.</description>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
Capacity Scheduler 是 Yahoo 开发的多用户调度器。
Fair Schedulere 是 Facebook 开发的多用户调度器。
什么是缺额?某时刻一个作业应该获取的资源和实际获取资源的差距叫“缺额”。
公平调度器中队列资源的分配方式:
yarn application -list
yarn application -list -appStates FINISHED
yarn application -kill application_1612577921195_0001
yarn logs -applicationId application_1612577921195_0001
yarn logs -applicationId application_1612577921195_0001 -containerId container_1612577921195_0001_01_000001
yarn applicationattempt -list application_1612577921195_0001
yarn applicationattempt -status appattempt_1612577921195_0001_000001
yarn container -list appattempt_1612577921195_0001_000001
yarn container -status container_1612577921195_0001_01_000001
注:只有在任务运行的期间才能看到 container 的状态,因为一旦任务运行结束container容器就会被释放。
yarn node -list -all
yarn rmadmin -refreshQueues
yarn queue -status default
具体情况具体分析,样例配置见PDF
在默认情况下,Hadoop的ResourceManager调度器中只有一个Default队列,实际上有点像FIFO调度,不能够满足实际的生产要求。
在真实的生产环境中,一般是按照业务逻辑模块来创建多个队列,像是登录注册队列,购物车队列,下单,业务部门1,业务部门2等。
创建多个队列的好处是:
见PDF
容量调度器,支持任务优先级的配置,在资源紧张时,优先级高的任务将优先获取资源。默认情况,Yarn 将所有任务的优先级限制为 0,若想使用任务的优先级功能,须开放该限制。
创建两个队列,分别是 test 和 atguigu(以用户所属组命名)。期望实现以下效果:若用户提交任务时指定队列,则任务提交到指定队列运行;若未指定队列,test 用户提交的任务到 root.group.test 队列运行,atguigu 提交的任务到 root.group.atguigu 队列运行(注:group 为用户所属组)。
公平调度器的配置涉及到两个文件,一个是 yarn-site.xml,另一个是公平调度器队列分配文件 fair-scheduler.xml(文件名可自定义)。
在使用tool接口后,我们就能够使用一个jar来执行多个hadoop样例,方法和操作与hadoop中提供的example相同,还可以用来指定运行任务的队列。详情见yarndemo
实际工作中的参数调优按照PDF06文档中10.3的流程走一遍。
171
1)所谓HA(High Available),即高可用(7*24小时不中断服务)。
2)实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。也就是说,HA的工作机制是配置两个NameNode,通过双NameNode消除单点故障。
3)Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)。
4)NameNode主要在以下两个方面影响HDFS集群
NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启
NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用
HDFS HA功能通过配置Active/Standby两个NameNodes实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。
在启动namenode之前,需要启动hadoop2.x中新引入的(QJM)Quorum Journal Manager,QJM主要用来管理namenode之间的数据同步,当active namenode数据更新时会传递给QJM,QJM在所有的namenode之间同步,最后QJM将active namenode 更新的数据同步到了standby namenode中。
启动多个namenode时,并配置namenode的主机地址,还要配置隔离机制,因为容易出现SB(split-brain)状况,所谓的sb状况意思就是当多个namenode正常状态时,一台active,多台standby。如果某段时间因为网络等非namenode自身关系导致namenode间交流阻断了,这样容易出现多台active的设备,容易抢占资源等。
引入zookeeper来对namenode进行监听,因为在一般情况下,active 的namenode崩溃了的话,需要人工切换standby Namenode为active,非常不人性化。通过zookeeper可以监听多个namenode,当active namenode崩溃的话,zookeeper监听到后马上通知zookeeper的leader进行主备选举,在standby namenode中选举出一台,并将它置为active模式替换崩溃的namenode。
自动故障转移为HDFS部署增加了两个新组件:ZooKeeper和ZKFailoverController(ZKFC)进程,如下图所示。ZooKeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。
HA的自动故障转移依赖于ZooKeeper的以下功能:
ZKFC是Hadoop中HA自动故障转移中的另一个新组件,是ZooKeeper的客户端,也监视和管理NameNode的状态。
每个运行NameNode的主机也运行了一个ZKFC进程,ZKFC负责:
配置过程查看word文件…\尚硅谷大数据技术之HadoopHA\1.笔记\尚硅谷大数据技术之Hadoop(HDFS).docx
HDFS数据块:
与一般文件系统一样,HDFS也有块(block)的概念,HDFS上的文件也被划分为块大小的多个分块作为独立的存储单元。
HDFS中小于一个块大小的文件不会占据整个块的空间(当一个1MB的文件存储在一个128MB的块中时,文件只使用1MB的磁盘空间,而不是128MB)
为什么不能太小?
为什么不能太大?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。