大数据hadoop平台 - nodebb€¦ · hadoop distributed file system...
TRANSCRIPT
大数据Hadoop平台Jordan Li 08/08/2016
►Hadoop 平台核心架构►HDFS主要概念、架构与运行机制►演示:HDFS常用命令&配置►Yarn 主要概念、架构与运行机制►演示:Yarn 常用命令&配置►Mapreduce编程入门&演示►Mapreduce调优&最佳实践►Hadoop Benchmark性能测试
Agenda
►一个可扩展的、容错性强的分布式文件系统和并行计算环境►让用户可以便捷的处理海量数据►Apache软件基金会►Google inspired Yahoo! ►谁在用?中移动, Intel, IBM, Facebook, Amazon, BAT......►用来做什么? 日志分析、倒排索引、 排序、图像转换、广告分析...
Hadoop简介
Hadoop架构
►Hadoop Distributed File System►为大文件设计(海量小文件问题)►Write-once-read-many访问模型►不建议大量随机读,不支持对文件修改►High throughput .vs. low latency►Commodity hardware – 错误检测/快速恢复
HDFS 简介
►Namenode►SecondaryNamenode►StandbyNamenode►Datanode►Client►Block, Replication
HDFS主要概念
ApacheHadoop2.7.1– HDFSArchitecturehttp://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
►读取文件:lClient向NameNode发起文件读取的请求lNameNode返回文件存储的DataNode的信息lClient读取文件信息
►写入文件lClient向Namenode发起文件写入的请求lNamenode根据文件大小和block配置大小返回Datanode的信息lClient将文件划分为多个block,按地址依次写入Datanode
HDFS的文件操作
HDFS文件读取基本过程
HDFS 文件写入基本过程
►sbin/start-dfs.sh stop-dfs.sh►bin/hdfs dfs -ls/-mkdir/-rm/-put/-get►bin/hdfs dfsadmin -report/-safemode/-refreshNodes►bin/hdfs fsck -files -blocks►bin/hdfs getconf -confKey <property>►sbin/start-balancer.sh►core-site.xml, hdfs-site.xml, hadoop-env.sh
演示:HDFS 基本操作&配置文件
HDFS High Availability
►MapReduce V1的几个缺陷l扩展性受限l单点故障l难以支持MR之外的计算
►多计算框架各自为战lMR: 离线计算lStorm: 实时计算lSpark: 内存计算
YARN 产生背景
YARN模块组成
YARN 架构
YARN容错机制
YARN资源调度器
YARN运行流程分析
►sbin/start-yarn.sh stop-yarn.sh►bin/yarn node ►bin/yarn application►yarn-env.sh, yarn-site.xml
演示:Yarn 基本操作&配置文件
lNutch项目--开源的网络搜索引擎lGoogle公司发表的Mapreduce论文lDougCutting基于java设计开发了mapreduce并行计算框架和系统,集成在Hadoop项目中l成为Apache旗下顶级项目l极为成功,广为接受,易于使用的大数据并行处理技术.
MapReduce简介
l分治法:将一个复杂问题,分成若干个简单的子问题进行解决,然后对子问题的结果进行合并,得到原有问题的解.l
lMap:将大任务拆分成小的子任务,并且完成子任务的计算
lReduce:将中间结果合并成最终结果
基本思想
l易于编程l良好的扩展性lDataLocalityl高容错性l提供状态监控工具
Mapreduce 特性
lMapreducejob将输入数据切分成小块,每一小块会分配给一个map处理,多个map之间并行运行lMapreduce框架会对map的输出进行排序lReduce端会拉取map的处理结果,进行后续的处理l输入输出都保存在hdfs中,框架本身会调度相应的map/reducetask,并进行监控和容错.lMap和reduce的输入输出都是<key,value>对
Mapreduce计算框架
►bin/hadoop jar *.jar <main class> <input path>►<output path>►Job history server►mapred-site.xml
Mapreduce 基本操作&配置文件
Wordcount Example
Jobjob=newJob(conf,"wordcount");
4.构建一个job,加载mapred-default.xml,mapred-site.xml,yarn-
default.xml,yarn-site.xml,mapreduce框架里面一个mapreduce叫做一
个job,具体的map和reduce叫做task.随后写入conf中的配置
(GenericOptionsParser解析出来的),Job的名字是wordcount这个名
字会显示在前端UI上
Wordcount Example
job.setJarByClass(WordCount.class);
hadoop需要通过这个class定位到所在的jar包,传到hdfs.
原理:通过classloader获取类路径下的资源文件,循环遍历,定位到
class.
Wordcount Example
job.setMapperClass(TokenizerMapper.class);job.setCombinerClass(IntSumReducer.class);job.setReducerClass(IntSumReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);for(inti=0;i<otherArgs.length- 1;++i){
FileInputFormat.addInputPath(job,newPath(otherArgs[i]));}
FileOutputFormat.setOutputPath(job,newPath(otherArgs[otherArgs.length- 1]));
System.exit(job.waitForCompletion(true)?0:1);
ljob.setInputFormatClass(TextInputFormat.class);ljob.setOutputFormatClass(TextOutputFormat.class);ljob.setPartitionerClass(HashPartitioner.class)ljob.setNumReduceTasks(1);
lInputFormat负责数据切分(split)以确定maptask的个数及对应的split,还负责为mapper提供输入数据,将split解析成key,value对.lInputFormat将分片的数据序列化到磁盘供后续读取l文件格式:textfile,sequencefile,Avro,rcfile,orcfile,等lOutputFormat参数和InputFormat相对,将key,value写入特定格式的文件中.lPartition对map处理的结果进行分片,每一片的所有数据交由同一reduce处理lPartition个数=reduce个数
未写出的默认配置
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>
定义一个自己的Map过程,类名是TokenizerMapper,它继承了Hadoop的Mapper类。“<Object, Text, Text, IntWritable>” 这里:Object,表示输入键key的参数类型,值是每行的offsetText,表示输入值的类型, 值是行字符串Text,表示输出键类型, 值是被空格区分后的一个wordIntWritable,表示输出值类型
Mapper类讲解
l序列化:将结构化对象转化为字节流以便于通过网络进行传输或写入持久存储的过程.l反序列化:字节流转为结构化对象的过程.l<key,value>必须是可序列化的:实现Writablelkey需要排序(比较):实现Comparable
Hadoop序列化
Java基本类型对应的Writable
private final static IntWritable one = new IntWritable(1);privateTextword=newText();publicvoidmap(Objectkey,Textvalue,Contextcontext
)throwsIOException,InterruptedException{StringTokenizeritr=new
StringTokenizer(value.toString());while(itr.hasMoreTokens()){word.set(itr.nextToken());context.write(word,one);}}
map方法讲解
Reducer类讲解public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;for (IntWritable val : values) {sum += val.get();
}result.set(sum);context.write(key, result);
}}
Map task执行流程
Reduce task 执行流程
lmap的输出作为reduce输入的过程lmap阶段
lmap输出到内存中一块环形缓冲区中l缓冲区达到指定阈值,触发spill操作,溢写到磁盘上的一个文件,一次spill会生成一个文件lspill操作又包含了sort(快排)和combiner,sort优先级为partition,key.对每个partiton中数据进行一次combinerl保存分区数据的元信息,包括偏移量,数据大小l合并多个文件成一个大而有序(堆排序)的文件l删除临时的spill文件,合并完成
Shuffle
lreduce阶段lCopy,reduce从map上远程拷贝一片数据,只要一个map完成就进行拷贝(并行).l对多份拷贝数据文件进行merge,同时排序,防止磁盘上文件过多.l归并排序所有数据,确保给reduce的数据是有序的,聚集的.
Shuffle
lbin/hadoopjarshare/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jarwordcountinputoutput
lwordcount参数其实是通过反射调用了WordCount类,这里直接指定要用的classname:org.apache.hadoop.examples.WordCount效果是一样的.
Run WordCount Example
Hadoop Generic Options
►Namenode:50070
►Resourcemanager:8088
►Jobhistoryserver:19888
HDFS+Yarn+Mapreduce 监控
l用户向Yarn提交一个MapReduce应用,Yarn会分两阶段运行lResourceManager启动MRAppMasterl(Mapreduce的ApplicationMaster)负责管理作业生命周期.lMRAppMaster创建应用程序,申请资源,并监控其运行过程,直到运行成功lMRAppMaster3种运行模式:本地,uber,非uber
MapReduce On YARN工作原理
MapReduce on YARN 工作原理
1)用户向YARN中提交应用程序/作业,包括MRAppMaster程序、启动MRAppMaster的命令、用户程序等2)ResourceManager为作业分配第一个Container,并与对应的NodeManager通信,要求它在这个Containter中启动该作业的MRAppMaster;3)MRAppMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManager查询作业的运行状态;然后它将为各个任务申请资源并监控任务的运行状态,直到运行结束。即重复步骤4-7;4)MRAppMaster采用轮询方式通过RPC请求向RM申请和领取资源;5)MRAppMaster申请到资源后,便与对应的NM通信,要求它启动任务;6)NodeManager使用脚本启动任务(环境变量,jar包等);7)各个任务通过RPC协议向MRAppMaster汇报自己的状态和进度,以让MRAppMaster随时掌握各任务的运行状态,从而可以在任务失败时重新启动任务;在作业运行过程中,用户可随时通过RPC向ApplicationMaster查询作业当前运行状态;8)作业完成后,MRAppMaster向ResourceManager注销并关闭自己;
MapReduce On YARN工作原理
l压缩算法使用:lmap输入,map输出,reduce输出
lmap输入需要保证压缩算法可分割,解压速度快lmap输出保证压缩率高,压缩解压缩速度快lreduce输出保证压缩解压缩速度快,压缩率高
压缩率:gzip>lzo>snappy速度:gzip<lzo<snappy
最佳实践——Hadoop 压缩
l分布式缓存类,用来分发资源到Nodemanager上.l为每一个资源生成一个唯一的id,防止重复下载l使用方式:api方式 命令行方式l使用场景:工具jar,join小表(配置文件)等
最佳实践——Distribute Cache
l一个计数器l便于我们发现运行的mapreduce问题l自定义counter用于排错,配合system.outl出于监控,报警,统计等需求,在程序里获取counter值lCountercounter=job.getCounters().getGroup("FileSystemCounters").findCounter("HDFS:Numberofbytesread");lcounter.getValue();
最佳实践——Mapreduce Counter
l同一个job的多个task之间运行速度不一致,为防止这些慢ltask拖慢整个job的进度.lHadoop为该任务启动一个备份任务,谁先运行完,则将谁的结果作为最终结果.l每个task最多有一个备份任务实例
最佳实践——推测执行机制
l已经完成的task数目比例不小于5%l启动推测task的总量不超过10l推测执行算法可自己实现,默认实现算法:周期性扫描所有正在运行的task,假设为一个task启动一个备份task,估算完成时间,估算该task正常运行的完成时间,时间差越大,证明越有价值为这个task启动备份任务.
最佳实践——推测执行机制
lmapreduce.map.speculativetruelmapreduce.reduce.speculativetrue
l关闭情况:lmapreduce处理数据本身不均衡或计算不均衡l特定的任务,如写入hbase
最佳实践——推测执行机制
最佳实践——Mapreduce执行优化
lmapreduce.map.memory.mblmapreduce.reduce.memory.mbl对map和reduce任务的内存限制lmapreduce.map.java.optslmapreduce.reduce.java.optsl对jvm-Xmx堆大小的限制,但task不一定是java程序(streaming中python,perl等),为nativelib留出余地(比如压缩等)lmemory.mb要大于java.opts否则会报内存溢出
Mapreduce运行内存
lJVM的内存溢出
lmapreduce.map.java.optslmapreduce.reduce.java.optsl改大的同时另外两个memory的参数也要相应增加.l-Dmapreduce.map.java.opts=-Xmx2048ml-Dmapreduce.map.memory.opts=2560
Mapreduce运行内存
lyarn.scheduler.minimum-allocation-mblyarn.scheduler.maximum-allocation-mbl计算节点Container的物理内存范围,一般不需要改,改动需要重启集群生效.lyarn.nodemanager.vmem-pmem-ratiolcontainer允许的虚拟内存值,改动需要重启集群生效
Mapreduce运行内存
lERROR:Container%sisrunningbeyondphysical/virtualmemorylimits
lyarn.nodemanager.vmem-check-enabledlyarn.nodemanager.pmem-check-enabledfalse(非常不建议,重启集群)l提交Job时可动态配置 -Dmapreduce.map.memory.mblVirtualmemory溢出时,yarn.nodemanager.vmem-pmem-ratio默认2.1,改大,需要重启集群.
Mapreduce运行内存
最佳实践——参数调优
►HDFSqName Node/Data Node
►YarnqApplication MasterqResource ManagerqNode ManagerqCapacity/Fair Scheduler
►MapReduceqMap/Reduce
# 使用6个 Map 任务并行向 HDFS 里6个文件里分别写入 1GB 的数据bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.6.0-tests.jar TestDFSIO -write -nrFiles 6 -size 1GB
# 使用6个 Map 任务并行从 HDFS 里6个文件里分别读取 1GB 的数据bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.6.0-tests.jar TestDFSIO -read -nrFiles 6 -size 1GB
# 清除以上生成的数据bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.6.0-tests.jar TestDFSIO -clean
Hadoop Benchmark性能测试
# 生成1000万行数据到 /teraInput 路径中bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar teragen 10000000 /teraInput
# 将/teraInput 中生成的1000万行数据排序后存入到 /teraOutput 路径中bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar terasort teraInput /teraOutput
# 针对已排序的 /teraOutput 中的数据,验证每一行的数值要小于下一行bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar teravalidate -D mapred.reduce.tasks=8 /teraOutput /teraValidate
# 查看验证的结果bin/hdfs dfs -cat teraValidate/part-r-00000
Hadoop Benchmark性能测试
Secondary Sort Example
ljob.setPartitionerClass(FirstPartitioner.class);ljob.setGroupingComparatorClass(FirstGroupingComparator.class);
ljob.setSortComparatorClass(IntPair.Comparator.class);//默认的
Secondary Sort Example
l应用:l1.二次排序,第一字段优先,第二字段其次的规则排序l2.希望在同一reducegroup中有序的处理不同map标记的数据.
l输入:Table1(today) Table2(history)l useridtag1,tag2useridtag2,tag3
l输出:useridtag1
Secondary Sort Example
►Hadoop 快速入门指南►HBase 快速入门指南►Zookeeper快速入门指南►Kafka 快速入门指南
Agent Day 2
►分布式协调服务是很困难的 (race conditions, deadlock)►ZK是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、分布式同步、组和命名服务等►本身是分布式的,是Google Chubby的一个开源实现►是大数据平台如Hadoop、Hbase的重要组件►容器平台使用etcd或consul做协调服务
什么是 ZooKeeper
►奇数个节点,必须有半数节点以上是活的►每个节点数据都一样►基于内存的,持久化有transaction logs和snapshot►树状数据结构 - znode►Nodesandephemeralnodes►不是做存储用的!
系统架构
系统架构
系统架构
►生产环境一般5个节点►每个节点需配置zoo.cfg►bin/zkServer.sh start►zooKeeperCommands:TheFourLetterWords
►echo mntr | nc localhost 2181
集群管理
►Hadoop 快速入门指南►ZooKeeper 快速入门指南►Kafka 快速入门指南
Agent Day 2
►核心概念与架构►集群管理►编程入门
Kafka 快速入门
►消息队列:缓解消息生产者与消息消费者之间不同步问题的一个缓冲区►Kafka 是一个分布式、可分区、多副本的高吞吐量、低延迟的消息系统
►3 Kafka servers, 1 producer –- 821,557 records/sec(78.3 MB/sec)* ►适用于处理活跃的流式数据,比如网页的访问量、日志等
* https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines
什么是 Kafka
►Producer, consumer, broker
架构
►topic, partition
架构
►consumer group
架构
►快速检查集群►Java 生产消费示例
编程入门
关注我们
QingCloud-IaaS
青云QingCloud
www.qingcloud.com
Thank you.