Hive安装部署
Hive:数据仓库。存储在
hdfs
上,使用
mR
计算。
数据以文本形式如
txt
存储在
hdfs
上,用户通过
hive
可以使用传统的
sql
来对
hdfs
上的数据文件进行相关操作,并且
hive
可以将
sql
转化为
MR
代码来进行分布式计算。
Hive:解释器(将脚本
HiveQL
解释成
java
代码,成为
mp
程序)
编译器(编译
java
代码),优化器。
H
i
ve数据存储在
hdfs
上,运行时,元数据存储在关系型数据中(
mysql
)
(1)
新建
Hive
目录,将
apache-hive-1.2.1-bin.tar.gz
拷贝到目录下
:
tar zxvf apache-hive-1.2.1-bin.tar.gz
(2)
设置
hive
的环境变量。
vi /etc/profile
#set the hive environment
export HIVE_HOME=/home/hadoop/Hive/apache-hive-1.2.1-bin
PATH=$HIVE_HOME/bin:$PATH
export PATH
source /etc/profile
(3) hive-env.sh
配置(
hive
的运行环境文件
):
进入解压后的hive
目录,进入
conf
:
cp hive-env.sh.template hive-env.sh
Hadoop
需要
java
作支撑,而
hive
需要
hadoop
作为支撑,
配置hive-env.sh
添加
hadoop_home
路径:
将export HADOOP_HOME
前面的
‘#’
号去掉,并让它指向您所安装
hadoop
的目录 (就是切换到这个目录下有
hadoop
的
conf,lib,bin
等文件夹的目录):
export HADOOP_HOME=/home/hadoop/hadoop
export HIVE_CONF_DIR=/home/hadoop/Hive/apache-hive-1.2.1-bin
export HIVE_AUX_JARS_PATH=/home/hadoop/Hive/apache-hive-1.2.1-bin/lib
:wq
source /hive-env.sh(
生效文件
)
(4)
安装
mysql
由于
hive
的元数据可能经常更新、修改和读取的操作,因此不宜存储在
hadoop
的
hdfs
中,而是
RDBMS
中。主要有以下三种:
②
本地模式:
MySQL
数据库安装在本地:支持多用户会话。
③
远程模式:把
metastore
配置到远程服务器上,可以配置多个
1>
sudo apt-get install mysql-server
执行后,可能会遇到以下问题:
正在读取软件包列表
...
完成
正在分析软件包的依赖关系树
正在读取状态信息
...
完成
您可能需要运行“
apt-get -f install
”来纠正下列错误:
下列软件包有未满足的依赖关系:
linux-generic-lts-vivid : 依赖
: linux-headers-generic-lts-vivid (= 3.19.0.26.13)
但是
3.19.0.25.12
正要被安装
mysql-server : 依赖
: mysql-server-5.5
但是它将不会被安装
E: 有未能满足的依赖关系。请尝试不指明软件包的名字来运行“
apt-get -f install
”
(
也可以指定一个解决办法
)
。
因此我们首先执行:
sudo apt-get –
f install (注意要使用
root
权限,否则报错
)
然后再:
sudo apt-get install mysql-server
中间过程中会提示输入
mysql
密码,我们需要设定一下
.
2>
sudo apt-get install mysql-client
3>
测试安装是否成功:
在终端输入 sudo netstat -tap | grep
mysql
可以看到
mysql
的端口正在监听:
tcp 0 0 localhost:mysql *:* LISTEN 5586/mysqld
4>登录
mysql
mysql
–
uroot
–
p
输入密码,然后进入
mysql
创建hive
用户:
进入 mysql 命令行,创建 hive 用户并赋予所有权限:
mysql -uroot -proot
mysql>create user 'hive' identified by 'hive';
mysql>grant all on *.* TO 'hive'@'%' with grant option;
mysql>flush privileges;
关于
mysql
:
启动mysql服务
sudo service mysql start
设置为开机自启动
sudo chkconfig mysql on
设置root用户登录密码
sudo
/usr/bin/mysqladmin -u root password 'wu123'
登录mysql
以root用户身份登录
mysql -uroot -pwu123
创建hive用户,数据库等
insert into mysql.user(Host,User,Password) values("localhost","hive",password("hive"));
create
database
hive;
grant
all
on
hive.*
to
hive@'%'
identified
by
'hive';
grant
all
on
hive.*
to
hive@'localhost'
identified
by
'hive';
flush
privileges;
退出mysql
exit
验证hive用户
mysql -uhive -phive
(5)
hive-site.xml配置(
hive
的配置文件
)
先
使用Hadoop
来创建相应的文件路径,并且要为它们设定权限:
hdfs dfs -mkdir -p /usr/hive/warehouse
hdfs dfs -mkdir -p /usr/hive/tmp
hdfs dfs -mkdir -p /usr/hive/log
hdfs dfs -chmod g+w /usr/hive/warehouse
hdfs dfs -chmod g+w /usr/hive/tmp
hdfs dfs -chmod g+w /usr/hive/log
Hive
系统会加载两个配置文件一个默认配置文件
“hive-default.xml”
,另一个就是用户自定义文件
“hive-site.xml”
。当
“hive-site.xml”
中的配置参数的值与
“hive-default.xml”
文件中不一致时,以用户自定义的为准。所以我们就把我们不需要的参数都删除掉,只留下上面所示的内容。
/conf
目录下
,
没有这两个文件
,
只有一个
“hive-default.xml.template”,
所以我们要复制两个
“hive-default.xml.template”,
并分别命名为
“hive-default.xml”
和
“hive-site.xml”
cp hive-default.xml.template hive-site.xml
//
或者也可以从其他配置好的
hive
中拷贝一份
hive-site.xml
vi hive-site.xml:
<property>
<name>hive.metastore.
warehouse
.dir</name>
<value>hdfs://
ubuntu1
:9000/usr/hive/warehouse</value>
</property>
<property>
<name>hive.exec.
scratchdir
</name>
<value>hdfs://
ubuntu1
:9000/usr/hive/warehouse</value>
</property>
<property>
<name>hive.querylog.
location
</name>
<value> hdfs://
ubuntu1
:9000/usr/hive/log</value>
</property>
<property>
<name>javax.jdo.option.
ConnectionURL
</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNoExist=true</value>
</property>
//
Hive元数据存储使用的数据库连接
URL
<property>
<name>javax.jdo.option.
ConnectionDriverName
</name>
<value>com.mysql.jdbc.Driver</value>
</property>
//
Hive元数据存储使用的数据库驱动
<property>
<name>javax.jdo.option.
ConnectionUserName
</name>
<value>
root
</value>
</property>
//
Hive元数据存储使用的数据库用户名
<property>
<name>javax.jdo.option.
ConnectionPassword
</name>
<value>
1234567890
</value>
<description>password to use against metastore database</description>
</property>
//
Hive元数据存储使用的数据库密码
在hive
中用
java
来开发与
mysql
进行交互时,需要用到一个关于
mysql
的
connector
,这个可以将
java
语言描述的对
database
进行的操作,转化为
mysql
可以理解的语句。
connector
是一个用
java
语言描述的
jar
文件。而这个
connector
可在官方网站上下载得到。经证实即便
connector
与
mysql
的版本号不一致,也可以实现相应的功能。
mysql-connector-java
-*
.jar
是要
copy
到
hive/lib
目录下面
的。
除此之外, 我们使用设定的用户在数据库中最好手动创建设定的数据库,否则的话启动
hive
时会报错(
jdbc:mysql://localhost:3306/hive
)
:
Unable to open a test connection to the given database. JDBC url = jdbc:mysql://localhost:3306/hive?createDatabaseIfNoExist=true, username = root. Terminating connecti
on pool (set lazyInit to true if you expect to start your database after your app). Original Exception: ------
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
Unknown database 'hive'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
。。。。。。
(6)
修改日志文件存放目录:
cp hive-log4j.properties.template hive-log4j.proprties
vi hive-log4j.properties
hive.log.dir
=
/home/hadoop/Hive/logs
这个是当hive
运行时,相应的日志文档存储到什么地方,可以改为存放在
hdfs
系统中:
hdfs://
ubuntu1
:9000/usr/hive/
log
修改完hive
日志目录后,在启动
hive
后如果报错,可以查看目录下的日志信息来查找错误。
(7)
运行
hive
,直接输入
:
hive
hive>show tables;//
hive>
create table tt(id int,name string)row format delimited
> fields terminated by '\t';
//创建表
tt
在建好表导入数据后,可以浏览与
Hive
相关的目录。在
Hive
的
shell
上使用
dfs
命令可以执行
HDFS
文件的操作:
hive> dfs -ls /usr/hive/warehouse/;
Found 1 items
drwxrwxr-x - hadoop supergroup 0 2015-08-31 14:47 /usr/hive/warehouse/tt
HDFS上该目录是
Hive
的数据仓库目录,每个表对应一个以表名命名的目录,目录下存放导入文件、分区目录、桶目录等数据文件。
默认情况下,使用hive
的
derby
数据库存储的数据文件会存储在
bin/metastore_db/
目录中。
MySQL中保存了
Hive
的元数据信息,包括表的属性、桶信息和分区信息等。查看元数据信息:
mysql> use hive;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_hive |
+---------------------------+
| BUCKETING_COLS |
| CDS |
| COLUMNS_V2 |
| DATABASE_PARAMS |
| DBS |
| FUNCS |
| FUNC_RU |
| GLOBAL_PRIVS |
| PARTITIONS |
| PARTITION_KEYS |
| PARTITION_KEY_VALS |
| PARTITION_PARAMS |
| PART_COL_STATS |
| ROLES |
| SDS |
| SD_PARAMS |
| SEQUENCE_TABLE |
| SERDES |
| SERDE_PARAMS |
| SKEWED_COL_NAMES |
| SKEWED_COL_VALUE_LOC_MAP |
| SKEWED_STRING_LIST |
| SKEWED_STRING_LIST_VALUES |
| SKEWED_VALUES |
| SORT_COLS |
| TABLE_PARAMS |
| TAB_COL_STATS |
| TBLS |
| VERSION |
+---------------------------+
29 rows in set (0.00 sec)
mysql> select * from
TBLS
;
+--------+-------------+-------+------------------+--------+-----------+-------+----------+---------------+--------------------+--------------------+
| TBL_ID | CREATE_TIME | DB_ID | LAST_ACCESS_TIME | OWNER | RETENTION | SD_ID | TBL_NAME | TBL_TYPE | VIEW_EXPANDED_TEXT | VIEW_ORIGINAL_TEXT |
+--------+-------------+-------+------------------+--------+-----------+-------+----------+---------------+--------------------+--------------------+
| 1 | 1441003631 | 1 | 0 | hadoop | 0 | 1 |
tt
| MANAGED_TABLE | NULL | NULL |
+--------+-------------+-------+------------------+--------+-----------+-------+----------+---------------+--------------------+--------------------+
1 row in set (0.00 sec)
Hive
原则上可以安装在集群上的任何一台机器上面,但是考虑到
master
节点的负荷比较大,我们可以
选择一台机器性能较好的datanode
来安装
hive
。
hiveQL:
Hive
CLI
(
hive client,
hive
命令行)
hive
DDL
(hive data
definition
language):
create
Hive
DML
(
Hive Data Manipulation Language
):增删改查
创建含有分区的表
employInfo
:
create table
employInfo
(
id int,
name
STRING,
age int)
partitioned by (
place
STRING) row format delimited fields terminated by '
,
';
注:
row format delimited fields terminated
by 是
HiveQL
特有的,用来指定
数据的分隔方式(字段间)
,
STORED AS TEXTFILE;(此句可以省略,默认存储形式为文本)
新建测试数据
employInfo.txt
:
1,张三
,32,
销售部
2,李四
,33,
开发部
3,王五
,31,
运营部
4,孙六
,30,
运维部
(注意分隔符中英文)
本地系统加载文件数据
接下来将上面的测试数据导入到
hive
中
,
进入到
tb_emp_info.txt
文件所在的目录
,
然后执行
hive
进入到
hive
模式
hive>load data local inpath
‘
employInfo.txt
’
into table
employInfo (无分区表形式)
hive>
load data local inpath '
employInfo.txt
' into table employInfo partition(place='BeiJing');
(若是分区表的话,需要指定导入的分区,这里所有的分区都是
BeiJing
导入数据后,进入到
hdfs
文件系统:
可以看到目录下有个
usr
à
hive
à
warehouse:在这里可以看到新建的表,点击表明可以看到刚上传的文件。
查询数据:
hive> select count(*) from employInfo;
//会自动创建
mapreduce
,然后提交到
hadoop
中去。
Query ID = hadoop_20150905124326_6b9e426c-2b99-474f-92d8-a611ce36929b
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
Job running in-process (local Hadoop)
2015-09-05 12:44:26,104 Stage-1
map
= 0%,
reduce
= 0%
2015-09-05 12:44:27,253 Stage-1 map = 100%, reduce = 0%
2015-09-05 12:44:28,539 Stage-1 map = 100%, reduce = 100%
Ended Job = job_local652702220_0001
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: 234 HDFS Write: 234 SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
5
Time taken: 62.679 seconds, Fetched: 1 row(s)