Hadoop大数据处理读书笔记
Hadoop大数据处理读书笔记
几个关键性的概念
MapReduce任务的执行过程基于云计算的大数据处理架构
基于云计算的大数据处理技术的应用 百度主要应用成果 HCE(Hadoop c++ Extension)——基于C++的MapReduce运行环境(解决了Java对内存管理的低效) HDFS2——分布式NameNode实现(解决了NameNode压力大问题) HDFS的透明压缩存储(解决HDFS系统中文件存储占用磁盘空间问题) DISQL(Distributed SQL)——大数据分析语言 阿里巴巴 腾讯 华为 中国移动 三、MapReduce计算模式 MapReduce原理 Map:<k1,v1>→[<k2,v2>] Reduce:<k2,[v2]>→[<k3,v3>] 注:<...>代表关键字/值数据对,[...]代表列表。 MapReduce处理过程图
MapReduce工作机制
作业调度: 异常处理:
- 任务异常(两种状态:失败和终止。任务出现异常后,TaskTracker会将此任务的失败信息报告给JobTracker,JobTracker会分配新的节点执行此任务。)
失败:
终止:
- TaskTracker异常(如果JobTracker超过最大时间间隔没有收到TaskTracker的心跳消息时,则认为TaskTracker出现了异常。已完成的任务会正常返回,未完成的任务则重新分配TaskTracker节点重新执行。为了避免TaskTracker异常反复出现,MapReduce框架设定了黑名单机制。
- JobTracker异常(目前还没有能应对JobTracker异常的机制)
多个MapReduce过程的组合模式
- 作业链(按顺序执行)——JobClient.runJob
JobClient.runJob(config1); JobClient.runJob(config2);
- 作业图(DAG)——jobControl
jobMapReduce3.addDependingJob(jobMapReduce1); jobMapReduce3.addDependingJob(jobMapReduce2); jobControl.addJob(jobMapReduce1); jobControl.addJob(jobMapReduce2); jobControl.addJob(jobMapReduce3); jobControl.run();
- Map/Reduce链——ChainMaper和ChainReducer
map函数在执行时,输出数据首先是保存在缓存中,这个缓存的默认大小是100MB,由参数io.sort.mb来控制。当缓存使用量达到一定比例时,缓存中的数据将写入磁盘中,这个比例是由参数io.sort.spill.percent控制。缓存中的数据每次输出到磁盘时会生成一个临时文件,多个临时文件合并后生成一个map输出文件,参数io.sort.factor制定最多可以有多少个临时文件被合并到输出文件中。性能调优参数:
参数 | 类型 | 默认值 | 说明 |
Map阶段 | |||
io.sort.mb | int | 100 | map输出的缓存大小,单位为MB |
io.sort.spill.percent | float | 0.8 | map输出缓存占用超过此比例将开始写入磁盘 |
io.sort.factor | int | 10 | 合并多个临时输出文件的数量,可增大 |
min.num.spills.for.combine | int | 3 | 输出临时文件达到此数量时会执行一次combine操作 |
tasktracker.http.threads | int | 40 | tasktracker可用于输出map文件的http线程数 |
Reduce阶段 | |||
mapred.reduce.parallel.copies | int | 5 | 可读取多个map输出的线程数 |
mapred.reduce.copy.backoff | int | 300 | reduce读取map输出的失败超时时间,s为单位 |
io.sort.factor | int | 10 | 处理之前合并输入文件的最大数量 |
mapred.job.shuffle.input.buffer.percent | float | 0.7 | 存储map输出数据的缓存占整个内存的比例 |
mapred.job.shuffle.merge.percent | float | 0.6 | 存储map输出数据的缓存的占用比例阀值,超过则存入磁盘 |
mapred.inmem.merge.threshold | int | 1000 | 当map输出文件超过此数量时,进行合并并存入磁盘 |
mapred.job.reduce.input.buffer.percent | float | 0.0 | 在reduce节点的内存中保持map输出数据的缓冲占整个内存的百分比,增大可以减少磁盘读写 |
mapred.child.java.opts | int | 200 | map或reduce任务可使用的内存大小,默认为200MB,可适当增大 |
io.file.buffer.size | int | 4096 | 进行磁盘I/O操作的是缓存大小,默认4kb,可提高为64kb或128kb |
使用Combiner减少数据传输 启用数据压缩(DefaultCodec:zlib;GzipCodec:Gzip;BZip2Codec:bzip2)
参数 | 类型 | 默认值 | 说明 |
mapred.compress.map.output | Boolean | false | 是否启用map输出压缩 |
mapred.map.output.compression.codec | Class name | org.apache.hadoop.io.compress.DefaultCodec | map输出压缩类 |
参数 | 类型 | 默认值 | 说明 |
mapred.map.tasks.speculative.execution | Boolean | true | 是否启用map任务的预测执行机制 |
mapred.reduce.tasks.speculative.execution | Boolean | true | 是否启用reduce任务的预测执行机制 |
重用JVM:默认设置,每个JVM只可以单独运行一个Task进程,其主要目的是避免某个任务的崩溃影响其他任务或整个TaskTracker的正常执行。但MapReduce框架也可以允许一个JVM运行多个任务。设置参数mapred.job.reuse.jvm.num.tasks,或调用JobConf类的setNumTasksToExecutePerJvm接口,当设置为-1时,任务数量将没有限制。对于一些map函数初始化简单却执行频繁的作业,可以考虑。
分布式文件系统应满足:
数据读取过程
- 当读取某个DataNode出现故障时,DFSInputStream将选取下一个包含此数据块的最近的DataNode。
- 当某个DataNode出现故障写入失败,那么故障节点将从DataNode链中删除,NameNode会分配另一个DataNode完成此数据块的写入,只要有一个写入成功,本次操作也被视为完成。
- hadoop fs -cmd<args>
HDFS性能优化
HDFS小文件存储问题(未完待续)
评论暂时关闭