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应用开发流程
多个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
MapReduce算法实践 MapReduce性能调优

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输出压缩类
使用预测执行功能:在任务执行过程中,hadoop会检测所有任务的进度和完成情况,当出现某个任务执行进程远慢于整个系统平均进度时,hadoop会将在另一个节点上启动一个相同的备份任务,并与原始任务并行执行。当原始任务和备份任务的其中一个完成时,另一个任务被终止。
参数 类型 默认值 说明
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>
通过API操作文件

HDFS性能优化

HDFS小文件存储问题
(未完待续)





相关内容