课程链接:大数据技术基础课程_厦门大学数据库实验室 http://dblab.xmu.edu.cn/post/1089/
课程里介绍了大数据的基本概念、大数据处理架构Hadoop、分布式文件系统HDFS、分布式数据库HBase、NoSQL数据库、云数据库、分布式并行编程模型MapReduce、Spark以及大数据在互联网、生物医学和物流等各个领域的应用
• 在Hadoop、HDFS、HBase、MapReduce、Spark等重要章节,安排了入门级的实践操作,让学生更好地学习和掌握大数据关键技术
答:
云计算为大数据提供了技术基础,大数据为云计算提供了用武之地
物联网是大数据的重要来源,大数据技术为物联网数据分析提供支撑
云计算为物联网提供海量数据存储能力,物联网为云计算技术提供了广阔的应用空间。
1. 分布式存储:GFS\HDFS , BigTable\HBase ,NoSQL(键值、列族、图形、文档数据库) ,NewSQL(如:SQL Azure)
2. 分布式处理: MapReduce
公有云 ===软件即服务SaaS :由于是计量服务,SaaS 允许出租一个应用程序,并计时收费
混合云 ===平台即服务PaaS :类似IaaS,但是它包括操作系统和围绕特定应用的必需的服务
私有云 ===基础设施即服务IaaS:将基础设施(计算资源和存储)作为服务出租
云计算关键技术包括:虚拟化、分布式存储、分布式计算、多租户等
物联网中的关键技术包括识别和感知技术(二维码、RFID、传感器等)、网络与通信技术、数据挖掘与融合技术等
IBM前首席执行官郭士纳的观点,IT领域每隔十五年就会迎来一次重大变革
第一次浪潮 1980年前后 个人计算机 信息处理 Intel、AMD、IBM、苹果、微软、联想、戴尔、惠普等
第二次浪潮 1995年前后 互联网 信息传输 雅虎、谷歌、阿里巴巴、百度、腾讯等
第三次浪潮 2010年前后 物联网、云计算和大数据 信息爆炸 将涌现出一批新的市场标杆企业
技术条件已经成熟:
1. 存储设备容量不断增加
2. CPU处理能力大幅提升
3. 网络带宽不断增加 (每秒周转次数,前端总线速率,转移数据量)
大数据发展历程:90年代数据库概念----------->00年代大数据解决方案逐渐走向成熟,形成了并行计算与分布式系统两大核心技术,谷歌的GFS和MapReduce等大数据技术受到追捧----------->10年代大数据技术得到广泛应用
思维方式方面,大数据完全颠覆了传统的思维方式:
全样而非抽样
效率而非精确
相关而非因果
大数据关键技术
3. 分布式存储:GFS\HDFS , BigTable\HBase ,NoSQL(键值、列族、图形、文档数据库) ,NewSQL(如:SQL Azure)
4. 分布式处理: MapReduce分布式并行编程模型
HDFS:分布式并行编程模型
MapReduce:分布式并行编程模型
HBase : Hadoop上的非关系型的分布式数据库
Zookeeper :提供分布式协调一致性服务
SSH 为 Secure Shell 的缩写,是建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠、专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
配置SSH的原因:
Hadoop名称节点(NameNode)需要启动集群中所有机器的Hadoop守护进程,这个过程需要通过SSH登录来实现。Hadoop并没有提供SSH输入密码登录的形式,因此,为了能够顺利登录每台机器,需要将所有机器配置为名称节点可以无密码登录它们
Hadoop集群的整体性能取决于CPU、内存、网络以及存储之间的性能平衡。因此运营团队在选择机器配置时要针对不同的工作节点选择合适硬件类型
一个基本的Hadoop集群中的节点主要有
NameNode:负责协调集群中的数据存储
DataNode:存储被拆分的数据块
JobTracker:协调数据计算任务
TaskTracker:负责执行由JobTracker指派的任务
SecondaryNameNode:帮助NameNode收集文件系统运行的状态信息
HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌BigTable的开源实现,主要用来存储非结构化和半结构化的松散数据。
关系数据库已经流行很多年,并且Hadoop已经有了HDFS和MapReduce,为什么需要HBase?
Hadoop无法满足大规模数据实时处理应用的需求
HDFS面向批量访问模式,不是随机访问模式
HBase已经成功应用于互联网服务领域和传统行业的众多在线式数据分析处理系统
(1)数据类型:关系数据库采用关系模型,具有丰富的数据类型和存储方式,HBase则采用了更加简单的数据模型,它把数据存储为未经解释的字符串
(2)数据操作:关系数据库中包含了丰富的操作,其中会涉及复杂的多表连接。HBase操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等,因为HBase在设计上就避免了复杂的表和表之间的关系
(3)存储模式:关系数据库是基于行模式存储的。HBase是基于列存储的,每个列族都由几个文件保存,不同列族的文件是分离的
(4)数据索引:关系数据库通常可以针对不同列构建复杂的多个索引,以提高数据访问性能。HBase只有一个索引——行键,通过巧妙的设计,HBase中的所有访问方法,或者通过行键访问,或者通过行键扫描,从而使得整个系统不会慢下来
(5)数据维护:在关系数据库中,更新操作会用最新的当前值去替换记录中原来的旧值,旧值被覆盖后就不会存在。而在HBase中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧有的版本仍然保留
(6)可伸缩性:关系数据库很难实现横向扩展,纵向扩展的空间也比较有限。相反,HBase和BigTable这些分布式数据库就是为了实现灵活的水平扩展而开发的,能够轻易地通过在集群中增加或者减少硬件数量来实现性能的伸缩
表:HBase采用表来组织数据,表由行和列组成,列划分为若干个列族
行:每个HBase表都由若干行组成,每个行由行键(row key)来标识。
列族:一个HBase表被分组成许多“列族”(Column Family)的集合,它是基本的访问控制单元
列限定符:列族里的数据通过列限定符(或列)来定位
单元格:在HBase表中,通过行、列族和列限定符确定一个“单元格”(cell),单元格中存储的数据没有数据类型,总被视为字节数组byte[]
时间戳:每个单元格都保存着同一份数据的多个版本,这些版本采用时间戳进行索引
HBase的实现包括三个主要的功能组件:
(1)库函数:链接到每个客户端
(2)一个Master主服务器
(3)许多个Region服务器
主服务器Master负责管理和维护HBase表的分区信息,维护Region服务器列表,分配Region,负载均衡
Region服务器负责存储和维护分配给自己的Region,处理来自客户端的读写请求
客户端并不是直接从Master主服务器上读取数据,而是在获得Region的存储位置信息后,直接从Region服务器上读取数据
客户端并不依赖Master,而是通过Zookeeper来获得Region位置信息,大多数客户端甚至从来不和Master通信,这种设计方式使得Master负载很小
Region的定位
为了加速寻址,客户端会缓存位置信息,同时,需要解决缓存失效问题
寻址过程客户端只需要询问Zookeeper服务器,不需要连接Master服务器
第一层 Zookeeper文件 记录了-ROOT-表的位置信息
第二层 -ROOT-表 记录了.META.表的Region位置信息-ROOT-表只能有一个Region。通过-ROOT-表,就可以访问.META.表中的数据
第三层 .META.表 记录了用户数据表的Region位置信息,.META.表可以有多个Region,保存了HBase中所有用户数据表的Region位置信息
Store是Region服务器的核心
多个StoreFile合并成一个
单个StoreFile过大时,又触发分裂操作,1个父Region被分裂成两个子Region
HBase采用HLog保证系统恢复
HBase系统为每个Region服务器配置了一个HLog文件,它是一种预写式日志(Write Ahead Log)
HBase只有一个针对行健的索引
访问HBase,只有三种方式:
1.通过单个行健访问
2.通过一个行健的区间来访问
3.全表扫描
使用其他产品为HBase行健提供索引功能:
一,Hindex二级索引: Hindex 是华为公司开发的纯 Java 编写的HBase二级索引,兼容 Apache HBase 0.94.8
二,HBase+Redis:
Redis+HBase方案
Coprocessor构建二级索引
Redis做客户端缓存
三,HBase+solr
Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器
分布式文件系统HDFS的基本原理和使用方法
分布式文件系统把文件分布存储到多个计算机节点上,成千上万的计算机节点构成计算机集群
分布式文件系统在物理结构上是由计算机集群中的多个节点构成的,
这些节点分为两类
一类叫“主节点”(Master Node)或者也被称为“名称结点”(NameNode):存储元数据,元数据保存在内存中,保存文件,block,datanode之间的映射关系
NameNode中保存了两个核心的数据结构,即FsImage和EditLog
FsImage用于维护文件系统树以及文件树中所有的文件和文件夹的元数据
操作日志文件EditLog中记录了所有针对文件的创建、删除、重命名等操作
另一类叫“从节点”(Slave Node)或者也被称为“数据节点”(DataNode):存储文件内容,文件内容保存在磁盘,维护了block id到datanode本地文件的映射关系。
每个数据节点中的数据会被保存在各自节点的本地Linux文件系统中
通信协议:HDFS是一个部署在集群上的分布式文件系统,因此,很多数据需要通过网络进行传输
所有的HDFS通信协议都是构建在TCP/IP协议基础之上的,客户端通过一个可配置的端口向名称节点主动发起TCP连接,并使用客户端协议与名称节点进行交互
名称节点和数据节点之间则使用数据节点协议进行交互
客户端:
客户端是用户操作HDFS最常用的方式,HDFS在部署时都提供了客户端
客户端可以支持打开、读取、写入等常见的操作,并且提供了类似Shell的命令行方式来访问HDFS中的数据
此外,HDFS也提供了Java API,作为应用程序访问文件系统的客户端编程接口
HDFS只设置唯一一个名称节点,这样做虽然大大简化了系统设计,但也带来了一些明显的局限性,具体如下:
(1)命名空间的限制:名称节点是保存在内存中的,因此,名称节点能够容纳的对象(文件、块)的个数会受到内存空间大小的限制。
(2)性能的瓶颈:整个分布式文件系统的吞吐量,受限于单个名称节点的吞吐量。
(3)隔离问题:由于集群中只有一个名称节点,只有一个命名空间,因此,无法对不同应用程序进行隔离。
(4)集群的可用性:一旦这个唯一的名称节点发生故障,会导致整个集群变得不可用。
冗余数据保存:多副本方式: 作为一个分布式文件系统,为了保证系统的容错性和可用性,HDFS采用了多副本方式对数据进行冗余存储,通常一个数据块的多个副本会被分布到不同的数据节点上
数据存取策略:HDFS提供了一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API获取自己所属的机架ID
数据错误与恢复: HDFS具有较高的容错性,可以兼容廉价的硬件,它把硬件出错看作一种常态,而不是异常,并设计了相应的机制检测数据错误和进行自动恢复,主要包括以下几种情形:名称节点出错、数据节点出错和数据出错。
NoSQL=Not Only SQL
(1)灵活的可扩展性
(2)灵活的数据模型
(3)与云计算紧密融合
关系数据库已经无法满足Web2.0的需求。主要表现在以下几个方面:
(1)无法满足海量数据的管理需求
(2)无法满足数据高并发的需求
(3)无法满足高可扩展性和高可用性的需求
MongoDB、Redis等是针对在线业务,两者都抛弃了关系模型
关系数据库和NoSQL数据库各有优缺点,彼此无法取代:
1.关系数据库应用场景:电信、银行等领域的关键业务系统,需要保证强事务一致性
2.NoSQL数据库应用场景:互联网企业、传统企业的非关键业务(比如数据分析)
典型的NoSQL数据库通常包括键值数据库、列族数据库、文档数据库和图形数据库
1.键值数据库: 优点 扩展性好,灵活性好,大量写操作时性能高
缺点 无法存储结构化信息,条件查询效率较低
应用:键值数据库成为理想的缓冲层解决方案, Redis有时候会被人们称为“强化版的Memcached”支持持久化、数据恢复、更多数据类型
2.列族数据库
优点 查找速度快,可扩展性强,容易进行分布式扩展,复杂性低
缺点 功能较少,大都不支持强事务一致性
应用:HBase应用于分布式数据存储与管理
3.文档数据库
优点 性能好(高并发),灵活性高,复杂性低,数据结构灵活,提供嵌入式文档功能,将经常查询的数据存储在同一个文档中既可以根据键来构建索引,也可以根据内容构建索引缺点 缺乏统一的查询语法
应用:XML文档、HTML文档和JSON 文档就属于这一类。用于后台具有大量读写操作的网站、使用JSON数据结构的应用、使用嵌套结构等非规范化数据的应用程序,
百度云数据库(MongoDB)
4. 图形数据库
优点 灵活性高,支持复杂的图形算法,可用于构建复杂的关系图谱
缺点 复杂性高,只能支持一定的数据规模
应用:Adobe(Neo4J)、Cisco(Neo4J)、T-Mobile(Neo4J)
CAP:
C:(Consistency):一致性,所有节点在同一时间具有相同的数据
A:(Availability):可用性,指快速获取数据,可以在确定的时间内返回操作结果,保证每个请求不管成功或者失败都有响应;
P(Tolerance of Network Partition):分区容忍性,是指当出现网络分区的情况时(即系统中的一部分节点无法和其他节点进行通信),分离的系统也能够正常运行,也就是说,系统中任意信息的丢失或失败不会影响系统的继续运作。
CAP理论告诉我们,一个分布式系统不可能同时满足一致性、可用性和分区容忍性这三个需求,最多只能同时满足其中两个
拾遗:
访问MongoDB的两种方式:
使用 MongoDB shell访问MongoDB
使用Java程序访问 MongoDB
MapReduce主要有以下4个部分组成:
1)Client
用户编写的MapReduce程序通过Client提交到JobTracker端
用户可通过Client提供的一些接口查看作业运行状态
2)JobTracker
JobTracker负责资源监控和作业调度
JobTracker 监控所有TaskTracker与Job的健康状况,一旦发现失败,就将相应的任务转移到其他节点
JobTracker 会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器(TaskScheduler),而调度器会在资源出现空闲时,选择合适的任务去使用这些资源
3)TaskTracker
TaskTracker 会周期性地通过“心跳”将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker 发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)
TaskTracker 使用“slot”等量划分本节点上的资源量(CPU、内存等)。一个Task 获取到一个slot 后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot 分为Map slot 和Reduce slot 两种,分别供MapTask 和Reduce Task 使用
4)Task
Task 分为Map Task 和Reduce Task 两种,均由TaskTracker 启动
不同的Map任务之间不会进行通信
不同的Reduce任务之间也不会发生任何信息交换
用户不能显式地从一台机器向另一台机器发送消息
所有的数据交换都是通过MapReduce框架自身去实现的
MapReduce可以很好地应用于各种计算问题
关系代数运算(选择、投影、并、交、差、连接)
分组与聚合运算
矩阵-向量乘法
矩阵乘法
1.Map输入类型为
2.期望的Map输出类型为<单词,出现次数>
3.Map输入类型最终确定为
4.Map输出类型最终确定为
1.在Reduce处理数据之前,Map的结果首先通过Shuffle阶段进行整理
2.Reduce阶段的任务:对输入数字序列进行求和
3.Reduce的输入数据为
云数据库是部署和虚拟化在云计算环境中的数据库。云数据库是在云计算的大背景下发展起来的一种新兴的共享基础架构的方法,它极大地增强了数据库的存储能力,消除了人员、硬件、软件的重复配置,让软、硬件升级变得更加容易。
云数据库并没有专属于自己的数据模型,云数据库所采用的数据模型可以是关系数据库所使用的关系模型
微软的SQL Azure云数据库、
阿里云RDS都采用了关系模型
也可以是NoSQL数据库所使用的非关系模型(Amazon Dynamo云数据库采用的是“键/值”存储)
Amazon :Dynamo、SimpleDB、RDS ,DynamoDB:云中的NoSQL数据库,RDS:云中的关系数据库,SimpleDB:云中的键值数据库
Google :Google Cloud SQL 基于MySQL的云数据库,使用Cloud SQL,所有的事务都在云中,并由谷歌管理,用户不需要配置或者排查错误
Microsoft :Microsoft SQL Azure,属于关系型数据库,支持大量数据类型:包含了几乎所有典型的SQL Server 2008的数据类型
阿里 :阿里云RDS
百度 :百度云数据库
腾讯 :腾讯云数据库
UMP系统是低成本和高性能的MySQL云数据库方案
编译打包代码以及运行程序
1.使用java编译程序,生成.class文件
2.将.class文件打包为jar包
3.运行jar包(需要启动Hadoop)
4.查看结果
详细步骤:
1.Hadoop 2.x 版本中 jar 不再集中在一个 hadoop-core*.jar 中,而是分成多个 jar,如使用 Hadoop 2.6.0 运行 WordCount 实例至少需要如下三个 jar:
$HADOOP_HOME/share/hadoop/common/hadoop-common-2.6.0.jar
$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.6.0.jar
$HADOOP_HOME/share/hadoop/common/lib/commons-cli-1.2.jar
2.通过命令 hadoop classpath 可以得到运行 Hadoop 程序所需的全部 classpath信息
3.将 Hadoop 的 classhpath 信息添加到 CLASSPATH 变量中,在 ~/.bashrc 中增加几行配置命令
4.执行 source ~/.bashrc 使变量生效,接着就可以通过 javac 命令编译 WordCount.java
5.接着把 .class 文件打包成 jar,才能在 Hadoop 中运行
6.运行程序