安装和配置
必要条件
- Java1.7(提示:Hive1.2之后的版本需要Java1.7+,强烈建议迁移至Java1.8)
- Hadoop2.x(优先),1.x(Hive2.0.0之后不支持)这里默认你已经安装好了且启动了
- Linux(我用的CentOS7.5)
- 已经启动的MySQL(我用的5.7)
- mysql-connector-java包(我用的mysql-connector-java-8.0.15.jar)
安装稳定版Hive
首先从Hive官网下载最新稳定版本的Hive。
接下来你需要解压这个tar包(2.3.4是版本号)。
tar -xzvf hive-2.3.4.tar.gz
设置系统环境变量HIVE_HOME,它指向hive的安装目录。
vim /etc/profile
在文件最底部添加
#这里的/usr/local/soft/hive-2.3.4是我的Hive目录,你需要改成你自己的
export HIVE_HOME=/usr/local/soft/hive-2.3.4
export PATH=$PATH:$HIVE_HOME/bin
让上面环境变量立即生效
source /etc/profile
MySQL作为Hive元数据库
- 拷贝mysql-connector-java包到Hive的lib目录下
- 修改hive-site.xml
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.8.88:3306/hivedbnew?createDatabaseIfNotExist=true&serverTimezone=Asia/Shanghai</value>
<!--确保远程MySQL允许远程访问-->
<!--注意多个参数得用转义符&-->
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
<!--注意我用的MySQL5.7,所以ConnectionDriverName是这个-->
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<!--MySQL的用户名-->
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>mysqlpassword</value>
<!--MySQL的密码-->
</property>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
<!--显示表头-->
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
<!--显示库名-->
</property>
</configuration>
- 从Hive2.1开始,我们需要执行如下schematool命令作为初始化步骤
schematool -dbType <db type> -initSchema
这里我们用的是MySQL,所以命令如下
schematool -dbType mysql -initSchema
#看到如下信息说明初始化完成了
Initialization script completed
schemaTool completed
查看MySQL,多了数据库和表,说明真的初始成功了。
运行Hive
启动Hadoop
Hive用到Hadoop,所以你必须有已经启动的Hadoop。
start-dfs.sh
start-yarn.sh
启动Hive CLI
#输入hive启动CLI,但是在Hive3.0后这个CLI去掉了
hive
查询所有数据库
在命令行>符号后面输入命令 show databases; (注意结尾的分号)来展示所有数据库名称。
命令行里>符号前面有(default),这个()里显示的时当前数据库的名称,default数据库是Hive的默认数据库。
show databases;
执行结果如下
hive (default)> show databases;
OK #OK是指这条语句执行成功
database_name #这个是返回结果的表头,因为我设置了总是显示表头,所有显示了这行
default #数据-Hive的默认数据库叫default
pigg #数据-我自己创建的数据库叫pigg
Time taken: 0.008 seconds, Fetched: 2 row(s) #查询的耗时和行数
查询所有表
#查询当前数据库的表
show tables;
执行结果如下
#下面说明当前default库还没有表
hive (default)> show tables;
OK
tab_name
Time taken: 0.021 seconds
创建Hive表
HiveQL和SQL非常类似,下面语句是创建一个叫pokes的表
--创建一个叫pokes的表,它有2列,第一个列是int型,第二列是string型。
CREATE TABLE pokes (foo INT, bar STRING);
执行结果如下
hive (default)> CREATE TABLE pokes (foo INT, bar STRING);
OK
Time taken: 1.014 seconds
查询表,发现已经多了一个叫pokes的表
hive (default)> show tables;
OK
tab_name
pokes
Time taken: 0.023 seconds, Fetched: 1 row(s)
向表插入数据
在Hive目录的examples/files/下有许多测试文件,现在测试把kv1.txt文件的数据导入到Hive的pokes表里。
kv1.txt包含2列数据,两列通过^A分割,共500行数据,内容如下
--从本地文件中加载数据到Hive
LOAD DATA LOCAL INPATH
'/usr/local/soft/hive-2.3.4/examples/files/kv1.txt'
OVERWRITE INTO TABLE pokes;
- 关键词’LOCAL’表示从本地文件系统;
- 没有’LOCAL’表示从HDFS;
- 关键词’OVERWRITE’表示覆盖表中已经存在的数据;
- 没有’OVERWRITE’表示将文件追加到现有数据集中
结果如下,说明语句执行OK
hive (default)> LOAD DATA LOCAL INPATH
> '/usr/local/soft/hive-2.3.4/examples/files/kv1.txt'
> OVERWRITE INTO TABLE pokes;
Loading data to table default.pokes
OK
Time taken: 1.048 seconds
查询Hive表的数据
和普通SQL语法一样,执行select语句
select * from pokes;
结果如下
hive (default)> select * from pokes;
OK
pokes.foo pokes.bar
238 val_238
86 val_86
311 val_311
27 val_27
165 val_165
409 val_409
255 val_255
...后面很多行
如果你成功执行到这一步,就算大概入个门吧,当然上面这些连Hive的皮毛都不称不上。
上面说了CLI方式已经过时了,取而代之的是Beeline,下一篇好好写HiveServer2和Beeline。
尤其HiveServer2是Hadoop生态圈很多工具都会用到,比较重要。