Hive
更新时间:2021-11-26
Hive简介
本文以分析Web日志统计用户访问次数最多的前5个小时段为例,介绍如何在百度智能云平台使用Hive。MapReduce提供了两种使用Hive的方式:
- 通过Hue使用Hive,请参考Hue。
- 控制台中提交Hive作业。
Hive是基于Hadoop的数据仓库工具,提供海量数据的读取、写入、管理和分析,具有易扩展的存储能力和计算能力。不必开发专门的MapReduce应用便可通过类SQL语句快速实现简单的MapReduce统计,同时也允许熟悉MapReduce的开发者开发自定义的Mapper和Reducer来处理复杂的分析工作。
Hive的数据单元:
- Databases:数据库。
- Tables:表。
- Partitions:分区。只支持固定分区,将同一组数据存放至一个固定的分区中。
- Buckets(or Clusters):分桶。同一个分区内的数据还可以细分,将相同的KEY再划分至一个桶中。
Hive的数据类型:
- 原始数据类型 - TINYINT(微整型),只占用1个字节,只能存储0-255的整数。 - SMALLINT(小整型),占用2个字节,存储范围–32768到32767。 - INT(整型),占用4个字节,存储范围-2147483648到2147483647。 - BIGINT(长整型),占用8个字节,存储范围-2^63到2^63-1。 - BOOLEAN(布尔型),TRUE/FALSE。 - FLOAT(浮点型),单精度浮点数。 - DOUBLE(浮点型),双精度浮点数。 - STRING(字符串型),不设定长度。
- 复合数据类型 - Structs:一组由任意数据类型组成的结构。 - Maps:K-V对。 - Arrays:数组。
控制台中提交Hive作业
准备Hive脚本
BMR的hive作业脚本将建表、查询语句整合为hive脚本文件,您可直接使用样例脚本,也可根据如下文件内容创建自己的hive脚本:
DROP TABLE IF EXISTS access_logs;
CREATE EXTERNAL TABLE access_logs (
remote_addr STRING comment 'client IP',
time_local STRING comment 'access time',
request STRING comment 'request URL',
status STRING comment 'HTTP status',
body_bytes_sent STRING comment 'size of response body',
http_referer STRING comment 'referer',
http_cookie STRING comment 'cookies',
remote_user STRING comment 'client name',
http_user_agent STRING comment 'client browser info',
request_time STRING comment 'consumed time of handling request',
host STRING comment 'server host',
msec STRING comment 'consumed time of writing logs'
)
COMMENT 'web access logs'
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([0-9\\.]+) - \\[([^\\]]+)\\] \"([^\"]*)\" ([\\d]+) ([\\d]*) \"([^\"]*)\" \"([^\"]*)\" ([\\S]+) \"([^\"]*)\" ([0-9\\.]+) ([\\S]+) ([0-9\\.]+)"
)
STORED AS TEXTFILE
LOCATION "${INPUT}";
INSERT OVERWRITE DIRECTORY '${OUTPUT}'
SELECT hour(from_unixtime(unix_timestamp(time_local, 'dd/MMMM/yyyy:HH:mm:ss Z'))) as hour, count(1) as pv
FROM access_logs
GROUP BY hour(from_unixtime(unix_timestamp(time_local, 'dd/MMMM/yyyy:HH:mm:ss Z')))
ORDER BY pv DESC
limit 5;
脚本简介
CREATE EXTERNAL TABLE
语句从BOS上的文件定义了元数据,SELECT
语句根据时间纬度统计了PV。- 建表过程指定了数据存储路径为
${INPUT}
,该路径是您在BMR集群中提交Hive作业时指定的BOS输入地址(详见运行Hive作业)。 - 可从BMR作业列表的作业日志stdout查看到查询结果。也可至提交Hive作业时指定BOS输出路径中查看结果(详见运行Hive作业)。
创建BMR集群
- 准备数据,请参考数据准备。
- 准备百度智能云环境。
-
登录控制台,选择“产品服务->MapReduce BMR”,点击“创建集群”,进入集群创建页,并做如下配置:
- 设置集群名称
- 设置管理员密码
- 关闭日志开关
- 选择镜像版本“BMR 0.2.0(hadoop 2.6)”
- 选择内置模板“hadoop”。
- 请保持集群的其他默认配置不变,点击“完成”可在集群列表页可查看已创建的集群,当集群状态由“初始化中”变为“空闲中”时,集群创建成功。
运行Hive作业
- 在“产品服务>MapReduce>MapReduce-作业列表”页中,点击“创建作业”,进入创建作业页。
-
配置Hive作业参数,具体如下:
- 作业类型:选择“Hive作业”
- 作业名称:输入作业名称,长度不可超过255个字符。
- bos脚本地址:输入
bos://bmr-public-data/apps/hive/AccessLogAnalyzer_bmr_0.2.0.hql
。 - bos输入地址:输入
bos://bmr-public-data/logs/
。 - bos输出地址:输出路径必须具有写权限且该路径中所指定的目录不能在bos上存在,例如,输出路径为bos://test/sqooptest中的sqooptest目录在bos上必须不存在。输入
bos://{your-bucket}/output
。 - 失败后操作:继续。
- 应用程序参数:无。
- 在“集群适配”区,选择适配的集群。
- 点击“完成”,则作业创建完成。运行中的作业状态会由“等待中”更新为“运行中”,当作业运行完毕后状态会更新为“已完成”。
查看结果
可以从bos://{your-bucket}/output/000000
这个输出文件查看到查询结果。因目前BMR中提供的社区hive版本还不支持将结果导出到bos或hdfs文件时自定义列字段间隔符,输出文件中各个列字段间隔符仍为hive默认的^A。如果使用系统提供的输入数据和程序,可以打开输出结果看到如下内容:
21 149290
22 139479
15 131247
20 98391
8 97590