Fork me on GitHub

【从0开始学大数据】--模块一学习记录

该篇学习记录主要是记录和总结极客时间专栏 「从0开始学大数据」

模块一主要讲的是 Hadoop 大数据原理与架构

大数据发展史

学习某种技术,最好的方式一定不是一头扎到具体细节中,而是从时空的角度先了解它的来龙去脉,以及它为什么会演变成现在的样子。

也就是要从宏观的角度,先了解,然后再细节学习,学习的东西太多了。

大数据技术的 「三驾马车」:

  • 分布式文件系统 GFS (谷歌文件系统)
  • 大数据分布式计算框架 MapReduce
  • NoSQL 数据库系统 Big Table

搜索引擎主要做两件事情:

  • 网页抓取
  • 索引构建
    这两个过程中,有大量的数据需要存储和计算,实际上大数据技术的三驾马车正是解决这个问题的。

多思考我们开发的需求的价值点在哪里,而不是整天埋头在需求说明文档里,做一个没有思考的代码机器人

Hadoop发展史:

  1. Lucene 开源项目创始人 Doung Cutting 开发开源搜索引擎 Nutch
  2. 通过 Google的论文的启发初步实现 GFS 和 MapReduce 的功能
  3. 将大数据相关的功能分离出来,启动 Hadoop 这个项目
  4. 2008年 Hadoop正式成为 Apache 的顶级项目
  5. MapReduce 进行大数据编程太麻烦,使用脚本语言 Pig 优化,然后编译生成 MapReduce 程序
  6. Facebook发布 Hive,它支持使用 SQL 语法来进行大数据计算

大数据的应用

应用的发展史

  • 大数据应用的搜索引擎时代
    • Google 开发的 GFS (Google 文件系统),将数千台服务器上的数万块磁盘统一管理起来,然后当作一个文件系统,统一存储所有这些文件
  • 大数据应用的数据仓库时代
    • Facebook 推出的 Hive,可以在Hadoop上进行 SQL 操作,可以用更低廉的价格获得比以往多得多的数据存储与计算能力
  • 大数据应用的数据挖掘时代
    • 应用在商品之间的关联性分析,提高销售额;数据挖掘还体现在可以描绘用户画像
    • 「六度分割理论」 最多可以通过六个人你就能认识任何一个陌生人
  • 大数据应用的机器学习时代
    • 把历史数据都收集起来,统计其规律,进而预测正在发生的事情

应用领域

  • 医疗健康领域的应用
    • 医学影像智能识别:辅助判断
    • 病例大数据智能诊疗:专家写的病例的分享
  • 在教育领域的应用
    • AI 外语老师:聊天机器人
    • 智能解题:相似性匹配,找到匹配的答案
  • 在社交领域的应用
    • 舆情监控与分析,引导智能广告的投放
  • 在金融领域的应用
    • 大数据风控,在金融借贷中,识别出高风险用户
    • 金融领域的量化交易
  • 在新零售领域的应用
    • 无人超市的应用,提升购物体验
  • 在交通领域的应用
    • 无人驾驶

总的来说,利用大数据和机器学习,发掘数据中的规律,进而对当前的事情做出预测和判断,使机器表现出智能的特性,正变得越来越普及。

移动计算与移动数据

  • 传统的软件计算处理模型,是 “输入 -> 计算 -> 输出” 模型,也就是数据输入给程序
  • 现在的数据是PB级别的数据,数据庞大,将程序分发到数据所在的地方进行计算,也就是所谓的移动计算比移动数据划算

从RAID看垂直伸缩到水平伸缩的演化

大规模数据存储需要解决的核心问题:

  • 数据存储容量的问题
  • 数据读写速度的问题
  • 数据可靠性问题

实现更强的计算能力和更大规模的数据存储有两种思路:

  • 第一种是升级计算机(scaling up 垂直伸缩)
  • 第二种是用分布式系统(scaling out 水平伸缩)

大数据存储的王者:HDFS

类似于RAID的结构,是通过分布式系统的方式实现大规模的数据存储和计算
从顶层到底层为:
ZooKeeper (选举,争夺znode锁) —> NameNode(主从) —> DataNodes(不同机架)

MapReduce 既是编程模型又是计算框架

开发人员必须基于 MapReduce 编程模型进行编程开发,然后将程序通过 MapReduce 计算框架分发到 Hadoop 集群中运行。

编程模型:
一对 —> Map —> 一对 —> 将相同的 Key 合并,形成 —> 输入到reduce —> 输出零个或多个

MapReduce 的 WordCount 的程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class WordCount {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
//将每个单词输出一个 <word, 1>的 <key, value> --> <word, <1,1,1,1,...>>
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
//将集合中的1求和 --> <word, sum>
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
}

