2018-12-30
Hadoop --------------------
Hadoop官页 Hadoop文档 Hadoop文档 - HDFS User Guide Hadoop下载归档 Hive 官页 大佬的开源书籍
Hadoop 是什么?
Hadoop 是一个开源的框架, 可编写和运行分布式应用处理大规模数据, 是专为离线和大规模数据分析而设计的, 并不适合那种对几个记录随机读写的在线事务处理模式, 适合那些有着超大数据集(large data set)的应用程序;
Hadoop=HDFS(文件系统, 数据存储技术相关)+ Mapreduce(数据处理), Hadoop的数据来源可以是任何形式, 在处理半结构化和非结构化数据上与关系型数据库相比有更好的性能, 具有更灵活的处理能力, 不管任何数据形式最终会转化为key/value, key/value是基本数据单元; 用函数式变成Mapreduce代替SQL, SQL是查询语句, 而Mapreduce则是使用脚本和代码, 而对于适用于关系型数据库, 习惯SQL的Hadoop有开源工具hive代替;
现在普遍认为整个Apache Hadoop”平台”包括Hadoop内核, MapReduce, Hadoop分布式文件系统(HDFS)以及一些相关项目, 有Apache Hive和Apache HBase等等;
简而言之 就是一个可以分布式 保存 + 处理超大数据集 的框架
Hadoop主要由两大部分组成,一个是分布式文件系统即HDFS,另一个是分布式计算框架MapReduce。
1. Hadoop HDFS的构建模块
NameNode(名字节点) DataNode(数据节点) Secondary NameNode(次名字节点) JobTracker(作业跟踪节点) TaskTracker(任务跟踪节点)
文件的’元数据’ 和 ‘数据’
存储到文件系统中的每个文件都有相关联的元数据和数据; 元数据包括了文件名, i节点(inode)数, 数据块位置等, 而数据则是文件的实际内容; 在传统的文件系统里, 因为文件系统不会跨越多台机器, 元数据和数据存储在同一台机器上;
NameNode和DataNode是HDFS的两个主要组件。其中,元数据存储在NameNode上,而数据存储在DataNode的集群上。
NameNode(名字节点)
HDFS命名空间由NameNode存储; NameNode 使用一个称为EditLog的事务日志来永久记录文件系统元数据发生的所有更改;
例如, 在HDFS中创建一个新文件将导致NameNode将一条记录插入到EditLog中, 同样, 更改文件的复制操作会导致将新记录插入到EditLog中;
NameNode使用其本地主机OS文件系统中的文件来存储EditLog; 整个文件系统名称空间(包括块到文件的映射和文件系统属性)存储在称为FsImage的文件中; FsImage也作为文件存储在NameNode的本地文件系统中;
DataNode和客户端之间的基本交互; 客户端与NameNode联系以获取文件元数据或文件修改, 并直接与DataNode执行实际的文件I/O;
in short 操作存储文件的元数据 和操作IO 的节点
DataNode
为了构建一个分布式文件系统, 让客户端在这种系统中使用简单, 并且不需要知道其他客户端的活动, 那么元数据需要在客户端以外维护; HDFS的设计理念是拿出一台或多台机器来保存元数据, 并让剩下的机器来保存文件的内容;
存储在HDFS上的每份数据片有多份副本(replica)保存在不同的服务器上; 在本质上, NameNode是HDFS的Master(主服务器), DataNode是Slave(从服务器);
in short 操作存储文件的’数据’ 节点
Secondary NameNode()
SNN是一个监测HDFS集群状态的辅助守护进程,它通常独占一台服务器,该服务器不会运行其他DataNode或者TaskTracker守护进程.SNN与NameNode的不同在于它不接收或者记录HDFS的任何实时变化.相反它与NameNode通信,感觉集群所配置的时间间隔获取HDFS元数据的快照.
NameNode是Hadoop集群的单一故障点,而SNN的快照可以有助于减少停机的时间并降低数据丢失的风险.然而NameNode的失效处理需要人工的干预,即手动地重新配置集群,将SNN用作主要的NameNode.
in short 作为备份 NameNode的一个节点
JobTracker
JobTracker守护进程是应用程序和Hadoop之间的纽带.一旦提交代码到集群上,JobTracker就会确定执行计划,包括决定处理哪些文件,为不同的任务分配节点以及监控所有任务的运行.如果任务失败,JobTracker将自动重启任务,但所分配的节点可能会不同,同时受到预定义的重试次数限制. 每一个Hadoop集群只有一个JobTracker守护进程,它通常运行在服务器集群的主节点上.
TaskTracker
与存储的守护进程一样,计算的守护进程也遵循主从架构:JobTracker作为主节点,监测MapReduce作业的整个执行过程,同时,TaskTracker管理各个任务在每个从节点上的执行情况.
TaskTracker的一个职责就是负责持续不断地与JobTracker通讯.如果JobTracker在指定的时间内没有收到来自TaskTracker的心跳,它会假定TaskTracker已经崩溃了,进而重新提交相应的任务到集群的其他节点中
文件读写过程
HDFS的缺陷
-
低延迟数据访问 比如毫秒级 比如低延迟与高吞吐
-
小文件存取 占用NameNode大量内存 寻道时间超过读取时间
-
并发写入/文件随机修改 一个文件只能有一个写者 仅支持append
2. MapReduce
Hadoop框架透明地为应用提供可靠性和数据移动; 它实现了名为MapReduce的编程范式: 应用程序被分割成许多小部分, 而每个部分都能在集群中的任意节点上运行或重新运行; 此外, Hadoop还提供了分布式文件系统, 用以存储所有计算节点的数据, 这为整个集群带来了非常高的带宽; MapReduce和分布式文件系统的设计, 使得整个框架能够自动处理节点故障; 它使应用程序与成千上万的独立计算的计算机和PB级的数据连接起来;
什么是Map什么是Reduce?
考虑如果你要统计一个巨大的文本文件存储在类似HDFS上, 你想要知道这个文本里各个词的出现频率; 你启动了一个MapReduce程序; Map阶段, 几百台机器同时读取这个文件的各个部分, 分别把各自读到的部分分别统计出词频, 产生类似(hello, 12100次), (world, 15214次)等等这样的Pair(我这里把Map和Combine放在一起说以便简化); 这几百台机器各自都产生了如上的集合, 然后又有几百台机器启动Reduce处理;
Reducer机器A将从Mapper机器收到所有以A开头的统计结果, 机器B将收到B开头的词汇统计结果(当然实际上不会真的以字母开头做依据, 而是用函数产生Hash值以避免数据串化; 因为类似X开头的词肯定比其他要少得多, 而你不希望数据处理各个机器的工作量相差悬殊); 然后这些Reducer将再次汇总, (hello, 12100)+(hello, 12311)+(hello, 345881)= (hello, 370292); 每个Reducer都如上处理, 你就得到了整个文件的词频结果;
指定一个Map(映射)函数, 用来把一组键值对映射成一组新的键值对, 指定并发的Reduce(归纳)函数, 用来保证所有映射的键值对中的每一个共享相同的键组; 数据提取的一种方式
映射和归纳
简单来说, 一个映射函数就是对一些独立元素组成的概念上的列表(例如, 一个测试成绩的列表)的每一个元素进行指定的操作(比如, 有人发现所有学生的成绩都被高估了一分, 他可以定义一个”减一”的映射函数, 用来修正这个错误; ); 事实上, 每个元素都是被独立操作的, 而原始列表没有被更改, 因为这里创建了一个新的列表来保存新的答案; 这就是说, Map操作是可以高度并行的, 这对高性能要求的应用以及并行计算领域的需求非常有用;
而归纳操作指的是对一个列表的元素进行适当的合并(继续看前面的例子, 如果有人想知道班级的平均分该怎么做?他可以定义一个归纳函数, 通过让列表中的奇数(odd)或偶数(even)元素跟自己的相邻的元素相加的方式把列表减半, 如此递归运算直到列表只剩下一个元素, 然后用这个元素除以人数, 就得到了平均分); 虽然他不如映射函数那么并行, 但是因为归纳总是有一个简单的答案, 大规模的运算相对独立, 所以归纳函数在高度并行环境下也很有用;
类似 python 的 map()和reduce()函数。
简而言之:
MapReduce: 是一种适用于大规模数据运算的软件架构
Hadoop: 是一款支持数据密集型分布式应用程序, 实现或使用 MapReduce 作为一种实现方式
Hive: Hive是基于Hadoop的一个数据仓库工具, 提供类似SQL 访问/提取数据的工具(注意,并非完整的SQL, 插数据基本还是以文件为主), Hiveserver 提供各式各样的编程接口的服务
星辉的Inceptor 其实就是类似 Hive
3.Hadoop YARN的构建模块
Yarn是Hadoop集群的资源管理系统。Hadoop2.0 对MapReduce框架做了彻底的设计重构,我们称Hadoop2.0中的 MapReduce 为MRv2或者Yarn。
在Yarn中我们把job的概念换成了application,因为在新的Hadoop2.x中,运行的应用不只是MapReduce了 还能很方便的管理诸如Hive, Hbase, Pig, Spark/Shark等应用。
SQuirrel SQL Client 支持Hive的可视化工具
SQuirrel SQL Client是一款支持Hive的可视化工具
Hive --------------------
Hive 是基于Hadoop 构建的一套数据仓库分析系统, 它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,
可以将结构化的数据文件映射为一张数据库表, 并提供完整的SQL查询功能, 可以将SQL语句转换为MapReduce任务进行运行, 通过自己的SQL 去查询分析需要的内容, 这套SQL 简称Hive SQL, 使不熟悉mapreduce 的用户很方便的利用SQL 语言查询, 汇总, 分析数据;
而mapreduce开发人员可以把己写的mapper 和reducer 作为插件来支持Hive 做更复杂的数据分析; 它与关系型数据库的SQL 略有不同, 但支持了绝大多数的语句如DDL, DML 以及常见的聚合函数, 连接查询, 条件查询;
HIVE不适合用于联机(online)事务处理, 也不提供实时查询功能; 它最适合应用在基于大量不可变数据的批处理作业; HIVE的特点: 可伸缩(在Hadoop的集群上动态的添加设备), 可扩展, 容错, 输入格式的松散耦合;
Hadoop 与 Hive
有了MapReduce, Tez和Spark之后, 程序员发现, MapReduce的程序写起来真麻烦; 他们希望简化这个过程; 这就好比你有了汇编语言, 虽然你几乎什么都能干了, 但是你还是觉得繁琐; 你希望有个更高层更抽象的语言层来描述算法和数据处理流程; 于是就有了 Pig 和Hive;
另外一个重要组件是, 调度系统; 现在最流行的是 Yarn; 你可以把他看作中央管理, 好比你妈在厨房监工, 哎, 你妹妹切菜切完了, 你可以把刀拿去杀鸡了; 只要大家都服从你妈分配, 那大家都能愉快滴烧菜; 你可以认为, 大数据生态圈就是一个厨房工具生态圈; 为了做不同的菜, 中国菜, 日本菜, 法国菜, 你需要各种不同的工具; 而且客人的需求正在复杂化, 你的厨具不断被发明, 也没有一个万用的厨具可以处理所有情况, 因此它会变的越来越复杂;
Hive的元数据表结构详解
https://blog.csdn.net/haozhugogo/article/details/78478941
DDL Operations
Creating Hive Tables
hive> CREATE TABLE pokes (foo INT, bar STRING);
带分区partition:
hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);
PARTITIONE 分区字段
在Hive Select查询中一般会扫描整个表内容, 会消耗很多时间做没必要的工作; 有时候只需要扫描表中关心的一部分数据, 因此建表时引入了partition概念;
- 一个表可以拥有一个或者多个分区, 每个分区以文件夹的形式单独存在表文件夹的目录下;
- 分区是以字段的形式在表结构中存在, 通过describe table命令可以查看到字段存在, 但是该字段不存放实际的数据内容, 仅仅是分区的表示
- 分区建表分为2种, 一种是单分区, 也就是说在表文件夹目录下只有一级文件夹目录; 另外一种是多分区, 表文件夹下出现多文件夹嵌套模式
a, 单分区建表语句: create table day_table (id int, content string) partitioned by (dt string);单分区表, 按天分区, 在表结构中存在id, content, dt三列;
b, 双分区建表语句: create table day_hour_table (id int, content string) partitioned by (dt string, hour string);双分区表, 按天和小时分区, 在表结构中新增加了dt和hour两列;
类似于MySQL分区, 但是它这里可以单独对某个条件分区数据操作, 例如查询, 删除/覆盖数据
加载数据到Hive
从文件中导入数据
Loading files into tables
Syntax
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] [INPUTFORMAT 'inputformat' SERDE 'serde'] (3.0 or later)Load operations prior to Hive 3.0(3.0之前) are pure copy/move operations that move datafiles into locations corresponding to Hive tables.
从查询中插入数据到Hive表中
Inserting data into Hive Tables from queries
Standard syntax:
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;-- 静态分区
insert into table test partition (age='25') select id, name, tel from wyp;
--动态分区
insert into table test partition (age) select id, name, tel, age from wyp;Dynamic partition inserts are disabled by default prior to Hive 0.9.0 and enabled by default in Hive 0.9.0 and later.
SQL insert
Inserting values into tables from SQL
Standard Syntax:
INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]
Where values_row is:
( value [, value ...] )
where a value is either null or any valid SQL literal
-- 示例, 不支持多 value 的形式, 就是 `insert into (field...) values(...), (...)
INSERT INTO TABLE students
VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32);
INSERT INTO TABLE pageviews PARTITION (datestamp)
VALUES ('tjohnson', 'sports.com', 'finance.com', '2014-09-23'), ('tlee', 'finance.com', null, '2014-09-21');
INSERT INTO TABLE pageviews
VALUES ('tjohnson', 'sports.com', 'finance.com', '2014-09-23'), ('tlee', 'finance.com', null, '2014-09-21');ZooKeepper ----------------
参考: N_ZooKeepper