Hive

Hive简介

本文以分析Web日志统计用户访问次数最多的前5个小时段为例,介绍如何在百度智能云平台使用Hive。百度MapReduce提供了两种使用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集群

  1. 准备数据,请参考数据准备
  2. 准备百度智能云环境
  3. 登录控制台,选择“产品服务->百度MapReduce BMR”,点击“创建集群”,进入集群创建页,并做如下配置:
    • 设置集群名称
    • 设置管理员密码
    • 关闭日志开关
    • 选择镜像版本“BMR 0.2.0(hadoop 2.6)”
    • 选择内置模板“hadoop”。
  4. 请保持集群的其他默认配置不变,点击“完成”可在集群列表页可查看已创建的集群,当集群状态由“初始化中”变为“空闲中”时,集群创建成功。

运行Hive作业

  1. 在“产品服务>MapReduce>百度MapReduce-作业列表”页中,点击“创建作业”,进入创建作业页。
  2. 配置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
    • 失败后操作:继续。
    • 应用程序参数:无。
  3. 在“集群适配”区,选择适配的集群。
  4. 点击“完成”,则作业创建完成。运行中的作业状态会由“等待中”更新为“运行中”,当作业运行完毕后状态会更新为“已完成”。

查看结果

可以从bos://{your-bucket}/output/000000这个输出文件查看到查询结果。因目前BMR中提供的社区hive版本还不支持将结果导出到bos或hdfs文件时自定义列字段间隔符,输出文件中各个列字段间隔符仍为hive默认的^A。如果使用系统提供的输入数据和程序,可以打开输出结果看到如下内容:

21    149290
22    139479
15    131247
20    98391
8     97590