2003~2006年,谷歌公布的关于GFS、MapReduce、BigTable的技术论文奠定了大数据发展的基石,Hadoop也是参考这几篇论文而实现,而Hadoop的发展极大的推动了大数据技术的发展。
大数据是一门市场语言,代表的一种理念、一种解决问题的思路、一系列技术的集合(硬件、数据库、操作系统、Hadoop、Spark …)。
通常可以理解为具有体量巨大(Volume)处理速度较快(Velocity)、数据类型多样(Variety)以及商业价值较高(Value)等4V特点的数据。
BI:商业智能(Business Intelligence)
相同之处,都是从数据中挖掘出价值,促进商业成功。不同之处,分布式技术的发展,处理能力的提升,因此在对数据处理理念上也有了扩展:
虽然大数据发展到现在有了一定的技术和商业的积累,但是仍有很多的问题,最典型的就是:
运营商常见的大数据业务:
从架构图中,可以看出:
由业务场景驱动的架构才是真正可用的架构。未来大数据分析平台的发展趋势可以总结为如下几点:
1.云优先:服务端利用云的部署和扩展能力,保证数据访问高并发,高可用,高可靠。
2.流优先:数据源更多的是流数据,要求实时分析,进行秒级或者分级运算。
云计算的定义:
云计算包含如下几个层面的服务
大数据在云上是一种PasS应用,提供大数据服务的公司有很多(亚马逊,阿里,腾讯,百度…)。大数据和云相结合,一般有两种模式。
1.集群模式
核心是通过云的能力简化了集群的创建、运维等。
2.服务模式
进一步简化了大数据的使用,用户不必担心集群资源这些事,只需将大数据任务提交给大数据云。
Amazon EMR是一种Web服务,让用户轻松、快速的处理大量的数据。
在Amazon EMR上运行的Hadoop集群使用EC2实例作为虚拟Linux服务器用于主节点和从属节点,将Amazon S3用于输入和输出数据的批量存储,并将Cloud Watch用于监控集群性能和发出警报。
AWS EMR采用存储和计算分离的架构,数据存储在S3上,计算资源来自EC2实例。集群创建之后,MapReduce通过HDFS代理调用S3接口,从S3上读取和写入数据。
Amazon EMR为集群中的服务器定义了三种角色:
1.主节点(管理集群):协调将MapReduce可执行文件和原始数据子集分配到核心实例组和任务实例组。此外,它还会跟踪每个任务的执行状态,监控实例组的运行状况。一个集群中只有一个主节点。这与Hadoop主节点映射。
2.核心节点:使用Hadoop分布式文件系统(HDFS)运行任务和存储数据。这与Hadoop从属节点映射。
3.任务节点(可选)——运行任务:这与Hadoop从属节点映射。
集群是一组执行工作的服务器。在Amazon EMR中,集群是一组以EC2实例形式运行的虚拟服务器。
通过控制台和命令行与EMR进行交互。
存储和计算分离架构,最大的好处是集群按需创建,需要时创建集群,不需要时可以释放,从而节省成本。该架构非常适合云上按需获取资源的模式。
集群模式解决了大数据组件安装、运维的事情,极大的降低了大数据的使用和运维难度,但是,对于用户来说,还需要解决大数据组件知识,才能规划好集群的大小,写好代码。
服务模式就是将资源规划、扩容、缩容这些事情都省略,可以给用户提供各种API,交互界面,程序,用户只需直接提交代码或者直接使用定制的界面。
这种模式典型的例子是Data Lake,用户不必要担心各个独立的组件,Data Lake提供了所需的功能,使开发人员可以更轻松的存储任何大小、形状的数据,同时可与批量、流式、交互式分析一起运行。
这种模式是构建在集群模式的基础上,把各个服务组装在一起,提供统一的访问。服务本省提供自动弹性伸缩能力,数据自动搬迁能力。
Data Lake主要包括 Data Lake Store 和 Data Lake Analytics
Data Lake Store是一个专门的文件存储,对外提供HDFS兼容的API。Hadoop的分析工具(MapReduce/Hive)可以直接访问Data Lake Store的数据。所有数据都可以以原始数据格式存储,支持结构化和非结构化的数据存储。通过Data Lake Store提供的工具可对数据直接进行操作。
存储是所有大数据组件的基础,对于大数据来说,调优很大情况下等价于调存储。
存储有如下关键指标:
存储硬件的发展:
从接口来看,存储主要分为:
HDFS是Hadoop领域纯软件实现的块接口的存储软件,是Hadoop系列的基础软件。
HDFS(Hadoop Distributed File System)是一个分布式文件系统,它具有高容错性,同时提供高吞吐量的数据访问。适合在大型数据集上使用。
HDFS是Maste-Slave结构,分为NameNode、SecondaryNameNode和DataNode三种角色。
- NameNode:在Hadoop1.x中只有一个Maste节点,管理HDFS的命名空间和数据映射信息和处理客户端请求。
- SecondaryNameNode:辅助NameNode,分担NameNode的工作紧急情况下辅助恢复NameNode。
- DataNode:Slave节点,实际存储数据,执行数据的读写,并汇报信息给NameNode。
HDFS的读/写操作
客户端发起读文件请求,向NameNode发送请求,由于NameNode存放着DataNode的信息,所以NameNode会向客户端返回元数据,这些元数据包含了数据块的信息等。客户端得到元数据后直接去读取数据块,实现了文件的读取。
客户端得到文件后将文件进行分块,这些分块的数据信息会写入NameNode,然NameNode会告诉客户端DataNode的情况。客户端得到这些信息后就向DataNode开始写数据,然后DataNode会以流水线方式复制,因为要保证数据有3份,这些操作完成之后会把DataNode的最新信息反馈到NameNode。
应用场景
对象存储主要是解决数据归档和云服务两大需求:
2.关键特性
对象存储是一种基于对象的存储设备,具备智能、自我管理能力,通过web服务协议实现对象的读写和存储资源的访问。
对象存储包含两种数据描述:容器、对象。容器和对象都有一个全局唯一的ID。对象存储采用扁平化结构管理所有数据,用户/应用通过接入码认证后,只需要根据ID就可以访问容器/对象及相关的数据、元数据和对象属性。
多租户特性可以使用同一种架构,同一套系统为不同用户和应用提供存储服务,并分别为这些用户和应用设置数据保护、数据存储策略,并确保这些数据之间相互隔离。
- 数据完整性和安全性
资源管理的本质是集群、数据中心级别的资源的统一管理和分配,以提高使用效率,其中,多租户、弹性伸缩、动态分配是资源管理需要解决的核心问题。
1.子系统的高效调用
任务之间资源隔离,减少争抢。任务分配调度时结合资源分配,各个任务分配合理的资源,充分利用系统资源,减少资源利用不充分问题。资源调度结合优先级,优先级越高的可以分配越多的资源。
2.提高全系统的资源利用率
各个子系统不同时期对资源的需求不同,可以平滑系统资源的利用
3.支持动态调整切片资源,增强系统的扩展性
子系统对资源的规划很难一次性确定,通过资源调度管理系统支持动态扩展,增强系统扩展性。
Hadoop开源领域比较有名的资源调度框架有:
- YARN
- Mesos
- Borg
- Omega
1.产生背景
(1)直接源于MapReduce1.x的缺陷:
- 扩展性受限
- 单点故障
- 难以支持MR之外的计算
(2)多计算框架之间数据共享困难
- MR:离线计算框架
- Storm:实时计算框架
- Spark:内存计算框架
2.架构
ResourceManager(RM)、NodeManager(NM)、ApplicationMaster(AM)。其中,ResourceManager负责所有资源的监控、分配和管理;ApplicationMaster负责每一个具体应用程序的调度和协调;NodeManager负责每一个节点的维护。对于所有的applications,RM拥有绝对的控制权和对资源的分配权。而每个AM则会和RM协商资源,同时和NodeManager通信来执行和监控task。
多租户(Multi Tenancy/Tenant)是一种软件架构,其定义是:在一台服务器上运行单个应用实例,它为多个租户提供服务。在SaaS实施过程中,有一个显著的考量点,就是如何对应用数据进行设计,以支持多租户,而这种设计的思路,是要在数据的共享、安全隔离和性能间取得平衡。主流的方案是:
- 独立数据库
- 共享数据库、独立 Schema
- 共享数据库、共享 Schema、共享数据表
数据通常情况下分为结构数据和非结构数据两种。
结构数据如DW数据,结构固定,每个字段有固定的语义和长度。
非结构化数据有文本数据,图像数据,自然语言数据等,计算机程序无法直接处理,需要进行格式转化或信息提取。
如果要分析互联网上的数据,首先的把数据从网络上获取下来,这就需要网络爬虫技术。
网络爬虫是搜索引擎抓取系统的重要组成部分。主要任务是将互联网上的网页下载到本地,形成网络内容的镜像备份。
其中,下载的网页文档一部分存储到页面库中,等待建立索引等后续处理,另一方面将网页中的URL存入已抓取URL库中,提供给步骤8进行过滤。
设计爬虫的时候需要掌握一些策略
- 深度优先遍历
- 广度优先遍历
- 反向连接数遍历
- PageRank策略
- 大站优先策略
一个自顶向下设计的爬虫例子
当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume提供了三种级别的可靠性保障,从强到弱依次分别为:end-to-end(收到数据agent首先将event写到磁盘上,当数据传送成功后,再删除;如果数据发送失败,可以重新发送。),Store on failure(这也是scribe采用的策略,当数据接收方crash时,将数据写到本地,待恢复后,继续发送),Best effort(数据发送到接收方后,不会进行确认)。
Flume采用了三层架构,分别为agent,collector和storage,每一层均可以水平扩展。其中,所有agent和collector由master统一管理,这使得系统容易监控和维护,且master允许有多个,这就避免了单点故障问题。
所有agent和colletor由master统一管理,这使得系统便于维护。多master情况,Flume利用ZooKeeper,保证动态配置数据的一致性。用户可以在master上查看各个数据源或者数据流执行情况,且可以对各个数据源配置和动态加载。Flume提供了web 和shell script command两种形式对数据流进行管理。
用户可以根据需要添加自己的agent,collector或者storage。此外,Flume自带了很多组件,包括各种agent(file, syslog等),collector和storage(file,HDFS等)。
Flume采用了分层架构:分别为agent,collector和storage。其中,agent和collector均由两部分组成:source和sink,source是数据来源,sink是数据去向。
Flume使用两个组件:Master和Node,Node根据在Master shell或web中动态配置,决定其是作为Agent还是Collector。
Flume 部署流程
$wget http://cloud.github.com/downloads/
cloudera/flume/flume-distribution-0.9.4-bin.tar.gz
$tar -xzvf flume-distribution-0.9.4-bin.tar.gz
$cp -rf flume-distribution-0.9.4-bin /usr/local/flume
$vi /etc/profile #添加环境配置
export FLUME_HOME=/usr/local/flume
export PATH=.:$PATH::$FLUME_HOME/bin
$source /etc/profile
$flume #验证安装
[详细配置详见](http://www.aboutyun.com/thread-8917-1-1.html) —
数据采集上来之后,需要传送到后端进行进一步的分析,前端的采集和后端的处理往往是多对多的关系。为了简化传送逻辑,增强灵活性,在前端的采集和后端的处理之间需要一个消息中间件负责消息转发,以保障消息的可靠性,匹配前后段的速度差。
在大数据系统中,常常会碰到一个问题,整个大数据是由各个子系统组成,数据需要在各个子系统中高性能,低延迟的不停流转。传统的企业消息系统并不是非常适合大规模的数据处理。为了已在同时搞定在线应用(消息)和离线应用(数据文件,日志)Kafka就出现了。Kafka可以起到两个作用:
Kafka的整体架构非常简单,是显式分布式架构,producer、broker(kafka)和consumer都可以有多个。Producer,consumer实现Kafka注册的接口,数据从producer发送到broker,broker承担一个中间缓存和分发的作用。broker分发注册到系统中的consumer。broker的作用类似于缓存,即活跃的数据和离线处理系统之间的缓存。
Consumer从kafka集群pull数据,并控制获取消息的offset
Apache Kafka网站
流是一种数据传送技术,它把客户机收到的数据变成稳定连续的流,源源不断的送出。正是由于数据传送呈持续不停的状态,因此流引擎需要持续不断地的处理数据。通常有两种方式处理流,一种是一个消息传送过来,立即处理,另一种是以较小的Batch模拟流处理。
Spark Streaming 是Spark核心API的一个扩展,可以实现高吞吐量的、具备容错机制的实时流数据的处理。支持从多种数据源获取数据,包括Kafk、Flume、Twitter以及TCP sockets,从数据源获取数据之后,可以使用诸如map、reduce、join和window等高级函数进行复杂算法的处理。最后还可以将处理结果存储到文件系统,数据库和现场仪表盘。还可以使用Spark的其他子框架,如集群学习、图计算等,对流数据进行处理。
Spark Streaming处理的数据流图:
Spark Streaming在内部的处理机制是,接收实时流的数据,并根据一定的时间间隔拆分成一批批的数据,然后通过Spark Engine处理这些批数据,最终得到处理后的一批批结果数据。流数据分成一批一批后,通过一个先进先出的队列,然后 Spark Engine从该队列中依次取出一个个批数据,把批数据封装成一个RDD,然后进行处理。
实时性,会牵涉到流式处理框架的应用场景。Spark Streaming将流式计算分解成多个Spark Job,对于每一段数据的处理都会经过Spark图分解,以及Spark的任务集的调度过程。对于目前版本的Spark Streaming而言,其最小的Batch Size的选取在0.5~2秒钟之间(Storm目前最小的延迟是100ms左右),所以Spark Streaming能够满足除对实时性要求非常高之外的所有流式准实时计算场景。
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
sc = SparkContext("local[2]", "NetworkWordCount")
ssc = StreamingContext(sc, 1)
lines = ssc.socketTextStream("localhost", 9999)
words = lines.flatMap(lambda line: line.split(" "))
pairs = words.map(lambda word: (word, 1))
wordCounts = pairs.reduceByKey(lambda x, y: x + y)
wordCounts.pprint()
ssc.start()
ssc.awaitTermination()
—
批处理技术,发展最早,应用也最广泛,定义为:
工作在面对复杂的业务以及海量的数据处理时,无需人工干预,仅需要定期读入批量数据,然后完成相应业务处理并进行归档操作。
一个典型的批处理场景:
系统A从数据库获取数据,进过业务处理后,导出系统B所需要的数据到文件中,系统B读取文件数据,进过业务处理后,最后存放在数据库中,通常情况下该批处理动作在每天晚上12点至2点执行。
Reduce会接收到不同map任务传来的数据,并且每个map传来的数据都是有序的。如果reduce端接受的数据量相当小,则直接存储在内存中,如果数据量超过了该缓冲区大小的一定比例,则对数据合并后溢写到磁盘中;
随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是为了给后面的合并节省时间。
MapReduce会让写入磁盘的数据尽可能地少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到reduce函数。
在集群中的任意一个节点提交MapReduce程序;
JobClient收到作业后,JobClient向JobTracker请求一个Job ID;
将运行作业所需要的资源文件复制到HDFS上文件夹名为该作业的Job ID;
获得作业ID后,提交作业
JobTracker接收到作业后,将其放在一个作业队列里,等待作业调度器对其进行调度
将程序JAR包复制到该TaskTracker上来运行,这叫移动计算
TaskTracker每隔一段时间会给JobTracker发送一个心跳
运行的TaskTracker从HDFS中获取运行所需要的资源
TaskTracker获取资源后启动新的JVM虚拟机;
Hadoop部署级实战
Hadoop由于频繁的读写磁盘而导致了性能的下降,Spark则利用内存的容量一直在增加,价格一直在下降的优势提出基于内存的分布式处理软件。
其愿景是做一款全能软件,可以统一批处理,交互式处理,流处理等场景,降低开发和运维的难度。
其他内容
- spark相关术语定义
- DAGScheduler
- TaskScheduler
- RDD运行原理
- Spark on YARN运行过程
机器学习是一门多领域交叉的学科,涉及概率论,统计学,逼近论,凸优化,算法复杂度分析等知识,主要研究计算机如何模拟人的行为以获取跟多的知识或技能,重新组织已有的知识结构,使其不断的改善自身性能。
数据挖掘需要利用除机器学习之外的很多技术来解决数据噪音,数据规模,数据仓储问题
数据挖掘是从目的出发的,机器学习则是从方法出发的,两者有很大的交叉,但不相同。
数据挖掘/机器学习流程:
机器学习概览
option = {
angleAxis: {
type: 'category',
data: ['周一', '周二', '周三', '周四',
'周五', '周六', '周日'],
z: 10
},
radiusAxis: {
},
polar: {
},
series: [{
type: 'bar',
data: [1, 2, 3, 4, 3, 5, 1],
coordinateSystem: 'polar',
name: 'A',
stack: 'a'
}],
legend: {
show: true,
data: ['A', 'B', 'C']
}
};
—
D3 的全称是(Data-Driven Documents),顾名思义可以知道是一个被数据驱动的文档。听名字有点抽象,说简单一点,其实就是一个 JavaScript 的函数库,使用它主要是用来做数据可视化的。
var rand = d3.random.normal(0,25);
var dataset = [];
for(var i=0;i<100;i++){
dataset.push( rand() );
}
var bin_num = 15;
var histogram = d3.layout.histogram()
.range([-50,50])
.bins(bin_num)
.frequency(true);
调用R脚本在服务端生成图片,随后嵌入前端指定的位置。
项目数据主要来源于已有的数据或者通过其他途径得到的数据,将数据保存到HDFS或者mysql中,通过Sqoop导入到mysql中,然后使用spark或者mapreduce进行处理,处理后的数据导入到Hive、Hbase,最后使用java、R、spark等工具进行展示与分析。其中的问题包括,设计,开发,调试,问题定位以及处理,版本管理等。
使用的技术都是开源的,如Hadoop、Hive、Spark、R、OpenStack、Mysql等总体架构如图所示:
参考