hadoop 生态圈:
HDFS 分布式文件储存系统
MapReduce 分布式离线计算引擎
Yarn 资源调用
Zookeeper 分布式协调服务
Hive 数据仓库/数据分析
Flume 数据采集
Spoop 数据迁移
HBase NoSql:实现百万数据级的毫秒级操作
Spark
kafka 消息队列
Scala 函数式编程语言
Spark RDD
SparkSql
SparkStreaming
SparkCore
缓存机制
Elasticsearch 大数据弹性分布式搜索引擎
Git GitHUB 分布式项目管理工具/代码托管平台
Docker
俗称的 3V :
第一个是Volume(海量),数据容量越来越大;第二个是Velocity(速度),数
据量增长越来越快,需要处理的速度和响应越来越快;第三个是Variety(多样性),指各种各样类型的数据出现,过去的数据更多的是结构化的,现在越来越多的数据是半结构,甚至是完全没有结构的数据,如文本、邮件甚至于语音、视频等。“3V”是对大数据最基本特征的归纳,得到业界的共识。
虽然后续不断有人增加对V的理解,如Value(价值),强调大数据中的总体价值大,但是价值密度低;也有Veracity(真实和准确)
,强调真实而准确的数据才能让对数据的管控和治理真正有意义,也有Vitality(动态性)
强调数据体系的动态性等,这些都有一定的道理,但都不及最初的“3V”具有代表性。
hdfs fsck / --fsck(文件系统一致性检查)
集群的基本信息。整个集群的空间多大 所有目录多少 所有文件 所有块(平均的块大小) 所有链接 备份的块 个数 有没有块坏掉 有没有块备份丢失 集群里面有多少个节点
hdfs dfs -df -h
查看集群的硬盘使用情况
hdfs dfs -du /
目录下的硬盘空间使用情况
hdfs dfs -ls -h /file
显示具体的文件大小(差不多就这个意思,转换成可读懂的计量单位)
MapReduce是什么? --MapReduce(分布式计算模型)
用于大规模数据处理
map阶段负责对输入文件进行切分处理,然后汇总再分组给reduce进行处理,以达到高效的分布式计算效率
1)MapReduce是什么?
a、MapReduce是一种分布式计算模型模型,用于大规模数据集(大于1TB)的并行运算。
b、相对于Hadoop框架来说,其最核心设计就是:HDFS和MapReduce。HDFS提供了海量数据的存储,MapReduce提供了对数据的计算。
c、MapReduce把任务分为 map(映射)阶段和reduce(化简)。
每个MapReduce作业由两个阶段组成
Map
Reduce
MaoReduce自动计算
MapReduce计算是并行和自动分布的;
开发人员只需要专注于实现映射和reduce功能;
M/R是用Java编写的,但也支持Python流。
如何知道和显示当前所在数据库?
select current_database();
--current(现在的)
数据库描述:
describe database ...(嗯哼);
--(也可以简写为desc) desc formatted ...(嗯哼); (更详细的信息)还可以显示location)--describe(描述)
如何知道你的表是怎么创建的(显示建表语句):
show create table ...(嗯哼)
--显示你的建表语句
Hive Tables --(表)
External Tables: --(外部表)
数据保存在由LOCATION关键字指定的HDFS路径中。Hive不完全管理数据, 因为删除表(元数据)不会删除数据
Internal Tables: --(内部表)
数据保存在默认路径中,例如/user/hive/warehouse/employee。数据完全由Hive管理,因为删除表(元数据)也会删除数据
Temporary Tables: -- (临时表)
temporary table只对当前session有效,session退出之后,table自动删除
当名称相同时,temporary table优先于相同名称
--(只有drop或rename之后,,才能使用原始表)
不支持分区和创建索引
如何确定你的表是临时表:
show create table ...(嗯哼);
--(查看)
Hive建表高阶语句:
CTAS:
Create Table As Select(之能创建内部表)
--CTAS(使用查询创建表)
create table 要创建的表 as select * from 目标表(复制数据);
CANNOT create a partition, external, or bucket table --cannot,partion,external talbe,bucket table(无法,分区,外部表,分桶)
CTE:
with Common Table Expression
--CTE(公共表达式)
CREATE TABLE cte_employee AS
WITH
r1 AS (SELECT name FROM employee WHERE sex_age.sex= 'Male'),
--查询sex 为 Male 的 name
r2 AS (SELECT name FROM r2 WHERE name = 'Michael'),
--查询sex 为 Male , name 为 Michael
r3 AS (SELECT name FROM employee WHERE sex_age.sex= 'Female')
--查询sex 为 Male 的 name
SELECT * FROM r2 UNION ALL SELECT * FROM r3;
--把r2和r3的查询结果写到emp_cte中 --union all(联合 )
like:
CREATE TABLE 要创建的表 LIKE 目标表(复制表结构);
--(快速的创建一个表,复制目标表的的表结构,没有数据)
purge:
drop talbe ...(嗯哼) purge;
--内部表:完全删除,无法找回 外部表:只删除表结构,数据还在
truncate:
truncate talbe ...(嗯哼);
--用来删除表中的数据(外部表除外)(delete 删除单行)
重命名表:
ALTER TABLE table_name rename to new_table_name;
--(数据所在的位置和分区都没有改变。)
修改表属性:
alter table table_name set TBLPROPERTIES ('EXTERNAL'='TRUE');
--内部表转外部表alter table
alter table table_name set TBLPROPERTIES ('EXTERNAL'='FALSE');
--外部表转内部表
增加/更新列:
ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type);
--add 在最后一行添加列 replace 删除所有列,重新添加
对Hive表的三连问:
1.什么是内部,外部表?
未被external修饰的是内部表(Internal table),被external修饰的为外部表(external table)
2.它们的区别是什么?:
1)内部表数据由Hive自身管理(完全控制),外部表数据由HDFS管理;
2)内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定;
3)删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;删除内部表会直接删除元数据(metadata)及存储数据
4)对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name; )
3.它们适合应用在什么场景?
外部表:
对数据产生了保护作用,适合用于储存原数据(重要),需要定期将外部数据映射到表中。也适合用于共享资源,(如果要对用户共享数据,可以直接把表给他, 缺点是需要把自己数据库的访问权限给他,让他访问自己的权限。。。 ,那这样我可以把要共享的数据整理到一个新的database,新的External(外部表)里,这样就不会让他访问我的数据库,然后就可以给他hdfs的路径,)
内部表:在做统计分析时候用到的中间表,结果表可以使用内部表。(对数据清洗和内部转换)
Hive Partition: --partiton (分区)
在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念
一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。
分区是以字段的形式在表结构中存在的。
分区建表分为2种,一种是单分区,也就是说在表文件夹目录下只有一级文件夹目录。另外一种是多分区,表文件夹下出现多个文件夹嵌套模式。
--(以文件夹的形式储存在HDFS)
创建分区表:
create table table_name (...) partiton by (partiton_name data_type);
显示表中的分区:
show partitons table_name;
添加分区:
Alter TABLE table_name ADD PARTITION (dt='20130101') ;
--(一次添加一个分区)
修改分区:
Alter TABLE table_name PARTITION (dt='2008-08-08') SET LOCATION "new location";
--修改location (每次都要手动Alter)
Alter TABLE table_name PARTITION (dt='2008-08-08') RENAME TO PARTITION (dt='20080808');
--重命名
删除分区:
Alter TABLE table_name DROP PARTITION (dt='2008-08-08');
Dynamic Partition: --dynamic partition(动态分区)
当数据量很大而我们不知道分区值是多少时,动态分区是非常有用的。
dynamic partition的两个参数:
set hive.exec.dynamic.partition=true;
--开启动态分区(默认是false)(动态分区是一个很刺激的操作,因为一不小心就很可能弄出成千上万个分区,后果嘛...(嗯哼),所有在默认情况下,动态分区是没有打开的)
set hive.exec.dynamic.partition.mode=nonstrict;
--开启允许所有分区都是动态的,否则必须要有静态分区才能使用。
Hive Partition 三连问:
1.hive partiotion的作用:
在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念
2.hive有几种partiton:
两种:static partiton 和 dynamice partition
3.不同分区的适用场景和最佳实践:
静态分区:根据数据到来的频率,新数据的到来
动态分区:进行数据转换、重新组合,根据已有数据进行动态分区
Hive Buckets: --buckets(分桶)
hive.optimize.bucketmapjoin= true
--(让hive强制分桶,自动按照分桶表的bucket 进行分桶)
好处:
1、方便抽样
2、提高join查询效率
buckets的column是数据文件的column,不是凭空生成的
buckets的个数是2的N次方
buckets是由column组织成多个文件
--(文件的个数由buckets决定)
创建 buckets table:
CREATE TABLE bucketed_user (id INT) name STRING)
CLUSTERED BY (id) INTO 4 BUCKETS;
往表中插入数据:
INSERT OVERWRITE TABLE bucketed_users SELECT * FROM users;
--(向分桶表中插入数据的时候必然要执行一次MapReduce)
如何将数据插入分桶表
1.从hdfs或本地磁盘中load数据,导入中间表
2.通过从中间表查询的方式的完成数据导入
Hive Views: --views(视图)
视图是建立在已有表的基础上,如果基表被修改或删除,那视图作废
--(视图赖以建立的这些表称为基表)
视图可以简化复杂的查询,提供了一定的逻辑独立性
视图不储存数据,
视图从数据库的基本表中选取出来的数据组成的逻辑窗口
--(可以被定义为多个表的连接,也可以被定义为只有部分列可见,也可为部分行可见)
建立视图支持cte,order by,limit,join,etc;
查找视图用, show tables/show views (仅在hive v2.2.0之后的版本)
显示View定义用 show create table view_name;
hive views的一些常用语句:
建立视图:create view view_name as select target_table_name;
删除视图:drop view_name;
更改视图属性:alter view view_name set tblproperties(...);
更改视图定义:alter view view_name as select target_table_name;
Hive Laternl Views: --laternl views(侧视图)
例如:
select id,explode(arry1) from table; —错误
会报错FAILED: SemanticException 1:40 Only a single expression in the SELECT clause is supported with UDTF's.
select explode(array1) from table; —正确
但是实际中经常要拆某个字段,然后一起与别的字段一起出.例如上面的id和拆分的array元素是对应的.我们应该如何进行连接呢?我们知道直接select
id,explode()是不行的.这个时候就需要lateral view出厂了.
lateral view为侧视图,意义是为了配合UDTF来使用,把某一行数据拆分成多行数据.不加lateral view的UDTF只能提取单个字段拆分,并不能塞会原来数据表中.加上lateral view就可以将拆分的单个字段数据与原始表数据关联上
也可以多次使用lateral view explode
select id,num1,num2 from table
lateral view explode(array1) subview1 as num1
lateral view explode(array2) subview2 as num2
where ...;
行转列:
select name,loc from e_text lateral view explode(work_place) a as loc;
Hive Select: --(数据映射)
distinct: 去重(去掉重复的数据)