本篇博客和大家一起在本地搭建一个hive环境,并进行一些简单的hive操作。
加入了启动hiveserver2并使用beeline客户端连接的步骤,去掉了直接使用hive cli的部分。
hive允许以类似SQL的语法来操作hadoop中的数据,简单来讲,hive的default数据库对应hadoop的/user/hive/warehouse
目录,这个根目录下的每个文件夹分别对应hive的数据表,表中的数据对应文件夹内的文件中的数据。这些对应关系都作为hive的metadata保存在了hive的metastore中,一般情况下,hive使用mysql数据库作为metastore。
下面开始搭建一个hive环境。
hive依赖hadoop,所以你必须保证本地的hdfs的namenode和datanode都已经启动。关于hadoop环境搭建请参考hadoop环境搭建 。
另外,使用hive之前需要保证hdfs中存在/tmp
和/user/hive/warehouse
这两个目录,并具有GroupWrite权限。可以通过下面的命令来完成
创建文件夹
$ hadoop fs -mkdir /tmp
$ hadoop fs -mkdir /user
$ hadoop fs -mkdir /user/hive
$ hadoop fs -mkdir /user/hive/warehouse
赋权限
hadoop fs -chmod g+w /tmp
hadoop fs -chmod g+w /user/hive/warehouse
hadoop的命令与linux命令极为相似,想详细了解linux权限的话可以参考linux中文件/文件夹的权限
hive需要使用mysql中的一个数据库作为metastore数据库,所以在mysql中新建一个空的数据库来备用,我本地新建的数据库名叫hive。
mysql> create database hive default character set utf8;
mysql> grant all to hive.* to hiveuser@'localhost' identified by hivepassword;
我本地使用的是hive2.1.1版本,下载地址是https://archive.apache.org/dist/hive/hive-2.1.1/apache-hive-2.1.1-bin.tar.gz,如果你想下载其他版本,可以访问https://archive.apache.org/dist/hive/下载你想要的版本。
下载完成后解压,然后进入hive的根目录,查看一下目录结构
$ ls -l
总用量 108K
drwxrwxr-x 9 kite kite 4.0K 11月 30 16:49 ./
drwxr-xr-x 18 kite kite 4.0K 11月 30 17:44 ../
drwxrwxr-x 3 kite kite 4.0K 11月 30 16:49 bin/
drwxrwxr-x 2 kite kite 4.0K 11月 30 17:41 conf/
drwxrwxr-x 4 kite kite 4.0K 11月 30 16:49 examples/
drwxrwxr-x 7 kite kite 4.0K 11月 30 16:49 hcatalog/
drwxrwxr-x 2 kite kite 4.0K 11月 30 16:49 jdbc/
drwxrwxr-x 4 kite kite 12K 11月 30 17:55 lib/
-rw-r--r-- 1 kite kite 29K 11月 29 2016 LICENSE
-rw-r--r-- 1 kite kite 578 11月 29 2016 NOTICE
-rw-r--r-- 1 kite kite 4.1K 11月 29 2016 README.txt
-rw-r--r-- 1 kite kite 19K 11月 30 2016 RELEASE_NOTES.txt
drwxrwxr-x 4 kite kite 4.0K 11月 30 16:49 scripts/
为了方便操作,配置一下hive的环境变量
export HIVE_HOME=/usr/local/bin/apache-hive-2.1.1-bin
export PATH=$HIVE_HOME/bin:$PATH
将HIVE_HOME修改为你本机的目录。
从https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.45.tar.gz下载mysql的驱动,并放入$HIVE_HOME/lib目录下。
在$HIVE_HOME/conf目录下新建一个名叫hive-site.xml的文件,并加入以下配置
<configuration>
<property>
<name>javax.jdo.option.ConnectionURLname>
<value>jdbc:mysql://127.0.0.1:3306/hivevalue>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>hiveuservalue>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>hivepasswordvalue>
property>
<property>
<name>mapreduce.cluster.local.dirname>
<value>/usr/local/bin/hadoop-2.8.1/tmp/mapred/localvalue>
property>
configuration>
上面四个property是mysql metastore的连接配置,需要修改为你本地mysql的连接信息,最后一个运行mapreduce job时需要的,请修改为你本地的一个地址。
上面的信息配置好了以后,就可以初始化hive的metadata了。在初始化之前,mysql中的hive数据库还是空的。使用下面的命令来初始化hive
schematool -dbType mysql -initSchema
schematool
是$HIVE_HOME/bin
目录下的一个命令,由于该目录已经加入了$PATH
中,所以可以直接使用。
直接使用hive cli的话,限制比较多,官方推荐使用hiveserver2+beeline的方式。hiveserver2在$HIVE_HOME/bin
下面,直接运行此命令机能启动
在使用beeline连接hiveserver2时需要配置一下hadoop配置文件中的core-site.xml文件,加入以下内容
<property>
<name>hadoop.proxyuser.<username>.groupsname>
<value>*value>
property>
<property>
<name>hadoop.proxyuser.<username>.hostsname>
<value>*value>
property>
将上面的
替换成你当前linux用户的名字,在terminal中运行whoami
可以查看你自己的名字。
修改后,需要重启hdfs的namenode和datanode。
然后,以上面的名字的身份运行beeline命令
# $HIVE_HOME/bin/beeline
Beeline version 2.3.2 by Apache Hive
beeline>
此时进入了beeline的交互式shell中。然后使用!connect
连接本地的hiveserver2
beeline> !connect jdbc:hive2://127.0.0.1:10000
Connecting to jdbc:hive2://127.0.0.1:10000
Enter username for jdbc:hive2://127.0.0.1:10000:
Enter password for jdbc:hive2://127.0.0.1:10000:
......
Connected to: Apache Hive (version 2.3.2)
Driver: Hive JDBC (version 2.3.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://127.0.0.1:10000>
当提示输入用户名和密码时,直接回车即可。此时显示已经连接上了本地的hiveserver2。
使用下面的命令来新建一张表
0: jdbc:hive2://127.0.0.1:10000> create table testT1 (id int, name string);
查看hive中的表
0: jdbc:hive2://127.0.0.1:10000> show tables;
testt1
查看hadoop中的对应文件夹
kite@kite-ThinkPad:local$ hadoop fs -ls /user/hive/warehouse
Found 1 items
drwxrwxr-x - kite supergroup 0 2017-12-01 10:25 /user/hive/warehouse/testt1
可以看出来,在hdfs的/user/hive/warehouse/
目录下多了一个同名的文件夹来表示这是一个表。
使用下面的命令来向hive写入3条数据
0: jdbc:hive2://127.0.0.1:10000> insert into table testT1 values (1,'foo'),(2,'bar'),(3,'hello');
写入数据之后,接下来使用select语句来查询一下刚刚写入的数据
0: jdbc:hive2://127.0.0.1:10000> select * from testt1;
+------------+--------------+
| testt1.id | testt1.name |
+------------+--------------+
| 1 | foo |
| 2 | bar |
| 3 | hello |
+------------+--------------+
3 rows selected (0.444 seconds)
查看hdfs中的存储
$ hadoop fs -ls /user/hive/warehouse/testt1
Found 1 items
-rwxrwxr-x 1 kite supergroup 20 2017-12-01 10:29 /user/hive/warehouse/testt1/000000_0
hdfs中的/user/hive/warehouse/testt1
目录中多了一个文件,下面看下文件中的内容
$ hadoop fs -cat /user/hive/warehouse/testt1/000000_0
1 foo
2 bar
3 hello
hdfs中文件内容的分隔符并不是tab,我为了方便显示修改成了tab
本篇博客的目的在于快速上手,关于hive的更多细节我会写在以后的博客中。