Hadoop完全分布式安装Hive

版权声明:每个人都是自己的上帝。如果你自己都放弃自己了,还有谁会救你?------《肖申克的救赎》本文为博主原创文章,欢迎转载(记得注明出处,拜托~)。 https://blog.csdn.net/hu_belif/article/details/83308004

   编译安装 Hive

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

Hive的环境配置需要MySQL的支持,所以首先需要安装MySQL,没有安装MySQL的先看上一篇:安装MySQL


C.1 编译Hive

C.1.1 下载 Hive 源代码包

在 Hive 的官网下载页面上下载,为加快下载速度选择中国境内的镜像 ,并下载apache-hive-1.2.1-

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=trueclean package

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

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

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

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

改名并迁移到/usr/local目录下:
 

$cd /usr/local
$mv apache-hive-1.2.1-bin /usr/local/hive-1.2.1
$ll /usr/local




登录 Mysql 官网进入下载页面 http://dev.mysql.com/downloads/connector/j/,默认情况下是Windows 安装包,这里需要选择Platform Independent 版本下载 zip 格式的文件, 如图附录 C-3所示。

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

$cd /home/spark/work
$mv mysql-connector-java-5.1.34-bin.jar /usr/local/hive-1.2.1/lib


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

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

export HIVE_HOME=/usr/local/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.templaete 为 hive-env.sh 并进行配置:

$cd /usr/local/hive-1.2.1/conf
$cp hive-env.sh.template hive-env.sh
$sudo vi hive-env.sh

分别设置 HADOOP_HOME 和 HIVE_CONF_DIR 两个值:

# Set HADOOP_HOME to point to a specific hadoop install directory
exportHADOOP_HOME=/usr/local/hadoop-2.7.2
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/usr/local/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;chara
cterEncoding=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

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

$hive --service metastore &
$hive --service hiveserver2&

启动用通过 jps 命令可以看到两个服务在后台运行, 如图附录 C-4 所示。


C.3.2 验证安装

登录 hive,在 hive 创建表并查看该表,如图附录 C-5 所示,命令如下:

$hive
hive> create table test(a string, b int);
hive> show tables;
hive> desc test;

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

$mysql -uhive -phive
mysql> use hive;
mysql> select TBL_ID, CREATE_TIME, DB_ID, OWNER, TBL_NAME,TBL_TYPE from TBLS;




C.4 Hive 实例演示

C.4.1 准备数据

1. 上传数据
交易数据存放在该系列配套资源的/saledata 目录下,把这些数据文件上传到 master 节点的/home/spark/word 目录下。
2. 启动 Hive 并创建数据库
启动 HDFS、 YARN 和 Hive,启动完毕后创建 Hive 数据库:

$hive --service metastore &
$hive
hive> create database hive;
hive> show databases;
hive> use hive;

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

  • tbDate:定义了日期的分类,将每天分别赋予所属的月份、星期、季度等属性,字段
  • 分别为日期、年月、年、月、日、周几、第几周、季度、旬、半月。
  • tbStock:定义了订单表头,字段分别为订单号、交易位置、交易日期。
  • 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 ' \n' ;
Time taken: 1.121 seconds
hive> CREATE TABLE tbStock(ordernumber STRING,locationid string,dateID string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ,' LINES TERMINATED BY ' \n' ;
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 ' \n' ;
Time taken: 0.267 seconds

hive> show tables;
OK
tbdate
tbstock
tbstockdetail
Time taken: 0.089 seconds, Fetched: 3 row(s)

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

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 数据库中增加了 3 个文件夹,分别对应 3 张表:

[spark@master ~]$ hadoop fs -ls /user/hive/warehouse/hive.db
Found 3 items
drwxr-xr-x- spark 2016-04-1415:18 /user/hive/warehouse/hive.db/ tbdate
drwxr-xr-x- spark 2016-04-1415:18 /user/hive/warehouse/ hive.db/ tbstock
drwxr-xr-x- spark 2016-04-14 15:18 /user/hive/warehouse/hive.db/ tbstockdetail

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

1. 算法分析
要计算所有订单每年的总金额,首先需要获取所有订单的订单号、订单日期和订单金信息,
然后把这些信息和日期表进行关联,获取年份信息,最后根据这 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_0001 和 application_1460617800545_000,在 YARN 的资源管理器界面中(默认 http://master:8088/),可以看到如图附录 C-7 所示的界面。


3. 查看结果
整个计算过程使用了 175.25s,结果如图附录 C-8 所示。


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

1. 算法分析
该算法分为两步:
(1)按照日期和订单号进行归组计算,获取所有订单每天的销售数据。
(2)把第一步获取的数据和日期表进行关联获取的年份信息,然后按照年份进行归组,使用 Max 函数,获取所有订单每年最大金额订单的销售额。
2. 执行 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_0004 和 job_1437659442092_0005,在 YARN 的监控界面中可以看到如图附录 C-9 所示的界面。
3. 查看结果
整个计算过程使用了 171.41s,结果如图附录 C-10 所示。

猜你喜欢

转载自blog.csdn.net/hu_belif/article/details/83308004