• Hive介绍
  • Hive环境搭建
  • Hive实现wordcount


Hive介绍

  • 产生背景

MapReduce编程的不便性
HDFS上的文件缺少Schema,无法使用SQL方式查询

  • What?

Facebook于2007年开源,最初用于解决海量结构化的日志数据统计问题
是一个构建在Hadoop之上的数据仓库
定义了一种类SQL查询语言:HQL
通常用于进行离线数据处理
底层支持多种不同的执行引擎(MR,Tez,Spark)
支持多种不同的压缩格式、存储格式以及自定义函数
- -压缩:GZIP、LZO、Snappy、BZIP2..
- -存储:TextFile、SequenceFile、RCFile、ORC、Parquet
- -UDF:自定义函数

  • 数据仓库与数据库的区别

1.数据库是面向事务的设计,数据仓库是面向主题设计的。
2.数据库一般存储在线交易数据,数据仓库存储的一般是历史数据。
3.数据库设计是尽量避免冗余,一般采用符合范式的规则来设计,数据仓库在设计是有意引入冗余,采用反范式的方式来设计。

  • Why?

HQL操作,简单
为大数据设计的计算/存储扩展能力(底层默认是MR,HDFS存储)
统一的元数据管理(可与Presto/Impala/SparkSQL等共享数据)

Hive环境搭建

  • 前置条件:

jdk1.8.0_144
hadoop-2.6.0-cdh5.7.0

cd ~/software
wget http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.7.0.tar.gz
  • 解压:
tar -xvf hive-1.1.0-cdh5.7.0.tar -C ~/app/
  • 配置:

1) 环境变量

vi ~/.bash_profile

添加:

export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.7.0/bin
export PATH=$HIVE_HOME/bin:$PATH
source ~/.bash_profile

2) 配置文件

cd ~/app/hive-1.1.0-cdh5.7.0/conf
cp hive-env.sh.template hive-env.sh

添加:

HADOOP_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0

3) 安装mysql

yum install mysql
  • 继续配置文件
cd ~/app/hive-1.1.0-cdh5.7.0/conf
vi hive-site.xml
<configuration>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://localhost:3306/sparksql?createDatabaseIfNotExist=true</value>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>root</value>
    </property>
</configuration>

4) 拷贝mysql驱动到$HIVE_HOME/lib/

cp ~/software/mysql-connector-java-5.1.27-bin.jar ~/app/hive-1.1.0-cdh5.7.0/lib/

5)启动hive:

$HIVE_HOME/bin/hive

以下显示即成功:

... ...
hive>
  • 测试

前面在hive-site.xml的配置项中设置了:如果mysql中不存在sparksql则自动创建。
下面如mysql看一看:

mysql -uroot -proot
mysql> show databases;
mysql> use sparksql;
mysql> show tables;
... // 这些表是hive自动创建的
21 rows in set (0.00 sec)
mysql> select * from TBLS;
Empty set (0.00 sec)

Hive实现wordcount

1)

hive> create table hive_wordcount(context string);
OK
Time taken: 1.003 seconds

这里可能会报错:

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:For direct MetaStore DB connections, we don’t support retries at the client level.)

退出hive用下列命令启动hive:

hive -hiveconf hive.root.logger=DEBUG,console

出现以下信息是为字符集问题:

ERROR DataNucleus.Datastore: Error thrown executing CREATE TABLE SD_PARAMS
(
SD_ID BIGINT NOT NULL,
PARAM_KEY VARCHAR(256) BINARY NOT NULL,
PARAM_VALUE VARCHAR(4000) BINARY NULL,
CONSTRAINT SD_PARAMS_PK PRIMARY KEY (SD_ID,PARAM_KEY)
) ENGINE=INNODB : Specified key was too long; max key length is 767 bytes
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes

将hive的元数据库改成了mysql要注意:mysql默认编码是latin1,但是我们在日常开发中大多数情况下需要用到utf-8编码,默认latin1会导致中文存储进去乱码。用下列方式查看当前mysql默认编码:

mysql> show variables like '%char%';

但是:hive的元数据metastore在mysql的数据库,不管是数据库本身,还是里面的表编码都必须是latin1。用下列命令修改数据库编码即解决:

mysql> ALTER DATABASE sparksql CHARACTER SET latin1;

2)

接着在mysql查看新建的表:

mysql> show databases;
mysql> use sparksql;
mysql> select * from TBLS;  // TBLS表中存储Hive表、视图、索引表的基本信息
mysql> select * from COLUMNS_V2;  // 查看字段

我们统计的文件信息:

cat ~/data/hello.txt 
hello world welcome
hello welcome

在hive中执行:

hive> load data local inpath '/home/hadoop/data/hello.txt' into table hive_wordcount;
Loading data to table default.hive_wordcount
Table default.hive_wordcount stats: [numFiles=1, totalSize=34]
OK
Time taken: 1.693 seconds

hive> select * from hive_wordcount;
OK
hello world welcome
hello welcome
Time taken: 0.42 seconds, Fetched: 2 row(s)

hive> select word, count(1) from hive_wordcount lateral view explode(split(context,'\t')) wc as word group by word;
...
Total MapReduce CPU Time Spent: 5 seconds 690 msec
OK
hello   2
welcome 2
world   1
// lateral view explode(): 是把每行记录按照指定分隔符进行拆解
// hive ql提交执行以后会生成mr作业,并在yarn上运行,查看作业:http://192.168.27.141:8088