百度MapReduce BMR

    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
    上一篇
    Spark
    下一篇
    HBase