写点什么

架构师训练营第十二周课程笔记及心得

用户头像
Airs
关注
发布于: 2020 年 12 月 17 日

第一课:

大数据原理概述:

  1. 狭义大数据:大数据处理技术

  2. 广义大数据:所有相关数据以及周边应用技术等



大数据的计算方式:

  1. 批处理计算:MapReduce,Spark

  2. 流处理计算:Storm,Flink,Spark Streaming

  3. NoSQL系统处理:HBase,Cassandra





第二课:

分布式文件系统



RAID技术:





HDFS系统架构:





NameNode上存储的数据具体形式:





HDFS设计目标:

HDFS以流失数据访问模式存储超大文件,运行于商用硬件集群上。

使用场景特点:

  1. 超大文件

  2. 流式数据访问:一次写入多次读取

  3. 商用硬件:非专业硬件,高可用由软件本身保证

不适用场景:

  1. 低延迟的数据访问

  2. 大量小文件:超过NameNode的处理能力

  3. 多用户随机写入修改文件

数据可靠性保证:

HDFS 为了做到可靠性(reliability)创建了多份数据块(data blocks)的复制(replicas),并将它们放置在服务器群的计算节点中(compute nodes),MapReduce就可以在它们所在的节点上处理这些数据了。





设计目标:

假设:节点失效是常态

理想:

  1. 任何一个节点失效,不影响HDFS服务

  2. HDFS可以自动完成副本的复制

文件:

文件切分成块(默认大小64M),以块为单位,每个块有多个副本存储在不同的机器上,副本数可在文件生成时指定(默认3)

NameNode是主节点,存储文件的元数据如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表以及块所在的 DataNode等等

DataNode在本地文件系统存储文件块数据,以及块数据的校验和可以创建、删除、移动或重命名文件,当文件创建、写入和关闭之后不能修改文件内容。



HDFS写文件:



HDFS读文件:





高可用:

  1. DataNode的磁盘挂了怎么办:

  2. DataNode正常服务

  3. 坏掉的磁盘上的数据尽快通知NameNode

  4. DataNode的服务器挂了怎么办:

  5. NameNode如何发现DataNode节点宕机:心跳,DataNode每3秒向NameNode发送心跳,如果10分钟DataNode没有发送心跳,则NameNode认为该DataNode已经dead,NameNode将取出该DataNode上对应的block,对其进行复制。

  6. NameNode挂了怎么办:

  7. 持久化元数据:

  8. 操作日志(edit log):

  9. 记录文件创建,删除,修改文件属性操作

  10. Fsimage

  11. 包含完整的命名空间

  12. File->Block的映射关系

  13. 文件的属性(ACL,quota,修改时间等)





Client挂了怎么办:

  1. 影响:数据一致性问题

  2. 解决方法:HDFS一致性模型

  3. 文件创建以后,不保证在NameNode立即可见,即使文件刷新并存储,文件长度依然可能为0;

  4. 当写入数据超过一个块后,新的reader可以看见第一个块,reader 不能看见当前正在写入的块;

  5. HDFS提供 sync()方法强制缓存与数据节点同步,sync()调用成功后,当前写入数据对所有reader可见且一致;

  6. 调用sync()会导致额外的开销。



副本摆放策略:

  1. 跨机架分布副本:

  1. 

  1. 

  2. 数据块block:

  3. 默认64M,通常设置为128M

  4. 可在hdfs-site.xml中设置

  1. 

  1. 

  2. NameNode参数,也在hdfs-site.xml中

  1. 

  1. 

  1. 

  1. 

  2. DataNode参数,在hdfs-site.xml中设置

  1. 

  1. 



文件系统抽象(org.apache.hadoop)

· fs.FileSystem

· fs.LocalFileSystem

· hdfs.DistributedFileSystem

· hdfs.HftpFileSystem

· hdfs.FileSystem

· fs.HarFileSystem

Java接口:

通过FileSystem API读取数据:

  1. Path对象:

  2. hdfs://localhost:9000/user/tom/t.txt

  3. 获取FileSystem实例:

  1. 

  1. 

  2. 获取文件输入流:

  1. 

  1. 

一般由MapReduce或者spark去访问HDFS,不直接通过接口访问



