架构师训练营第十二周课程笔记及心得
第一课:
大数据原理概述:
狭义大数据:大数据处理技术
广义大数据:所有相关数据以及周边应用技术等
大数据的计算方式:
批处理计算:MapReduce,Spark
流处理计算:Storm,Flink,Spark Streaming
NoSQL系统处理:HBase,Cassandra
第二课:
分布式文件系统
RAID技术:
HDFS系统架构:
NameNode上存储的数据具体形式:
HDFS设计目标:
HDFS以流失数据访问模式存储超大文件,运行于商用硬件集群上。
使用场景特点:
超大文件
流式数据访问:一次写入多次读取
商用硬件:非专业硬件,高可用由软件本身保证
不适用场景:
低延迟的数据访问
大量小文件:超过NameNode的处理能力
多用户随机写入修改文件
数据可靠性保证:
HDFS 为了做到可靠性(reliability)创建了多份数据块(data blocks)的复制(replicas),并将它们放置在服务器群的计算节点中(compute nodes),MapReduce就可以在它们所在的节点上处理这些数据了。
设计目标:
假设:节点失效是常态
理想:
任何一个节点失效,不影响HDFS服务
HDFS可以自动完成副本的复制
文件:
文件切分成块(默认大小64M),以块为单位,每个块有多个副本存储在不同的机器上,副本数可在文件生成时指定(默认3)
NameNode是主节点,存储文件的元数据如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表以及块所在的 DataNode等等
DataNode在本地文件系统存储文件块数据,以及块数据的校验和可以创建、删除、移动或重命名文件,当文件创建、写入和关闭之后不能修改文件内容。
HDFS写文件:
HDFS读文件:
高可用:
DataNode的磁盘挂了怎么办:
DataNode正常服务
坏掉的磁盘上的数据尽快通知NameNode
DataNode的服务器挂了怎么办:
NameNode如何发现DataNode节点宕机:心跳,DataNode每3秒向NameNode发送心跳,如果10分钟DataNode没有发送心跳,则NameNode认为该DataNode已经dead,NameNode将取出该DataNode上对应的block,对其进行复制。
NameNode挂了怎么办:
持久化元数据:
操作日志(edit log):
记录文件创建,删除,修改文件属性操作
Fsimage
包含完整的命名空间
File->Block的映射关系
文件的属性(ACL,quota,修改时间等)
Client挂了怎么办:
影响:数据一致性问题
解决方法:HDFS一致性模型
文件创建以后,不保证在NameNode立即可见,即使文件刷新并存储,文件长度依然可能为0;
当写入数据超过一个块后,新的reader可以看见第一个块,reader 不能看见当前正在写入的块;
HDFS提供 sync()方法强制缓存与数据节点同步,sync()调用成功后,当前写入数据对所有reader可见且一致;
调用sync()会导致额外的开销。
副本摆放策略:
跨机架分布副本:
数据块block:
默认64M,通常设置为128M
可在hdfs-site.xml中设置
NameNode参数,也在hdfs-site.xml中
DataNode参数,在hdfs-site.xml中设置
文件系统抽象(org.apache.hadoop)
· fs.FileSystem
· fs.LocalFileSystem
· hdfs.DistributedFileSystem
· hdfs.HftpFileSystem
· hdfs.FileSystem
· fs.HarFileSystem
Java接口:
通过FileSystem API读取数据:
Path对象:
获取FileSystem实例:
获取文件输入流:
一般由MapReduce或者spark去访问HDFS,不直接通过接口访问
第三课:
大数据计算框架MapReduce-编程模型
MapReduce:大规模数据处理
处理海量数据(>1TB)
上百上千CPU实时并行处理
实现:
移动计算笔移动数据更划算
分而治之(Divide and Conquer)
MapReduce两种含义:
MapReduce的编程模型
大数据计算框架
WordCount举例:词频统计
MapReduce的计算框架:
map函数
reduce函数
main中设置设置项
MapReduce计算过程:
通过设置设置好map和reduce函数
将map分发到数据所在的服务器上计算
将map函数的结果进行排序合并
将所有结果汇聚到集群唯一的reduce函数中计算最终结果
处理过程图:
详细的内部过程图:
重点:shuffle或叫fech、copy过程:
第四课:
大数据计算框架MapReduce-架构
构成:
大数据应用进程:将Mapreduce程序jar包发布到HDFS存储中,并将作业提交至JobTracker
JobTracker:
创建JobScheduler
构建JobInprocess
通过构建的JobInproces,将每个解析出来的数据块做成一个TaskInProcess
TaskTracker(向jt发送心跳)&DataNode(同一台主机资源上)
TaskTracker去领取任务
JobTracker对领取任务的节点上的数据块(与HDFS进行通信)和job的jar文件进行匹配(jobtracker通过locality规则匹配,优先将数据和程序在相同服务器上的task进行分配)
TaskTracker启动map计算,并将结果返回,输出到对应的存储中
适合MapReduce的计算类型:
TopK
K-means
Bayes
SQL
不适合MapReduce的计算类型:
Fibonacci
lnputFormat接口:
作用:
验证作业的输入的正确性
将输入文件切分成逻辑的InputSplits,一个InputSplit将被分配给一个单独的Mappertask
提供RecordReader 的实现,这个 RecordReader 会从InputSplit中正确读出一条一条的K -V对供 Mapper使用。
InputFormat:
+ getSplits : List<InputSplit>()
+createRecordReader : RecordReader<K,V>()
FilelnputFormat:
得到分片的最小值minSize和最大值maxSize,可以通过设置mapred.min.split.size和mapred.max.split.size来设置;
对于每个输入文件,计算max(minSize, min(maxSize, blockSize));
如果minSize<=blockSize<=maxSize,则设为 blockSize。
分片信息<file,start,length,hosts>,通过 hosts 实现map本地性。
OutputFormat:
OutputFormt接口决定了在哪里以及怎样持久化作业结果。
默认的OutputFormat就是TextOutputFormat,它是一种以行分隔,包含制表符界定的键值对的文本文件格式。
Partitioner:
什么是 Partitioner:
. Mapreduce通过 Partitioner对 Key进行分区,进而把数据按我们自己的需求来分发。
什么情况下使用Partitioner:
·如果你需要key按照自己意愿分发,那么你需要这样的组件。·框架默认的 HashPartitioner
·例如:数据内包含省份,而输出要求每个省份输出一个文件。
public int getPartition (K key, v value, int numReduceTasks){
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
主要调度方法:
·单队列调度:
特点:FIFO
优点:简单
缺点:资源利用率低
·容量调度(Capacity Scheduler , Hadoop-0.19.0 )
特点:
多队列,每个队列分配一定系统容量(Guaranteed Capacity )
空闲资源可以被动态分配给负载重的队列
支持作业优先级
·作业选择:
选择队列:资源回收请求队列优先;最多自由空间队列优先。
选择作业:按提交时间、优先级排队;检查用户配额;检查内存。
·优点:
支持多作业并行执行,提高资源利用率
动态调整资源分配,提高作业执行效率
JobTracker内部实现
作业控制:
作业抽象成三层:作业监控层(JIP),任务控制层(TIP),任务执行层
任务可能会被尝试多次执行,每个任务实例被称作Task Attempt(TA)
资源管理:
根据TaskTracker状态信息进行任务分配
JobTracker 容错:
JobTracker 是全局唯一的,当JobTracker失败,那么未完成Job失败;通过Job日志,Job可部分恢复。
TaskTracker 容错:
超时:TaskTracker 10分钟(mapred.tasktracker.expiry.interval)未汇报心跳,则将其从集群移除
灰名单,黑名单:
TaskTracker上部署性能监控脚本
如果性能表现太差,被JobTacker暂停调度
Task容错:
允许部分Task 失败:允许失败的任务占比,默认0,Mapred.max.map.failers.percent,mapred.max.reduce.failures.percent
Task由 TIP监控,失败任务多次尝试,慢任务启动备份任务:每次都是一个TA (Task Attempt),最大允许尝试次数:mapred.map.max.attempts,mapred.reduce.max.attempts
Record 容错:
跳过导致Task失败的坏记录
K,V超大,导致 OOM,配置最大长度,超出截断mapred.linercordreader.maxlength。
异常数据引发程序bug, task重试几次后,自动进入skip mode,跳过导致失败的记录,mapred.skip.attempts.to.start.skipping 。
第五课:
MapReduce2:区分开资源管理与计算框架
Yarn:从MapReduce1中分离出来的独立资源调度引擎
YARN : Yet Another Resource Negotiator
下一代 MapReduce框架的名称。不再是一个传统的 MapReduce框架,甚至与MapReduce无关。一个通用的运行时框架,用户可以编写自己的计算框架,在该运行环境中运行。
Yarn架构:
第六课:
大数据仓库Hive:
Hive:协调SQL,转换成一个MapReduce计算
Hive架构:
Hive与Hadoop之间的关系
Hive编译器:
DAG有向五环图:单独查询
DAG有向五环图:带聚合操作
DAG有向五环图:多个查询与聚合
Hive MetaStore:
MetaStore存储数据的表名和字段名,索引等信息,缺省情况下试用Debian,也可以用Mysql等
Hive中的Join操作:
通过join的字段名作为key将两张表进行map,然后通过reduce计算将结果进行合并
Join Optimizations(join优化)
Map Joins:
User specified small tables stored in hash tables on the mapper backed by jdbm
No reducer needed
版权声明: 本文为 InfoQ 作者【Airs】的原创文章。
原文链接:【http://xie.infoq.cn/article/f79ef4459dec57846141bbde7】。未经作者许可,禁止转载。
评论