1. 大数据产生背景
1.1. 概念的产生
- 1980年,托夫勒在《第三次浪潮》中提到“大数据”一词
- 2011年,麦肯锡正式定义了大数据的概念
- 2010年后,随着互联网及云计算的发展,大数据技术开始走向实现,并进入人们的生活
1.2. 大数据的特征
- Volume(规模):每天产生海量数据
- Velocity(速度):数据产生的速度越来越快
- Variety(多样):数据格式的多样性,例如文本、语音、图片等
- Veracity(质量):数据的质量差别可以非常大
- Valence(连接):大数据之间的联系
大数据的核心价值是预测
1.3. 文件系统的演进
- 本地文件系统(LFS)- 本地硬盘
- 网络文件系统(NFS)- 网络共享
- 分布式文件系统(DFS)
DFS文件系统的优点:
- 数据可扩展性(Data Scalability):存储量不够了增加磁盘阵列即可
- 容错性(Fault Tolerance):如果主机或者机柜宕机,很难导致数据丢失,或系统停止工作
- 高并发性(High Concurrency):并行处理数据成为可能
2. 大数据技术
2.1. 理论基础
- 2003 Google File System
- 2004 MapReduce: Simplified Data Processing on Large Clusters
- 2006 Google Big Table
2.2. MapReduce
MapReduce的灵感来源于函数式语言中的内置函数Map和Reduce。简单来说,在函数式语言里,Map表示对一张列表(List)中的每个元素进行计算,Reduce表示对一张列表中的每个元素进行迭代计算。
- Input:英文单词组
- Map:将每个单词拆分开,并组成key-value对(Deer, 1)
- Shuffle:将key相同的放到一起 {Car: 1, 1, 1}
- Reduce:将key相同的进行累加
2.3. HADOOP
Hadoop是一个由Apache基金会所开发的分布式系统基础架构,其核心是HDFS和MapReduce。
2.3.1. 组件
- Hadoop Common: The common utilities that support the other Hadoop modules.
- Hadoop Distributed File System (HDFS™): A distributed file system that provides high-throughput access to application data.
- Hadoop YARN: A framework for job scheduling and cluster resource management.
- Hadoop MapReduce: A YARN-based system for parallel processing of large data sets.
[图片上传失败...(image-2975a7-1519780100688)]
2.3.1. HDFS
- NameNode:Master节点管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS的名称空间;
- SecondaryNameNode:保存着NameNode的部分信息,是NameNode的冷备份;
- DataNode:负责存储client发来的数据块block;执行数据块的读写操作。
HDFS读文件流程
- 首先调用FileSystem对象的open方法获取DistributedFileSystem实例。
- DistributedFileSystem通过RPC获得文件第一批block的locations,同一block按照重复数会返回多个locations,距离客户端近的排在前面。
- 前两步会返回一个FSDataInputStream对象,该对象会被封装成 DFSInputStream对象。客户端调用read方法,DFSInputStream就会找出离客户端最近的datanode并连接。
- 数据从datanode源源不断的流向客户端。
- 如果第一个block块的数据读完了,就会关闭指向第一个block块的datanode连接,接着读取下一个block块。
- 如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的block块都读完,这时就会关闭掉所有的流。
HDFS写文件流程
- 客户端通过调用 DistributedFileSystem 的create方法,创建一个新的文件。
- DistributedFileSystem 通过 RPC调用 NameNode,去创建一个没有blocks关联的新文件。创建前,NameNode 会做各种校验,比如文件是否存在,客户端有无权限去创建等。
- 前两步结束后会返回 FSDataOutputStream 的对象,和读文件的时候相似,FSDataOutputStream 被封装成 DFSOutputStream,DFSOutputStream 可以协调 NameNode和 DataNode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet,然后排成队列 data queue。
- DataStreamer 会去处理接受 data queue,它先问询 NameNode 这个新的 block 最适合存储的在哪几个DataNode里,比如重复数是3,那么就找到3个最适合的 DataNode,把它们排成一个 pipeline。DataStreamer 把 packet 按队列输出到管道的第一个 DataNode 中,第一个 DataNode又把 packet 输出到第二个 DataNode 中,以此类推。
- DFSOutputStream 还有一个队列叫 ack queue,也是由 packet 组成,等待DataNode的收到响应,当pipeline中的所有DataNode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。
- 客户端完成写数据后,调用close方法关闭写入流。
- DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一个 ack 后,通知 DataNode 把文件标示为已完成。
2.3.2. HADOOP中的MapReduce
[图片上传失败...(image-78f9ed-1519780100687)]
2.3.3. YARN(Yet Another Resource Negotiator)
YARN中任务执行过程:
YANR带来的好处:
- 减小了JobTracker的资源消耗,并且让监测每一个Job子任务(tasks)状态的程序分布式化了,更安全、更优美。
- 在新的Yarn中,ApplicationMaster是一个可变更的部分,用户可以对不同的编程模型写自己的AppMst,让更多类型的编程模型能够跑在Hadoop集群中。
- 对于资源的表示以内存为单位,比之前以剩余slot数目更加合理。
- MRv1中JobTracker一个很大的负担就是监控job下的tasks的运行状况,现在这个部分就扔给ApplicationMaster做了。
- ResourceManager中有一个模块叫做ApplicationManager,它是监测ApplicationMaster的运行状况,如果出问题,会在其他机器上重启。
- Container用来作为YARN的一个资源隔离组件,可以用来对资源进行调度和控制。
2.3.4. HADOOP的局限和不足
- 抽象层次低,需要手工编写代码来完成,使用上难以上手;
- 只提供两个操作,Map和Reduce,表达力欠缺;
- 一个Job只有Map和Reduce两个阶段(Phase),复杂的计算需要大量的Job完成,Job之间的依赖关系是由开发者自己管理的;
- 处理逻辑隐藏在代码细节中,没有整体逻辑;
- 中间结果也放在HDFS文件系统中;
- ReduceTask需要等待所有MapTask都完成后才可以开始;
- 时延高,只适用Batch数据处理,对于交互式数据处理,实时数据处理的支持不够;
- 对于迭代式数据处理性能比较差。
2.4. SPARK
专为大规模数据处理而设计的快速通用的计算引擎。
SPARK的特点:
- 快速。比HADOOP快10-100倍。
- 易用。可使用多种编程语言进行交互。
- 通用。提供了SQL,流式计算,机器学习,图计算等框架。
- 多平台运行。可运行于HADOOP、MESOS、云或单机上。
2.4.1. RDD(resilient distributed dataset)
一个RDD代表一个只读的可分区的分布式数据集,内部可以有许多分区(partitions),每个分区又拥有大量的记录(records)。
特征:
- dependencies:建立RDD的依赖关系,主要rdd之间是宽窄依赖的关系,具有窄依赖关系的rdd可以在同一个stage中进行计算。
- partition:一个rdd会有若干个分区,分区的大小决定了对这个rdd计算的粒度,每个rdd的分区的计算都在一个单独的任务中进行。
- preferedlocations:按照“移动数据不如移动计算”原则,在spark进行任务调度的时候,优先将任务分配到数据块存储的位置
- compute:spark中的计算都是以分区为基本单位的,compute函数只是对迭代器进行复合,并不保存单次计算的结果。
- partitioner:只存在于(K,V)类型的rdd中,非(K,V)类型的partitioner的值就是None。
操作:
- transformations - map, flatMap, union, ReduceByKey...
- actions - collect, reduce, count, save, lookupKey...
action会触发真正的作业提交,而transformation算子是不会立即触发作业提交的。(惰性)
每一个 transformation() 方法返回一个新的RDD。(只读)
当遇到action算子时会触发一个job的提交,然后反推回去看前面的transformation算子,进而形成一张有向无环图。在DAG中会进行stage的划分,划分的依据是依赖是否是shuffle,每个stage又可以划分成若干task。
2.4.2. SPARK运行架构
- Cluster Manager:在standalone模式中即为Master主节点,控制整个集群,监控worker。在YARN模式中为资源管理器
- Worker Node:从节点,负责控制计算节点,启动Executor或者Driver。
- Driver: 运行Application 的main()函数
- Executor:执行器,是为某个Application运行在worker node上的一个进程
2.4.3. 运行流程
- 构建Spark Application的运行环境,启动SparkContext
- SparkContext向资源管理器(可以是Standalone,Mesos,Yarn)申请运行Executor资源
- Executor向SparkContext申请Task
- SparkContext将应用程序分发给Executor
- SparkContext构建成DAG图,将DAG图分解成Stage、将Taskset发送给Task Scheduler,最后由Task Scheduler将Task发送给Executor运行
- Task在Executor上运行,运行完释放所有资源
2.5. 其它大数据相关项目
- HIVE
- HBASE
- STORM
- ZOOKEEPER
- FLUME
- KAFKA