MapReduce和Hive
1,MapReduce的原理,Wordcount的过程
1.1,Mapreduce是一个计算框架,既然是做计算的框架,那么表现形式就是有个输入(input),mapreduce操作这个输入(input),通过本身定义好的计算模型,得到一个输出(output),这个输出就是我们所需要的结果。
1.2,对待大数据处理:分而治之,大数据的并行化计算
1.3,不可分拆的计算任务或相互间有依赖关系的数据无法进行并行计算
Map: 对一组数据元素进行某种重复式的处理
Reduce: 对Map的中间结果进行某种进一步的结果整
MapReduce是一种编程思想,可以使用java来实现,C++来实现。Map的作用是过滤一些原始数据,Reduce则是处理这些数据,得到我们想要的结果,比如你想造出番茄辣椒酱。也就是我们使用hadoop,比方来进行日志处理之后,得到我们想要的关心的数据
图中对数据进行提取处理,得到想要的数据.分成Map阶段和Reduce阶段,Map阶段中编写出相应场景的计算程序,将数据进行并行处理并过滤。Reduce阶段就是将Map阶段中得到的数据根据自己的需求进行得到自己想要的数据。
WordCount:给你一批数据,得到其中的需求数据。首先,统计每一个数据块中的需求数据,然后将提取所有的需求数据放在一起。
2,Hive架构
2.1,Hive是什么?
Hive 就是基于hadoop上的数据仓库。
Hive就是在Hadoop上架了一层SQL接口(HQL作为查询接口),可以将SQL翻译成MapReduce(执行层)去Hadoop上执行,这样就使得数据开发和分析人员很方便的使用SQL来完成海量数据的统计和分析,而不必使用编程语言开发MapReduce那么麻烦。Hive的所有数据都存储在HDFS中。
2.2,hive擅长什么?
Hive擅长的是非实时的、离线的、对响应及时性要求不高的海量数据批量计算,即席查询,统计分析。
2.3,Hive架构
分为三部分:客户端,hive服务,转化的Map/Reduce作业
Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver(图中三个组件),结合元数据(MetaStore),将这些指令翻译成Map/Reduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。
3,MapReduce跟TEZ区别
3.1,TEZ是啥?
Tez是Apache开源的支持DAG作业的计算框架,它直接源于MapReduce框架,核心思想是将Map和Reduce两个操作进一步拆分,即Map被拆分成Input、Processor、Sort、Merge和Output, Reduce被拆分成Input、Shuffle、Sort、Merge、Processor和Output等,这样,这些分解后的元操作可以任意灵活组合,产生新的操作,这些操作经过一些控制程序组装后,可形成一个大的DAG作业。总结起来,Tez有以下特点:
(1)Apache二级开源项目(源代码今天发布的)
(2)运行在YARN之上
(3)适用于DAG(有向图)应用(同Impala、Dremel和Drill一样,可用于替换Hive/Pig等)
MapReduce:是一种离线计算框架,将一个算法抽象成Map和Reduce两个阶段进行处理,非常适合数据密集型计算。
Tez: 运行在YARN之上支持DAG作业的计算框架,对MapReduce数据处理的归纳。它把Map/Reduce过程拆分成若干个子过程,同时可以把多个Map/Reduce任务组合成一个较大的DAG任务,减少了Map/Reduce之间的文件存储。同时合理组合其子过程,也可以减少任务的运行时间。
总结:TEZ比MapReduce优化很多,支持得多,速度快。
4,Hive CLI命令解释
Create database *;创建数据库
Show tables *;查看数据库中的表格
Use database *;用*数据库
Create table *;创建表
Hive –d var1 = price –databasetest 将=号后面的赋给var1,引用
Ø Select ${var1} from source_data limit 22;
Hive –hiveconfmapred.reduce.tasks=10; 配置参数
Set mapred.reduce.tasks;查看参数
进入CLI后,所有命令加分号;
Hive –e 执行一段SQL语句
Hive –f<>执行f中的HQL语句
Quit
Exit
Reset
Set –v
》 ! shell command
》 Dfs 和hadoop fs相似
输入$HIVE_HOME/bin/hive –H 或者 –help可以显示帮助选项:
-d,–define <key=value> | 定义一个变量值,这个变量可以在Hive交互Shell中引用,后面会介绍用法,比如:-d A=B | |
–database <databasename> | 进入Hive交互Shell时候指定数据库,默认进入default数据库 | |
-e <quoted-query-string> | 命令行执行一段SQL语句 | |
-f <filename> | filename文件中保存HQL语句,执行其中的语句 | |
-H,–help | 显示帮助信息 | |
-h <hostname> | 连接远程Hive Server,后续介绍 | |
–hiveconf <property=value> | 在命令行中设置Hive的运行时配置参数,优先级高于hive-site.xml,但低于Hive交互Shell中使用Set命令设置。 | |
–hivevar <key=value> | 同—define | |
-i <filename> | 进入Hive交互Shell时候先执行filename中的HQL语句 | |
-p <port> | 连接远程Hive Server的端口号 | |
-S,–silent | 静默模式,指定后不显示执行进度信息,最后只显示结果 | |
-v,–verbose | 冗余模式,额外打印出执行的HQL语句 |
这里特别介绍一下以下几个选项:
· -d,–define <key=value>
执行$HIVE_HOME/bin/hive -d k1=v1 –database lxw1234
表示,定义了一个变量k1,值为v1,执行了数据库为lxw1234
进入Hive交互Shell之后,可以使用${k1}来引用该变量,比如:
hive> select ‘${k1}’from t_lxw1234 limit 1;
OK
v1
这里将k1的值v1打印出来。
· –hiveconf <property=value>
可以使用该选项设定Hive的运行参数配置,相当于在Hive交互Shell中使用set命令进行设置,比如:
执行$HIVE_HOME/bin/hive –hiveconfmapred.reduce.tasks=20
进入交互Shell之后,运行的所有查询都会设置20个reduce task。
除非又用set mapred.reduce.tasks=N;进行另外设定。
· –hivevar <key=value>
用法同-d和—define
Hive交互Shell
Hive交互Shell指执行$HIVE_HOME/bin/hive之后,进入的有hive>提示符的交互式命令行,在这里可以执行查询语句,设置参数等等,所有的命令必须以分号结束,具体有以下命令和选项:
· quit
退出交互Shell
· exit
退出交互Shell
· reset
重置所有的Hive运行时配置参数,比如,之前使用set命令设置了reduce数量,使用reset之后,重置成hive-site.xml中的配置。
· set <key>=<value>
设置Hive运行时配置参数,优先级最高,相同key,后面的设置会覆盖前面的设置。
· set –v
打印出所有Hive的配置参数和Hadoop的配置参数。
· add命令
包括 add FILE[S]<filepath> <filepath>* 、 add JAR[S]<filepath> <filepath>* 、add ARCHIVE[S]<filepath> <filepath>*
向DistributeCache中添加一个或过个文件、jar包、或者归档,添加之后,可以在Map和Reduce task中使用。
比如,自定义一个udf函数,打成jar包,在创建函数之前,必须使用add jar命令,将该jar包添加,否则会报错找不到类。
· list 命令
包括 list FILE[S] 、list JAR[S] 、list ARCHIVE[S]
列出当前DistributeCache中的文件、jar包或者归档。
· delete 命令
包括 delete FILE[S]<filepath>* 、delete JAR[S]<filepath>* 、 delete ARCHIVE[S]<filepath>*
从DistributeCache中删除文件
· ! <command>
在交互Shell中执行Linux操作系统命令并打印出结果,不常用
比如:
hive> !pwd;
/home/lxw1234
· dfs <dfs command>
在交互Shell中执行hadoop fs 命令,不常用
比如,统计hdfs文件系统中/tmp/目录的总大小:
hive> dfs -du -s /tmp/;
54656194751 /tmp
· <query string>
最常用的,执行HQL语句,以分号结尾;
· source FILE <filepath>
在交互Shell中执行一个脚本,不常用。
5,Beeline连接方法
6,Hive建表语句参数解释
图中中括号表示选择性
图中常用AS,like用得少。类似复制表结构
创建表
创建表的语法选项特别多,这里只列出常用的选项。
以一个例子来说吧:
CREATEEXTERNAL TABLE t_lxw1234 (
idINT,
ipSTRING COMMENT ‘访问者IP’,
avg_view_depthDECIMAL(5,1),
bounce_rateDECIMAL(6,5)
)COMMENT ‘lxw的大数据田地-lxw1234.com’
PARTITIONEDBY (day STRING)
ROWFORMAT DELIMITED
FIELDSTERMINATED BY ‘,’
STOREDAS textfile
LOCATION‘hdfs://cdh5/tmp/lxw1234/';
· 关键字EXTERNAL:
表示该表为外部表,如果不指定EXTERNAL关键字,则表示内部表--默认内部表
· 关键字COMMENT
为表和列添加注释
· 关键字PARTITIONED BY
表示该表为分区表,分区字段为day,类型为string
· 关键字ROW FORMATDELIMITED
指定表的分隔符,通常后面要与以下关键字连用:
FIELDS TERMINATED BY ‘,’ //指定每行中字段分隔符为逗号
LINES TERMINATED BY ‘\n’ //指定行分隔符
COLLECTION ITEMS TERMINATED BY ‘,’//指定集合中元素之间的分隔符
MAP KEYS TERMINATED BY ‘:’ //指定数据中Map类型的Key与Value之间的分隔符
举个例子:
createtable score(name string, score map<string,int>)
ROWFORMAT DELIMITED
FIELDSTERMINATED BY ‘\t’
COLLECTIONITEMS TERMINATED BY ‘,’
MAPKEYS TERMINATED BY ‘:';
要加载的文本数据为:
biansutao‘数学':80,’语文':89,’英语':95
jobs‘语文':60,’数学':80,’英语':99
· 关键字STORED AS
指定表在HDFS上的文件存储格式,可选的文件存储格式有:
TEXTFILE//文本,默认值
SEQUENCEFILE// 二进制序列文件
RCFILE//列式存储格式文件 Hive0.6以后开始支持
ORC //列式存储格式文件,比RCFILE有更高的压缩比和读写效率,Hive0.11以后开始支持
PARQUET //列出存储格式文件,Hive0.13以后开始支持
· 关键词LOCATION
指定表在HDFS上的存储位置。