大数据技术原理与应用
大数据基础
什么促进了大数据时代的诞生?
- 第三次信息化浪潮
- 信息科技为大数据时代提供技术支撑,具体是存储容量增大,
CPU
处理速度提高,网络带宽的提高 - 数据生产方式的变革,运营式系统阶段,用户原则内容阶段,感知式系统阶段
大数据的发展进程
20
世纪
90
年代到
21
世纪初的萌芽阶段,
21
世纪前
10
年的成熟期,
2010
年之后的大规模应用期
大数据的 4V 概念
4V
就是数据量大
Volume
,数据类型繁多
Variety
,处理速度快
Velocity
,价值密度低
Value
数据真实性
Veracity
大数据的计算模式
- 批处理计算
- 流计算
- 图计算
- 查询分析计算
云计算
云计算的概念,以虚拟化技术为核心,低成本为目标的动态可扩展的网络基础应用,是近几年来最具代表的网络计算技术和模式
云计算包含了三种服务模式
IaaS
,基础设施即服务Paas
,平台设施即服务SaaS
,软件即服务,把软件作为服务进行出租
云计算的关键技术,虚拟化,分布式存储,分布式计算,多租户等
Hadoop
Hadoop
是一个由
Apache
基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop
的框架最核心的设计就是:
HDFS
和
MapReduce
核心组件,
HDFS
,
MapReduce
和
YARN
优点
1.高可靠性。
Hadoop
按位存储和处理数据
2.高扩展性。
Hadoop
是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中
3.高效性。
Hadoop
能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快
4.高容错性。
Hadoop
能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配
5.低成本。
hadoop
是开源的,项目的软件成本因此会大大降低
6.运行在Linux系统上
7.支持多种编程语言
Hadoop的生态系统
HDFS
Hadoop Distributed File System
缩写
HDFS
,它存储
Hadoop
集群中所有存储节点上的文件。基于
Google
的
GFS
文件系统开发的,作为
Hadoop
的底层数据存储
HBase
HBase
是一个高可靠的,高性能,可伸缩,实时读写,分布式的列式数据库
MapReduce
Hadoop MapReduce
是针对谷歌的
MapReduce
实现,是一种编程模型,用于大规模数据集的复杂的并行运算。使用到了两个函数
Map()
函数
Reduce()
函数,
Map
映射函数,用来把一组键值对映射成一组新的键值对,指定并发的
Reduce
归约函数,用来保证所有映射的键值对中的每一个共享相同的键组。
Hive
hive
是基于
Hadoop
的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在
Hadoop
中的大规模数据的机制。
hive
数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供
SQL
查询功能,能将
SQL
语句转变成
MapReduce
任务来执行。学习成本低,适合对数据仓库进行统计分析。
zookeeper
ZooKeeper
是一个分布式的,开放源码的分布式应用程序协调服务,是
Google
的
Chubby
一个开源的实现,是
Hadoop
和
HBase
的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper
的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper
包含一个简单的原语集,提供
Java
和
C
的接口。
Hadoop 安装和使用
- 创建
Hadoop
用户 - 安装
java
的环境 - 安装并且设置
SSH
登录权限 - 单机安装配置
- 伪分布式安装配置
大数据存储和管理
分布式文件系统DFS
目前应用广泛的分布式文件系统主要有
GFS
和
HDFS
,分布式文件系统在物理结构上是由计算机集群中的多个节点构成的,这些节点主要分成两类,一类是主节点
Master Node
也叫作
NameNode
名称节点,一类是由
Slave Node
也叫作
DataNode
数据节点。
NameNode
主要负责文件和目录的创建、删除和重命名,同时管理者数据节点和文件块的映射关系,因此
Client
只需要访问
NameNode
节点才可以找到请求的文件块所在的位置,进而从位置读取所需的文件块。
DataNode
主要负责的是数据的存储和读取,在存储时候,由
NameNode
分配存储位置,
Client
将数据写入到相应的数据节点。在读取数据时候,
Client
从
NameNode
获取到
DataNode
和文件块的映射关系,就可以根据相对应的位置访问到对应的文件块。
HDFS 是Hadoop的分布式文件系统,实现的目标是,兼容廉价的硬件设备,流数据的读写,大数据集,简单的文件模型,强大的跨平台兼容性。
缺点,不适合低延迟数据访问,无法高效的存储大量小文件,不支持多用户的写入和任意文件的修改。
HDFS 数据块
文件被切分成为固定大小的数据块,默认数据块大小是128MB,Hadoop2.7.3之间是64MB,可配置
数据块大是为了数据传输超过寻道时间,高吞吐量
一个文件按大小切分成为若干个Block,存储到不同的节点上,默认情况下每个块具有三个副本。
Block副本放置的策略
副本1,同Client的节点上
副本2,不同机架的节点上
副本3,与第二个副本同一机架的另一个节点上
计算集群中元数据需要的内存
10600000 * 250Bytes + 310000 * 290Bytes +13300000 * 368Bytes = 7.11GB
- 可扩展性,支持热拔插,可动态的添加和删除DataNode,都会通知NameNode及时更新metedata
- 容错性,多次的数据备份
- 数据局部性,不适合小文件,不能实时的处理实时数据,处理速度慢,缓存效率低下
- 可靠性,冗余副本机制,心跳机制,安全模式,回收站,元数据保护,快照机制
- 高可用性,消除单点故障,防止单个节点宕机之后,造成服务的不可用,保证集群的可用
HBase shell基本命令
https://blog.csdn.net/vbirdbest/article/details/88236575
- 进入Base Shell程序
hbase shell
- help ‘命名名称’ 来查看命令行的具体使用,包括命令的作用和用法。
help 'base'
- 显示集群状态
// 默认 'summary'
status
- 查看数据库版本
version
- 显示当前用户与组
whoami
- 查看操作表的命令
table_help
- 退出HBase Shell
exit
- 创建表
create '表名',{NAME=>'列族名1'},{NAME=>'列族名2'},{NAME=>'列族名3'}// 此种方式是上面的简写方式,使用上面方式可以为列族指定更多的属性,如VERSIONS、TTL、BLOCKCACHE、CONFIGURATION等属性// 推荐
create '表名','列族名1','列族名2','列族名3'
create 'tbl_user', 'info', 'detail'
- 列出所有的表
list
- 修改表的结构
alter '表名','列族名'
alter 'tbl_user', 'address'
- 删除一个列族
alter '表名',{NAME=>'列族名',METHOD=>'delete'}
alter 'tbl_user',{NAME=> 'address',METHOD=>'delete'}
- 获取表的描述
describe 'table_name'
- 表是否存在
exists '表名'
exists 'tbl_user'
- 启用表和禁用表
enabled 'table_name'
disabled 'table_name'
查看表是否被禁用
is_enabled 'table_name'
is_disabled 'table_name'
- 删除表
先禁用,再删除
disable 'tbl_user'
drop 'tbl_user'
- 插入和修改数据
# 第一行数据
put 'tbl_user', 'mengday', 'info:id', '1'
put 'tbl_user', 'mengday', 'info:name', '张三'
put 'tbl_user', 'mengday', 'info:age', '28'
put 'tbl_user', 'mengday', 'detail:birthday', '1990-06-26'
put 'tbl_user', 'mengday', 'detail:email', '[email protected]'
put 'tbl_user', 'mengday', 'detail:create_time', '2019-03-0414:26:10'
put 'tbl_user', 'mengday', 'address', '上海市'
# 第二行数据
put 'tbl_user', 'vbirdbest', 'info:id', '2'
put 'tbl_user', 'vbirdbest', 'info:name', '李四'
put 'tbl_user', 'vbirdbest', 'info:age', '27'
put 'tbl_user', 'vbirdbest', 'detail:birthday', '1990-06-27'
put 'tbl_user', 'vbirdbest', 'detail:email', '[email protected]'
put 'tbl_user', 'vbirdbest', 'detail:create_time', '2019-03-0514:26:10'
put 'tbl_user', 'vbirdbest', 'address', '北京市'
# 第一行数据
put 'tbl_user', 'xiaoming', 'info:id', '3'
put 'tbl_user', 'xiaoming', 'info:name', '王五'
put 'tbl_user', 'xiaoming', 'info:age', '26'
put 'tbl_user', 'xiaoming', 'detail:birthday', '1990-06-28'
put 'tbl_user', 'xiaoming', 'detail:email', '[email protected]'
put 'tbl_user', 'xiaoming', 'detail:create_time', '2019-03-0614:26:10'
put 'tbl_user', 'xiaoming', 'address', '杭州市'
- 全表扫描
scan 'table_name'
- 扫描表的列簇
scan 'table_name',{COLUMN=>'info'}
- 扫描列簇的某个列
scan 'tbl_user',{COLUMN=>'info:age'}
- 获取簇数据和获取簇中的列数据
get '表名','行键'
get '表名','行键','列族名'
- 删除列族的某个列
delete '表名','行键','列族名:列名'
- 删除某行数据
deleteall '表名''行键'
- 清空表的数据
truncate 'table_name'
- 查询表有多少行
count 'table_name'
- 时间范围
# 语法
scan '表名',{TIMERANGE=>[timestamp1, timestamp2]}
# 示例
scan 'tbl_user',{TIMERANGE=>[1551938004321,1551938036450]}
NoSQL数据库
NoSQL数据库的简介和兴起的原因
NoSQL
,泛指非关系型的数据库。
NoSQL
数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。
特点,灵活可扩展,灵活的数据模型,与云计算紧密相连
兴起的原因,海量数据的需求,数据高并发的需求,无法满足可扩展和高可用性的需求
非关系型数据库和关系型数据库的区别
NoSQL 的四大数据类型
- 键值对数据类型
哈希表,这个表中有一个特定的键和一个指针指向特定的数据。
比如,Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB
。
- 列存储数据库
通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:
Cassandra, HBase, Riak
.
- 文档型数据库
灵感是来自于
Lotus Notes
办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如
JSON
。在处理网页等复杂数据时,文档型数据库比传统键值数据库的查询效率更高。如:
CouchDB, MongoDb.
国内也有文档型数据库
SequoiaDB
,已经开源。
- 图形型数据库
是使用灵活的图形模型,并且能够扩展到多个服务器上
NoSQL 三大基石
三大基石是,
CAP
,
BASE
理论,最终一致性
- CAP
C,Consistency
一致性,分布式系统的所有数据备份中,在同一时刻是否相同的值
A,Availability
可用性,保证每一个请求不管成功还是失败都具有响应
P,Partition toleration
分区容错性,系统中任意信息的对视或者失败都不会影响系统的继续运行
CAP
原则就是这三个元素最多只能实现两个,不可能三者兼顾
- BASE理论
BASE
是
Basically Available
(基本可用)、
Soft state
(软状态)和
Eventually consistent
(最终一致性)三个短语的简写
基本可用(
Basically Available
)
指一个分布式系统的一部分发生问题变得不可用时,其他部分仍然可以正常使用,也就是允许分区失败的情况出现。
例如:一个数据库系统部署了很多节点,有可能一两个节点出现了失败,但是整个系统依然是可用的
软状态(
Soft State
):
与硬状态是对应的,指状态可以有一段时间不同步,具有不同步的时间窗口,具有一定滞后性。
补充:硬状态(
Hard State
):数据库状态必须一直保持数据库状态一致性,就是指任意时刻数据必须时正确的。
最终一致性(
Eventual Consistency
)
一致性的类型包括“强一致性”和“弱一致性”,两者的主要区别在于高并发的数据访问操作下,后续操作是否能够获取最新的数据。最终一致性是为弱一致性的一种特例。
强一致性:一般要求,执行完一个更新之后,后续的其他操作都能够读到你更新的数据
弱一致性:反之,执行一个更新操作之后,后续的读操作不能保证马上读到你刚写入的数据
- 最终一致性
最终一致性为弱一致性的一种特例。根据后台各个进程访问到数据的时间和方式不同,可以区分为
因果一致性
进程A更新了数据,通知
B
进程,
B
进程就可以访问到更新的值,没有通知,最终可以访问到,不是马上就访问到
读自己之所写
进程
A
更新的值后,
A
进程访问数据是更新过后的值
单调读写一致性
进程
A
看到过数据对象的某个值,那么后续访问都不会返回在那个之前的旧值
会话一致性
读自己所写的一致性
单调写一致性
保证来自同一进程的写操作按照顺序执行
World Count的MapReduce处理
统计单词个数
publicstaticclassTokenizerMapperextendsMapper<Object,Text,Text,IntWritable>{privatefinalstaticIntWritable one =newIntWritable(1);privateText word =newText();publicvoidmap(Object key,Text value,Context context)throwsIOException,InterruptedException{StringTokenizer itr =newStringTokenizer(value.toString());while(itr.hasMoreTokens()){
word.set(itr.nextToken());
context.write(word, one);}}}publicstaticclassIntSumReducerextendsReducer<Text,IntWritable,Text,IntWritable>{privateIntWritable result =newIntWritable();publicvoidreduce(Text key,Iterable<IntWritable> values,Context context)throwsIOException,InterruptedException{int sum =0;for(IntWritable val : values){
sum += val.get();}
result.set(sum);
context.write(key, result);}}
统计单词的长度数量,
map
函数和
reduce
函数
publicstaticclassTokenizerMapperextendsMapper<Object,Text,Text,IntWritable>{privatefinalstaticIntWritable one =newIntWritable(1);privateText category =newText();publicvoidmap(Object key,Text value,Context context)throwsIOException,InterruptedException{StringTokenizer itr =newStringTokenizer(value.toString()," ,:?;\\.\t\n\r\f");//while(itr.hasMoreTokens()){String w = itr.nextToken();int length = w.length();String c;//w="come" -->"small"if(length ==1){//w.startsWith("C") w.length() == 4
c ="tiny";}elseif(length >=2&& length <=4){//w.startsWith("C") w.length() == 4
c ="small";}elseif(length >=5&& length <=9){//w.startsWith("C") w.length() == 4
c ="medium";}else{
c ="big";}
category.set(c);
context.write(category, one);}}}publicstaticclassIntSumReducerextendsReducer<Text,IntWritable,Text,IntWritable>{privateIntWritable result =newIntWritable();publicvoidreduce(Text key,Iterable<IntWritable> values,Context context)throwsIOException,InterruptedException{int sum =0;for(IntWritable val : values){
sum += val.get();}
result.set(sum);
context.write(key, result);}}
Flink的容错机制
Exactly once
,是指每条
event
会且只会对
state
产生一次影响,这里的“一次”并非端到端的严格一次,而是指在
Flink
内部只处理一次,不包括
source
和
sink
的处理。
At least once
,是指每条
event
会对
state
产生最少一次影响,也就是存在重复处理的可能。
At most once
,是指每条
event
会对
state
产生最多一次影响,就是状态可能会在出错时丢失。
Flink是如何实现End-To-End Exactly-once的?
Flink
通过状态和两次提交协议来保证了端到端的
exactly-once
语义
Source
支持数据的
replay
,如
Kafka
的
offset
。
Transformation
:借助于
checkpoint
Sink: Checkpoint
+两阶段事务提交
Spark 计算 Pi
在
idea
中编写
spark
计算
Pi
值
object ScalaPi{
def main(args:Array[String]){//创建一个Config
val conf =newSparkConf().setAppName("ScalaPI").setMaster("local")//核心创建SparkContext对象
val sc =newSparkContext(conf)//计算PI
val count = sc.parallelize(1to10000).filter { _ =>
val x = math.random
val y = math.random
x * x + y * y <1}.count()println(s"Pi is roughly ${4.0 * count / 10000}")//停止SparkContext对象
sc.stop()}}
版权归原作者 coffee_mao 所有, 如有侵权,请联系我们删除。