一个 map 函数可以针对一部分数据进行计算,也就是说可以将一个大数据切分成很多块, MapReduce 计算框架为每个数据块分配一个 map 函数去计算,从而实现大数据的分布式计算。

MapReduce 既可能指编程模型,也就是一个 MapReduce 程序,也可能是指计算框架,执行大数据的分布式计算。

模型就是人们对一类事物的概括与抽象,可以帮助我们更好的理解事物的本质,更方便的解决问题。

总结 MapReduce 的过程:

  1. 在 Map 阶段为每一个数据块分配一个 Map 计算任务,然后将所有 Map 输出的 Key 进行合并
  2. 相同的 Key 及其对应的 Value 发送给同一个 Reduce 任务去处理

MapReduce 计算框架的运作

这个过程有两个问题需要处理:

  • 如何为每个数据块分配一个 Map 计算任务
  • 处于不同服务器的 Map 输出 , 如何把相同的 Key 聚合在一起发送给 Reduce 任务进行处理

MapReduce 作业启动和运行机制

运行过程涉及三类关键进程:

  • 大数据应用进程:包含 Map 和 Reduce 类、输入输出文件路径等
  • JobTracker 进程:这类进程根据要处理的输入数据量,启动相应的 Map 和 Reduce 程序进程
  • TaskTracker 进程:负责启动和管理 Map 进程以及 Reduce 进程

注: JobTracker 进程和 TaskTracker 进程是主从关系,也就是相对应的主从服务器

也就是 HDFS 中主服务器是 NameNode,从服务器是 DataNode,相应的一主多从的主要架构模式。主服务器只有一台,掌控全局,从服务器有多台,负责具体的事情。

所有的这一切都由 MapReduce 计算框架完成,而使用者只需要编写一个 map 函数和一个 reduce 函数就可以,不需要关心着两个函数是如何分布启动到集群上的,也不用关心数据块又是如何分配给计算任务的。

MapReduce 数据合并与连接机制

在 map 输出与 reduce 输入之间,MapReduce 框架会进行数据的合并与连接操作,这个操作叫 shuffle,也就是相同的 需要 shuffle到具体的 Reduce 任务 ID上,这个过程需要 partitioner 来实现

1
2
3
public int getPartiontion(K2 key, V2 value, int numReduceTasks){
return (key.hashCode() & Inter.MAX_VALUE) % numReduceTasks;
}

shuffle: 分布式计算需要将不同服务器上的相关数据合并到一起进行下一步的计算,这就是shuffle, 目的就是让数据关联起来

Yarn 资源调度框架

Hadoop 由三部分组成:

  • 分布式文件系统 HDFS
  • 分布式计算框架 MapReduce
  • 分布式集群资源调度框架 Yarn(Yet Another Resource Negotiator)

Yarn 包含两个部分也是两种主要进程:

  • 资源管理器(Resource Manager)
    • 调度器:资源分配算法,如 Fair Scheduler、 Capacity Scheduler;资源分配单位是容器(container)
    • 应用程序管理器:负责应用程序的提交、监控应用程序运行状态等
  • 节点管理器(Node Manager)

Yarn 的工作流程:

  1. 向 Yarn 提交应用程序
  2. ResourceManager 进程和 NodeManager 进程通信,为用户程序分配第一个容器(包含 MapReduce ApplicationMaster)
  3. MapReduce ApplicationMaster 启动,向 ResourceManager 进程注册并申请资源
  4. MapReduce ApplicationMaster 与 NodeManager 进程通信,分发 MapReduce 程序至 NodeManager 所在服务器
  5. MapReduce 任务在运行期间与 MapReduce ApplicationMaster 通信,提交运行状态,直到任务结束
  6. MapReduce ApplicationMaster 向 ResourceManager 进程注销并释放所有的容器资源

我们能从 Hadoop 中学到什么

方向对了, 路就不怕远 —阿里
不要用你战术上的勤奋,掩盖你战略上的懒惰 —雷军
选择比努力重要 —Somebody

大数据领域的架构模式,也就是集中管理,分布存储与计算;不要纠结仅仅学习一些新的技术和知识点上了,构建起知识和思维体系,不管任何新技术的出现,都能够快速容纳到你的知识和思维体系里面。—-更新和建立你的知识体系

作者的学习新知识点的心得体会,使用「5—20—2 法则」:

  • 用 5 分钟了解这个新知识点的特点、应用场景、要解决的问题
  • 用 20 分钟了解它的主要涉及原理、核心思想和思路
  • 用 2 小时看关键的设计细节,尝试使用或者做一个 demo

如果在相应的时间不能了解到基本的信息或者比较模糊,那这个技术就可以放一放。一种真正有价值的好技术,这次放弃了,它过一阵子还会换一种方式继续出现在你的面前,然后再使用5-20-2法则,或许就会理解了。

Reference

觉得不错的话,那就请博主喝个茶吧!