第三课:

大数据计算框架MapReduce-编程模型



MapReduce:大规模数据处理

  1. 处理海量数据(>1TB)

  2. 上百上千CPU实时并行处理

实现:

  1. 移动计算笔移动数据更划算

  2. 分而治之(Divide and Conquer)

MapReduce两种含义:

  1. MapReduce的编程模型

  2. 大数据计算框架

WordCount举例:词频统计



MapReduce的计算框架:

  1. map函数

  2. reduce函数

  3. main中设置设置项

MapReduce计算过程:

  1. 通过设置设置好map和reduce函数

  2. 将map分发到数据所在的服务器上计算

  3. 将map函数的结果进行排序合并

  4. 将所有结果汇聚到集群唯一的reduce函数中计算最终结果

处理过程图:



详细的内部过程图:



重点:shuffle或叫fech、copy过程:





第四课:

大数据计算框架MapReduce-架构

构成:

  1. 大数据应用进程:将Mapreduce程序jar包发布到HDFS存储中,并将作业提交至JobTracker

  2. JobTracker:

  3. 创建JobScheduler

  4. 构建JobInprocess

  5. 通过构建的JobInproces,将每个解析出来的数据块做成一个TaskInProcess

  6. TaskTracker(向jt发送心跳)&DataNode(同一台主机资源上)

  7. TaskTracker去领取任务

  8. JobTracker对领取任务的节点上的数据块(与HDFS进行通信)和job的jar文件进行匹配(jobtracker通过locality规则匹配,优先将数据和程序在相同服务器上的task进行分配)

  9. TaskTracker启动map计算,并将结果返回,输出到对应的存储中





适合MapReduce的计算类型:

  1. TopK

  2. K-means

  3. Bayes

  4. SQL

不适合MapReduce的计算类型:

  1. Fibonacci



lnputFormat接口:

作用:

  1. 验证作业的输入的正确性

  2. 将输入文件切分成逻辑的InputSplits,一个InputSplit将被分配给一个单独的Mappertask

  3. 提供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 )

    特点:

  1. 多队列,每个队列分配一定系统容量(Guaranteed Capacity )

  2. 空闲资源可以被动态分配给负载重的队列

  3. 支持作业优先级

·作业选择:

  1. 选择队列:资源回收请求队列优先;最多自由空间队列优先。

  2. 选择作业:按提交时间、优先级排队;检查用户配额;检查内存。

·优点:

  1. 支持多作业并行执行,提高资源利用率

  2. 动态调整资源分配,提高作业执行效率



JobTracker内部实现

作业控制:

作业抽象成三层:作业监控层(JIP),任务控制层(TIP),任务执行层

任务可能会被尝试多次执行,每个任务实例被称作Task Attempt(TA)



资源管理:

    根据TaskTracker状态信息进行任务分配



JobTracker 容错:

    JobTracker 是全局唯一的,当JobTracker失败,那么未完成Job失败;通过Job日志,Job可部分恢复。



TaskTracker 容错:

  1. 超时:TaskTracker 10分钟(mapred.tasktracker.expiry.interval)未汇报心跳,则将其从集群移除

  2. 灰名单,黑名单:

  3. TaskTracker上部署性能监控脚本

  4. 如果性能表现太差,被JobTacker暂停调度



Task容错:

  1. 允许部分Task 失败:允许失败的任务占比,默认0,Mapred.max.map.failers.percent,mapred.max.reduce.failures.percent

  2. Task由 TIP监控,失败任务多次尝试,慢任务启动备份任务:每次都是一个TA (Task Attempt),最大允许尝试次数:mapred.map.max.attempts,mapred.reduce.max.attempts



Record 容错:

跳过导致Task失败的坏记录

  1. K,V超大,导致 OOM,配置最大长度,超出截断mapred.linercordreader.maxlength。

  2. 异常数据引发程序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:

  1. User specified small tables stored in hash tables on the mapper backed by jdbm

  2. No reducer needed

发布于: 2020 年 12 月 17 日阅读数: 15
用户头像

Airs

关注

Emmmmmmm 2018.02.28 加入

Emmmmmmm

评论

发布
暂无评论
架构师训练营第十二周课程笔记及心得