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,比方来进行日志处理之后,得到我们想要的关心的数据

    MapReduce和Hive

图中对数据进行提取处理,得到想要的数据.分成Map阶段和Reduce阶段,Map阶段中编写出相应场景的计算程序,将数据进行并行处理并过滤。Reduce阶段就是将Map阶段中得到的数据根据自己的需求进行得到自己想要的数据。

    MapReduce和Hive

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架构

    MapReduce和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、MergeOutput, Reduce被拆分成Input、Shuffle、Sort、Merge、ProcessorOutput等,这样,这些分解后的元操作可以任意灵活组合,产生新的操作,这些操作经过一些控制程序组装后,可形成一个大的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连接方法

 MapReduce和Hive

6,Hive建表语句参数解释

      MapReduce和Hive

                                         图中中括号表示选择性

      MapReduce和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上的存储位置

    MapReduce和HiveMapReduce和Hive