写点什么

「架构师训练营 4 期」 第十二周 - 001&2

用户头像
凯迪
关注
发布于: 2021 年 03 月 30 日

作业一

(至少完成一个)

  • 在你所在的公司(行业、领域),正在用大数据处理哪些业务?可以用大数据实现哪些价值?

  • 分析如下 HiveQL,生成的 MapReduce 执行程序,map 函数输入是什么?输出是什么,reduce 函数输入是什么?输出是什么?

复制代码

INSERT OVERWRITE TABLE pv_usersSELECT pv.pageid, u.ageFROM page_view pv   JOIN user u   ON (pv.userid = u.userid);        
复制代码

page_view 表和 user 表结构与数据示例如下



作业二

  • 根据当周学习情况,完成一篇学习总结


答案一

题目一

  • 在你所在的公司(行业、领域),正在用大数据处理哪些业务?可以用大数据实现哪些价值?


我之前经历比较多的是安放/电商和金融领域,简单说一下大数据处理的业务和价值实现:

  • 安防行业:大数据在交通的过车分析分析统计/流量预测/行车调度/车辆分析/图像识别上有比较大的应用,在公安属性的刑侦追查/人口对比/人像检索等有比较多的应用。

  • 电商行业:在除了基础的大数据的查询分析及运营之外,另外有风控依赖于大数据进行风控算法训练和线上风控,千人前面的推荐算法。

  • 金融行业:基于各类埋点数据进行数据的统计,包括数据预测/投放策略/漏洞分析等各个维度的分析和计算;除了营销之外也会像电商一样有比较重的风控业务。

题目二

  • 分析如下 HiveQL,生成的 MapReduce 执行程序,map 函数输入是什么?输出是什么,reduce 函数输入是什么?输出是什么?


INSERT OVERWRITE TABLE pv_usersSELECT pv.pageid, u.ageFROM page_view pv   JOIN user u   ON (pv.userid = u.userid);
复制代码

page_view 表和 user 表结构与数据示例如下



整个流程如下:



map 过程

SELECT pv.pageid, pv.useridFROM page_view pv//userid - key//pageid - value
复制代码


page_view 输入的是 pageid,userid,time,输出的是 userid (key) 和 pageid (value),为了标记表 value 增加 1 标记位

SELECT u.age, u.useridFROM user u//userid - key//age - value
复制代码

page_view 输入的是 userid,age,gender,输出的是 userid (key)和 age (value),为了标记表 value 增加 2 标记位

reduce 过程

按照 userid 进行 join,故通过同一个 userid 的 key 进行聚合。

SELECT pv.pageid, u.ageFROM page_view pv   JOIN user u   ON (pv.userid = u.userid = 111);   SELECT pv.pageid, u.ageFROM page_view pv   JOIN user u   ON (pv.userid = u.userid = 222);
复制代码

输出 userid (key) 为 111 的情况下的排列组合结果 2 个

输出 userid(key)为 222 的情况下的排列组合结果 1 个


答案二

大数据原理

大数据包含什么?

狭义的大数据是指 hadoop 处理技术,广义的大数据不仅仅是 hadoop,而是广义的大数据的技术体系,也包含了机器学习/数据挖掘分析/人工智能以及相关的大数据应用。

大数据起源

最早的大数据是 2004 年 google 发表的三片论文,主要是经常说的“三驾马车”:分布式文件系统 GFS,大数据分布式计算框架 MapReduce 和 Nosql 数据库系统 BigTable。针对于 google 遇到的需要爬取各类网页,构建索引和排序,需要对于大量的数据进行存储和计算,核心就是文件系统/计算框架和数据库系统。

大数据发展

语言变迁

MapReduce 编程难度大:MapReduce -> Pig(脚本语言) -> Hive(SQL 转换成 MapReduce)

计算引擎优化

MapReduce 既是执行引擎,又是资源调度框架。

使用 Yarn 进行资源调度,MapReduce 进行执行引擎,随后机器学习算法较多的迭代计算的情况下计算性能很差,随后 Spark 优化了这个过程,同时用内存代替 MapReduce 用磁盘来作为存储介质,在性能上得到了极大的提高。

流计算

MapReduce 和 Spark 这类计算框架处理的业务场景被称为批处理计算,需要比较长的时间,通常被称为离线计算,还有另一种实时产生的大数据进行即使计算的需求,被称为大数据流计算,Storm/Flink/Spark Streaming 等流计算框架应运而生,而对于这些海量数据的存储技术 nosql 也高速发展,涌现出 HBase/Cassandra 等优秀的产品,这里 Hbase 是从 Hadoop 分离出来的基于 HDFS 的 NoSQL 系统。

大数据应用史

  • 搜索引擎时代

  • 数据仓库时代

  • 数据挖掘时代

  • 机器学习时代

大数据应用领域

  • 医学影像智能识别

  • 大数据智能诊疗

  • AI 外语老师

  • 智能解析

  • 舆情监控与分析

  • 大数据风控

  • 无人售卖新零售

  • 无人驾驶


分布式文件系统 HDFS

HDFS 系统架构

NameNode(2+) 元数据信息,记录文件控制块和分配表信息,管理实际集群存储资源管理

DataNode(2N+1) 数据存储块,进行实际的 Block

