• 附录C 编译安装Hive


    如果需要直接安装Hive,可以跳过编译步骤,从Hive的官网下载编译好的安装包,下载地址为http://hive.apache.org/downloads.html

    C.1  编译Hive

    C.1.1   下载Hive源代码包

    Hive的官网下载页面上下载,为加快下载速度选择中国境内的镜像,并下载apache-hive-1.2.1-src.tar.gz源代码包。下载后把安装包方放在目录/home/spark/work目录下,用如下命令解压缩hive安装文件:

    $cd /home/spark/work/

    $tar -zxf apache-hive-1.2.1-src.tar.gz

    改名并移动到/app/compile目录下:

    $mv apache-hive-1.2.1-src /app/compile/hive-1.2.1-src

    $ll /app/compile/

    C.1.2   编译Hive

    编译Hive源代码的时候,需要从网上下载依赖包,所以整个编译过程机器必须保证在联网状态。编译执行如下脚本:

    $cd /app/compile/hive-1.2.1-src

    $export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"

    $mvn -Phadoop-2 -Pdist -DskipTests -Dmaven.javadoc.skip=true clean package

    在编译过程中可能出现速度慢或者中断,可以再次启动编译,编译程序会在上次的编译中断处继续进行编译,整个编译过程耗时与网速紧密相关,网速较快的情况需要1个小时左右(下图的时间是重复多次下载依赖包,然后编译成功的界面),最终编译打包的文件为$HIVE_HOME/packaging /target/apache-hive-1.2.1-bin.tar.gz

    clip_image002

    图 附录C‑1 编译Hive成功界面

    通过如下命令查看最终编译完成整个目录大小,可以看到大小为350M左右:

    $du -s /app/compile/hive-1.2.1-src

    clip_image004

    C.2  安装Hive

    C.2.1   解压缩并迁移

    使用上一步骤编译好的Hive编译包移动到安装目录上,用如下命令解压缩hive安装文件:

    $cd /app/compile/hive-1.2.1-src/packaging/target/

    $mv apache-hive-1.2.1-bin.tar.gz /home/spark/work/

    $cd /home/spark/work/

    $tar -zxf hive-1.2.1-bin.tar.gz

    改名并迁移到/app/soft目录下:

    $cd /app/spark

    $mv apache-hive-1.2.1-bin /app/spark/hive-1.2.1

    $ll /app/soft

    clip_image006

    图 附录C‑2 Hive移动到/app/soft目录下

    C.2.2   下载MySql驱动并放到Hivelib目录下

    mysql官网进入下载页面http://dev.mysql.com/downloads/connector/j/,默认情况下是Windows安装包,这里需要选择Platform Independent版本下载zip格式的文件

    clip_image008

    图 附录C‑3 MySql驱动下载界面

    把下载的hive安装包和mysql驱动包,使用如下命令放到Hivelib目录下:

    $cd /home/spark/work

    $mv mysql-connector-java-5.1.34-bin.jar /app/soft/hive-1.2.1/lib

    C.2.3   配置/etc/profile环境变量

    使用如下命令打开/etc/profile文件,设置如下参数:

    export HIVE_HOME=/app/soft/hive-1.2.1

    export PATH=$PATH:$HIVE_HOME/bin

    export CLASSPATH=$CLASSPATH:$HIVE_HOME/bin

    配置完毕后,需要编译该配置文件或重新登录以生效该配置:

    $source /etc/profile

    C.2.4   设置hive-env.sh配置文件

    进入hive-1.2.1/conf目录,复制hive-env.sh.templaetehive-env.sh并进行配置:

    $cd /app/soft/hive-1.2.1/conf

    $cp hive-env.sh.template hive-env.sh

    $sudo vi hive-env.sh

    分别设置HADOOP_HOMEHIVE_CONF_DIR两个值:

    # Set HADOOP_HOME to point to a specific hadoop install directory

    export HADOOP_HOME=/app/spark/hadoop-2.7.2

    # Hive Configuration Directory can be controlled by:

    export HIVE_CONF_DIR=/app/soft/hive-1.2.1/conf

    C.2.5   设置hive-site.xml配置文件

    创建hive-site.xml配置文件,在该配置文件中加入配置内容

    $touch hive-site.xml

    $sudo vi hive-site.xml

    hive默认为derby数据库,derby数据只运行单个用户进行连接,这里需要调整为mysql数据库,以下为修改配置内容:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>

    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

    <configuration>

        <property>

            <name>javax.jdo.option.ConnectionURL</name>

            <value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExsit=true; characterEncoding=UTF-8</value>

        </property>

        <property>

            <name>javax.jdo.option.ConnectionDriverName</name>

            <value>com.mysql.jdbc.Driver</value>

        </property>

        <property>

            <name>javax.jdo.option.ConnectionUserName</name>

            <value>hive</value>

        </property>

        <property>

            <name>javax.jdo.option.ConnectionPassword</name>

            <value>hive</value>

        </property>

        <property>

            <name>datanucleus.readOnlyDatastore</name>

            <value>false</value>

        </property>

        <property>

            <name>datanucleus.fixedDatastore</name>

            <value>false</value>

        </property>

        <property>

            <name>datanucleus.autoCreateSchema</name>

            <value>true</value>

        </property>

        <property>

            <name>datanucleus.autoCreateTables</name>

            <value>true</value>

        </property>

        <property>

            <name>datanucleus.autoCreateColumns</name>

            <value>true</value>

        </property>

    </configuration>

    C.3  启动Hive并验证

    C.3.1   启动Hive

    实际使用时,一般通过后台启动metastorehiveserver实现服务,命令如下:

    $hive --service metastore &

    $hive --service hiveserver2 &

    clip_image010

    图 附录C‑4 Hive启动后台服务

    启动用通过jps命令可以看到两个进行运行在后台

    C.3.2   验证安装

    登录hive,在hive创建表并查看该表,命令如下:

    $hive

    hive> create table test(a string, b int);

    hive> show tables;

    hive> desc test;

    clip_image012

    图 附录C‑5 Hive中创建测试表

    登录mysql,在TBLS表中查看新增test表:

    $mysql -uhive -phive

    mysql> use hive;

    mysql> select TBL_ID, CREATE_TIME, DB_ID, OWNER, TBL_NAME,TBL_TYPE from TBLS;

    clip_image014

    图 附录C‑6 Hive元数据表查询到创建表

    C.4  Hive实例演示

    C.4.1   准备数据

    第一步   上传数据

    交易数据存放在该系列配套资源的/saledata目录下,把这些数据文件上传到master节点的/home/spark/word目录下。

    第二步   启动Hive并胡藏剑数据库

    启动HDFSYARNHive,启动完毕后创建Hive数据库

    $hive --service metastore &

    $hive

    hive> create database hive;

    hive> show databases;

    hive> use hive;

    第一步   Hive创建和表

    启动Hadoop集群,进入Hive命令行操作界面,使用如下命令创建三张数据表:

    l  tbDate定义了日期的分类,将每天分别赋予所属的月份、星期、季度等属性,字段分别为日期、年月、年、月、日、周几、第几周、季度、旬、半月

    l  tbStock定义了订单表头,字段分别为订单号、交易位置、交易日期

    l  tbStockDetail文件定义了订单明细,该表和tbStock以交易号进行关联,字段分别为订单号、行号、货品、数量、金额

    hive> CREATE TABLE tbDate(dateID string,theyearmonth string,theyear string,themonth string,thedate string,theweek string,theweeks string,thequot string,thetenday string,thehalfmonth string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY ' ' ;

    Time taken: 1.121 seconds

     

    hive> CREATE TABLE tbStock(ordernumber STRING,locationid string,dateID string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY ' ' ;

    Time taken: 0.166 seconds

     

    hive> CREATE TABLE tbStockDetail(ordernumber STRING,rownum int,itemid string,qty int,price int ,amount int) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY ' ' ;

    Time taken: 0.267 seconds

     

    hive> show tables;

    OK

    tbdate

    tbstock

    tbstockdetail

    Time taken: 0.089 seconds, Fetched: 3 row(s)

    第二步   导入数据

    从本地操作系统分别加载日期、交易信息和交易详细信息表数据

    hive> LOAD DATA LOCAL INPATH '/home/spark/work/saledata/tbDate.txt' INTO TABLE tbDate;

    Loading data to table hive.tbdate

    OK

    Time taken: 2.784 seconds

     

    hive> LOAD DATA LOCAL INPATH '/home/spark/work/saledata/tbStock.txt' INTO TABLE tbStock;

    Loading data to table hive.tbstock

    OK

    Time taken: 0.648 seconds

     

    hive> LOAD DATA LOCAL INPATH '/home/spark/work/saledata/tbStockDetail.txt' INTO TABLE tbStockDetail;

    Loading data to table hive.tbstockdetail

    OK

    Time taken: 1.44 seconds

    查看HDFS中相关SALEDATA数据库中增加了三个文件夹,分别对应三个表:

    [spark@master ~]$ hadoop fs -ls /user/hive/warehouse/hive.db

    Found 3 items

    drwxr-xr-x - spark supergroup 0 2016-04-14 15:18 /user/hive/warehouse/hive.db/tbdate

    drwxr-xr-x - spark supergroup 0 2016-04-14 15:18 /user/hive/warehouse/hive.db/tbstock

    drwxr-xr-x - spark supergroup 0 2016-04-14 15:18 /user/hive/warehouse/hive.db/tbstockdetail

    C.4.2   计算所有订单每年的总金额

    第一步   算法分析

    要计算所有订单每年的总金额,首先需要获取所有订单的订单号、订单日期和订单金信息,然后把这些信息和日期表进行关联,获取年份信息,最后根据这四个列按年份归组统计获取所有订单每年的总金额。

    第二步   执行HSQL语句

    hive> use hive;

    hive> select c.theyear, sum(b.amount) from tbStock a,tbStockDetail b,tbDate c where a.ordernumber=b.ordernumber and a.dateid=c.dateid group by c.theyear order by c.theyear;

    运行过程中创建两个Job,分别为application_1460617800545_0001application_1460617800545_000,在YARN的资源管理器界面中(默认http://master:8088/),可以看到如下界面:

    clip_image016

    图 附录C‑7 YARN监控界面作业运行状态

    第三步   查看结果

    整个计算过程使用了175.25秒,结果如下:

    clip_image018

    图 附录C‑8 计算所有订单每年的总金额结果

    C.4.3   计算所有订单每年最大金额订单的销售额

    第一步   算法分析

    该算法分为两步:

    1.     按照日期和订单号进行归组计算,获取所有订单每天的销售数据;

    2.      把第一步获取的数据和日期表进行关联获取的年份信息,然后按照年份进行归组,使用Max函数,获取所有订单每年最大金额订单的销售额。

    第二步   执行HSQL语句

    //第一步:按照日期和订单号进行归组计算,获取所有订单每天的销售数据

    hive> select a.dateid,a.ordernumber,sum(b.amount) as sumofamount from tbStock a,tbStockDetail b where a.ordernumber=b.ordernumber group by a.dateid,a.ordernumber;

     

    //第二步: 按照年份进行归组,使用Max函数,获取所有订单每年最大金额订单的销售额

    hive> select c.theyear,max(d.sumofamount) from tbDate c,(select a.dateid,a.ordernumber,sum(b.amount) as sumofamount from tbStock a,tbStockDetail b where a.ordernumber=b.ordernumber group by a.dateid,a.ordernumber) d  where c.dateid=d.dateid group by c.theyear sort by c.theyear;

    运行过程中创建两个Job,分别为job_1437659442092_0004job_1437659442092_0005,在YARN的监控界面中可以看到如下界面:

    clip_image020

    图 附录C‑9YARN监控界面作业运行状态

    第三步   查看结果

    整个计算过程使用了171.41秒,结果如下:

    clip_image022

    图 附录C‑10 查看所有订单每年最大金额订单的销售额结果

    C.4.4   计算其他金额

    1.     所有订单中季度销售额前10

    //所有订单中季度销售额前10

    hive> select c.theyear,c.thequot,sum(b.amount) as sumofamount from tbStock a,tbStockDetail b,tbDate c where a.ordernumber=b.ordernumber and a.dateid=c.dateid group by c.theyear,c.thequot order by sumofamount desc limit 10;

    2008      1     5252819

    2007      4     4613093

    2007      1     4446088

    2006      1     3916638

    2008      2     3886470

    2007      3     3870558

    2007      2     3782235

    2006      4     3691314

    2005      1     3592007

    2005      3     3304243

    clip_image024

    图 附录C‑11所有订单中季度销售额前10位结果

    2.     列出销售金额在100000以上的单据

    //列出销售金额在100000以上的单据

    hive> select a.ordernumber,sum(b.amount) as sumofamount from tbStock a,tbStockDetail b where a.ordernumber=b.ordernumber group by a.ordernumber having sumofamount>100000;

    HMJSL00009024   119058

    HMJSL00009958   159126

    clip_image026

    图 附录C‑12 列出销售金额在100000以上的单据

  • 相关阅读:
    android问题及其解决-优化listView卡顿和怎样禁用ListView的fling
    平安科技移动开发二队技术周报(第三期)
    机房重构(个人版)——类图
    php-wamp环境搭建
    ajax 通过return 返回data值
    cocos2d-x中六种持续性动作
    Android SimpleAdapter
    jquery 判断当前上传文件大小限制上传格式 搭配thinkphp实现上传即预览(模拟异步上传)
    【转】我的第一个Python小程序
    python官网
  • 原文地址:https://www.cnblogs.com/shishanyuan/p/6195863.html
Copyright © 2020-2023  润新知