IT领域每隔十五年就会迎来一次重大变革:
信息科技为大数据时代提供技术支撑:
大数据是由结构化和非结构化数据组成的
云计算与物联网:
Hadoop是基于Java语言开发的,具有很好的跨平台特性,并且可以部署在廉价的计算机集群中。
它的核心是为海量数据提供存储的分布式文件系统HDFS(Hadoop Distributed File System)和对数据进行计算的MapReduce。
MapReduce模型包括两个函数Map和Reduce,Map负责把任务分解为多个任务,Reduce负责把分解后的多个任务处理结果汇总起来。把对大数据集的操作分发给主节点管理下的从节点共同完成,然后通过整合各从节点的中间结果,从而得到最终结果。
BigTable
为处理 PB 级别数据的非关系数据库,是一个稀疏的、分布式的、持久化存储的多维度排序 Map。
采用键值对(key-value)方式存储,键(key)有三维:行键、列键、时间戳。
(row:string, column:string, time:int64)→string
Hadoop
而Hadoop是一个能够对大量数据进行分布式处理的软件框架,具有高可靠性、高效性、高可扩展性、高容错性、低成本、支持多种编程语言的特性。
Hadoop版本分为两代:Hadoop1.0 (MapReduce、HDFS)、Hadoop2.0(MapReduce、HDFS、YARN)。
Hadoop安装配置
sudo useradd -m hadoop -s /bin/bash //创建 hadoop 用户,并以 /bin/bash 为shell
sudo passwd hadoop //设置 hadoop 用户的密码
sudo useradd hadoop sudo //给 hadopp 用户添加管理员权限
Secure Shell 是建立在应用层和传输层基础上的安全协议。
Hadoop 名称节点需要通过 SSH 启动集群中所有 Hadoop 的守护线程,而它没有提供SSH输入密码登录的形式,所以每台机器的 Hadoop 用户需要配置免密登录。
解压 hadoop-2.x.y.tar.gz,在 sbin 下执行 start-all.sh 可启动(启动之前需要初始化文件系统hadoop namenode -format)。
默认为单机模式,可以修改 /usr/local/hadoop/etc/hadoop/ 下的 core-site.xml、hdfs-site.xml、mapred-site.xml 等配置文件,使用其他模式。
hadoop fs、hadoop dfs、hdfs dfs 的区别:
hadoop fs 适用于任何不同的文件系统,比如本地文件系统和 HDFS 文件系统,hadoop dfs 只能适用于 HDFS 文件系统,而 hdfs dfs 与 hadoop dfs 相同。
一个基本的Hadoop集群中的节点主要有:
分布式文件系统把文件分布存储到多个计算机节点上,成千上万的计算机节点构成计算机集群。
分布式文件系统在物理结构上是由计算机集群中的多个节点构成的,这些节点分为两类,一类叫“主节点”(Master Node)或者也被称为“名称结点”(NameNode),另一类叫“从节点”(Slave Node)或者也被称为“数据节点”(DataNode)。
优点:
局限性:
HDFS采用抽象的块概念,默认一个块64MB,一个文件被分成多个块,以块作为存储单位。块的大小远远大于普通文件系统,可以最小化寻址开销。
HDFS 主要组件及其功能:
对应 HDFS 的命名空间,即目录、文件和块。
在 NameNode 启动的时候,它会将 FsImage 文件中的内容加载到内存中,之后再执行 EditLog 文件中的各项操作,使得内存中的元数据和实际的同步。
**SecondaryNameNode:**保存 NameNode 中对HDFS 元数据信息的备份(GET/POST),并减少 NameNode 重启的时间。
**DataNode:**负责数据的存储和读取,会根据客户端或者是名称节点的调度来进行数据的存储和检索,并且向名称节点定期发送自己所存储的块的列表。
HDFS1.0体系结构:
HDFS 存储原理(策略):
**存:**第一个副本放在上传文件的数据节点或随机选取一台状态良好的节点,第二个副本会放置在与第一个副本不同的机架的节点上,第三个副本放置在与第一个副本相同机架的其他节点上,更多副本则随机节点。
**取:**从名称节点获得数据块不同副本的存放位置列表(所属的机架ID),就优先选择机架ID相同的副本读取数据,如果没有发现,就随机选择一个副本读取数据。
数据错误与恢复
名称节点出错,对应 SecondaryNameNode 的备份机制;
数据节点出错,每个数据节点会定期向名称节点发送“心跳”信息,向名称节点报告自己的状态。名称节点就无法收到来自数据节点的心跳信息时,标记该数据节点为”宕机“并不再发送 I/O 请求。同时名称节点会定期检查数据块的副本数量,小于冗余因子会生成新的副本;
数据出错,采用md5和sha1对数据块进行校验,防止网络传输和磁盘错误造成的数据错误。校验出错则会请求另外一个数据节点读取该文件块,并且向名称节点报告这个文件块有错误,名称节点会定期检查并且重新复制这个块。
HDFS 常用 shell 命令:
Java API 操作 HDFS:
读:
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://localhost:9000");
conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fs = FileSystem.get(conf);
Path file = new Path("test");
FSDataInputStream getIt = fs.open(file);
BufferedReader d = new BufferedReader(new InputStreamReader(getIt));
String content = d.readLine(); //读取文件一行
System.out.println(content);
d.close(); //关闭文件
fs.close(); //关闭hdfs
写:
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://localhost:9000");
conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fs = FileSystem.get(conf);
byte[] buff = "Hello world".getBytes(); // 要写入的内容
String filename = "test"; //要写入的文件名
FSDataOutputStream os = fs.create(new Path(filename));
os.write(buff,0,buff.length);
System.out.println("Create:"+ filename);
os.close();
fs.close();
BigTable:一个分布式存储系统
HBase 则是 BigTable 的开源实现,用来存储非结构化和半结构化的松散数据,具有高可靠、高性能、面向列、可伸缩特性的分布式数据库。
两者对比:
HBase与传统的关系数据库的区别:
HBase的访问接口:
Java API、HBase Shell、Thrift Gateway、REST Gateway、Pig、Hive
HBase当中的表:
注:根据行键、列族、列限定符和时间戳来确定一个单元格,视为一个“四维坐标”。
HBase的实现包括三个主要组件:
**三层结构:**可以保存最多 2^34个 Region
于是从前面的 HDFS 体系扩展为 HBase 的系统架构如下:
数据的读写:
写入数据:
请求相应 Region 服务器->操作写入Hlog -> 数据写入MemStore 缓存->commit() 调用写入磁盘
读取数据:
请求相应的 Region 服务器->访问 MemStore 缓存->不存在查找磁盘上的 StoreFile
缓存刷新与StoreFile的合并:
系统会周期性地把MemStore缓存里的内容刷写到磁盘的StoreFile文件中,清空缓存,并在Hlog里面写入一个标记。
每次刷写都生成一个新的StoreFile文件,如果 StoreFile 文件过多会调用 Store.compact() 进行合并;而单个StoreFile过大时,又触发分裂操作。
Hlog 原理
HBase系统为每个Region服务器配置了一个HLog文件。
用户更新数据必须首先写入日志后,才能写入MemStore缓存,并且,直到MemStore缓存内容对应的日志已经写入磁盘,该缓存内容才能被刷写到磁盘。
Zookeeper 发现故障 Region 服务器,就会通知 Master 主服务器。
Master 主服务器则会处理遗留的 Hlog 文件(包含多个 Region 对象),将失效的 Region 以及日志记录重新分配到可用的Region服务器。
安装:
三种运行模式,单机模式、伪分布式模式、分布式模式
需要环境:JDK、Hadoop(单机模式不需要)、SSH、Zookeeper
HBase Shell:
创建表、列出所有表
create ‘tempTable’,‘f1’,‘f2’,‘f3’ //三个列族
list
添加数据、浏览表信息
put ‘tempTable’,‘r1’,‘f1:c1’,‘hello,hbase’
scan ‘tempTable’
获取单元格数据
get ‘tempTable’,‘r1’,{COLUMN=>‘f1:c1’}
使表有效或无效、删除表
enable/disable
drop
关系数据库已经无法满足Web2.0的需求。主要表现在以下几个方面:
NoSQL和关系数据库的比较:
典型的NoSQL数据库通常包括键值数据库(Redis)、列族数据库(HBase)、文档数据库(MongoDB、ElasticSearch)和图形数据库。
与关系型数据库的 ACID 四个特性类似,NoSQL 数据库也有三个
MapReduce 是谷歌的分布式并行编程模型,而 Hadoop MapReduce是它的开源实现。
由四个部分组成:
MapReduce工作流程:
HDFS 以固定大小的block(数据块)为基本单位存储数据,而对于MapReduce 而言,其处理单位是split(分片)。
Shuffle 过程:
下图从map( )的输出到reduce( )的输入,中间的过程被称为shuffle过程
所以 Shuffle 过程可以分为Map端跟Reduce端的Shuffle过程:
Map端:
在Map任务全部结束之前进行归并得到一个大的文件,放在本地磁盘;
文件归并时,如果溢写文件数量大于预定值(默认是3)则可以再次启动Combiner,少于3不需要;
JobTracker会一直监测Map任务的执行,并通知Reduce任务来领取数据。
Reduce端:
Reduce任务通过RPC向JobTracker询问Map任务是否已经完成,若完成,则领取数据;
Reduce领取数据先放入缓存,来自不同Map机器,先归并,再合并,写入磁盘;
案例:
Hive 是一个基于 Hadoop 的数据仓库工具,可以用于对存储在 HDFS 中的数据集进行数据整理、特殊查询和分析处理。它提供了类似于关系数据库 SQL 语言的查询语言——HiveQL,Hive 会将 HQL 语句快速转换成 MapReduce 任务进行运行。
Hive 可以看作是用户编程接口,其本身并不存储和处理数据,而是依赖 HDFS 来存储数据,依赖 MapReduce 来处理数据。
Hive 系统架构:
三个模块:
Hive 中 HQL 语句的 MapReduce 作业转化过程:
用户向 Hive 输入命令首先进入驱动模块,由驱动模块中的编译器进行解析编译,并由优化器对该操作进行优化计算,然后交给执行器去执行。执行器通常的任务是启动一个或多个 MapReduce 任务,有时也不需要启动 MapReduce 任务,比如,执行包含*的操作时(如 select * from 表),就是全表扫描,选择所有的属性和所有的元组,不存在投影和选择操作,因此,不需要执行 Map 和 Reduce 操。
Hive 的数据类型
Hive 支持关系数据库中的大多数基本数据类型,同时 Hive 还支持关系数据库中不常出现的的 3 种集合数据类型:
Hive 的基本操作
创建数据库
create database hive;
创建表
创建表 user,并指明存储路径
create table if not exists usr(id bigint,name string,age int);
location "/usr/local/hive/warehouse/hive/usr‟;
创建外部表 user,可以读取以“,”分隔的数据
create external table if not exists hive.usr(id bigint,name string,age int)
row format delimited fields terminated by ‘,’;
创建分区表,还存在分区字段
create table hive.usr(id bigint,name string,age int) partition by(sex boolean);
create table if not exists usr1 like usr;//复制usr表
创建视图
create view little_usr as select id,age from usr;
删除数据库、表、视图
drop database hive;
drop database if exists hive cascade; //数据库+表
drop table if exists usr;
drop view if exists little_usr;
修改数据库、表、视图
alter database hive set dbproperties(“edited-by‟=lily”);
alter table usr rename to user; //重命名表
alter table usr add if not exists partition(age=10); //增加分区
alter table usr drop if exists partition(age=10); //删除分区
alter table usr change name username string after age;//修改列名并置于age字段后
alter table usr add columns(sex boolean); //增加一个新列 sex
alter table usr replace columns(newid bigint,newname string,newage int); //重新为表指定字段
查看数据库、表、视图
show databases/table;
描述数据库、表、视图
describe database hive;
describe hive.usr;
向表中装载数据
load data local inpath "/usr/local/data‟ overwrite into table usr;
load data inpath "hdfs://master_server/usr/local/data‟ overwrite into table usr;
查询表中数据:与 SQL 基本相同
插入数据或导出数据
insert overwrite table usr1
select * from usr where age=10; //向表 usr1 中插入来自 usr 表的数据