三副本概念:进行第一次文件操作之后,通过 replication 进行复制,复制第二份和第三份进行备份。


数据存储细节

namenode 记录的包括文件路径,副本数,副本 id 等

默认的 block 的大小为 64M,以此来实现大文件管理。


image.png


HDFS 设计目标

适合场景

  • 大文件(百 T+)

  • 流式数据操作(一次写入,大量读取)

  • 商用硬件, 多副本保证可用性


不适合场景

  • 低延时数据访问

  • 大量小文件:namenode 处理能力成为瓶颈

  • 多用户随机写入修改文件

HDFS 写文件

  1. hdfs client 调用 create 方法来创建文件

  2. sdk 像 namenode 发起 create 操作

  3. namenode 返回可以使用的 datanode 编号和地址信息

  4. client 通过 write 方式调用 sdk 进行写入

  5. sdk 通过 write packet 方式把数据写入到 datanode

  6. datanode 接收数据以后以 pipeline 的方式讲数据复制到其他的 datanode

  7. 写入完成返回应答,写入结束返回 ack

  8. 应用接收返回之后发送 close 关闭操作流

  9. 最后通过 complete 通知 namenode 已经完成写入


HDFS 读文件

操作基本相似,减少通过 pipeline 复制的过程,因为需要选择读取文件所在的 datanode,通常会选择本机所在的进程(可以自己实现,通常来说 mapreduce 和 spark 已经实现)


HDFS 高可用设计

磁盘挂了怎么办?

服务本身正常,通知 namenode 数据已经损坏,然后 namenode 会进行备份操作。

DataNode 所以机器挂了怎么办?

通过心跳来保证 datanode 是否正常,如果发现 10 分钟没有心跳认为 datanode 已经 dead,namenode 会通知其他的 datanode 对这个 datanode 的 block 进行复制。

NameNode 挂了怎么办?

第一 通过持久化元数据

  • 操作日志(edit log)记录文件变更操作

  • Fismage:定时复制元数据的镜像文件,包括命名空间/file 与 block 映射关系,文件属性

基于以上持久化的方案,可以根据 Fismage 再加上对应时间后的操作日志进行恢复。

第二 主主复制,并且依赖 zookeeper 的选主的方式保证实时的高可用

client 挂了怎么办?

在进行数据写入的操作过程中 client crash 导致的文件崩溃如何解决?如何保证数据的一致性?

这个要通过 HDFS 一致性模型来保证:

  • 文件创建以后不保证 namenode 可以见,

  • 当数据写入超过一个快(64M)之后,可以看到第一个快,但是无法看到当前写入的块

  • 提供 sync 方法强制缓存与数据节点同步,可以保证当前写入数据对所有 reader 可见且一致,但是会导致额外开销。

副本摆放策略

提供 rack 的配置策略,rack1 和 rack2 可以对于不同 node 在不同的 rack 上,以机柜为例,可以配置不同的机柜在不同的交换机。

默认配置

数据块 block:数据块大小


image.png


namenode 参数:文件存储路径


image.png


数据存储的副本数:默认为 3 个


image.png


datanode 存储路径,配置多个磁盘的存储路径, 用逗号隔开


image.png


文件系统接口:直接进行文件操作(很少使用)


image.png


MapReduce 编程模型


大规模数据处理的根本:分而治之,移动计算比移动数据更划算。

当我们要对大规模宕文件数据进行计算,不通过读取文件的方式处理,而是把我们需要的计算程序分发到数据所在的服务器上进行计算,然后通过各个数据块进行计算之后进行返回。


编程细节不做赘述,map 和 reduce 的输入输出是什么?

map 函数:输入 key value,输出 key value

reduce 函数:输入 key value list,输出 key value

那么怎么设计呢?

抽象代码层面实现


image.png


组件层面实现


image.png


细化单个 map 实现


image.png


文件的移动实现


image.png


MapReduce 架构

TaskTracker 和 JobTracker 服务器来实现任务的执行 &调度。


  1. 大数据作业启动,通过 sdk 把计算的 jar 包分发到 hdfs 的 datanode 上

  2. 通过 sdk 提交作业到 JobTracker 服务器,通过 JobScheduler 进行调度

  3. 当前是空闲或者排队到之后,JobScheduler 创建一个 JoninPorcess 来解析提交的作业

  4. 解析文件的数据块创建大量的 TaskInProcess(map 任务+reduce 任务之和的数量)任务(其实还有 TaskAttemp 任务尝试字节点)

  5. datanode 服务器上有 datanode 和 TaskTracker 的进程,TaskTracker 进程跟 JobTracker 保活的方式来实现心跳和空闲状态的上报

  6. TaskInProcess 分发 task 任务到 TaskRunner 上,TaskRunner 根据 map 还是 reduce 赉启动对应的进程进行计算

  7. 如果是 reduce 任务会直接输出计算结果

  8. 如果是 map 任务先下载 jar 包,然后读取分片数据块,计算之后 TaskTracker 会把文件拷贝到其他的 datanode 上


image.png


发布于: 2021 年 03 月 30 日阅读数: 7
用户头像

凯迪

关注

还未添加个人签名 2020.06.01 加入

还未添加个人简介

评论

发布
暂无评论
「架构师训练营 4 期」 第十二周 - 001&2