大数据学习之路25-Hive的概念介绍及安装,初体验
Hive就是一种方便的工具,有了它我们不需要亲自去写mapreduce,mapreduce就变成了hive的底层支撑平台,在hive的底层有许多基本sql逻辑单元事先写成了mr模板程序,我们写的sql语句可以通过sql语法解析引擎进行解析。存数据使用HDFS,运行逻辑使用mapreduce,而mapreduce又跑在yarn上。这样hive就可以直接面向使用者。而我们的建表语句就相当于告诉程序我们的输入输出目录在哪里。hive有专门记录用户的表定义信息的元数据库。
那么这个元数据库在哪呢?
我们可以想到之前我们用namenode的时候,我们的元数据是记录在自己的内存中的,用一个庞大的树数据结构,也会序列化到硬盘。但是hive比较偷懒,它不会自己去实现这个记录的功能,它借助数据库实现。所以我们要使用hive就要有hadoop集群还要有mysql。
hive装在哪其实无所谓,它接收sql,变成mapreduce,然后提交给yarn去执行。所以它也是一个可以独立运行的程序。
我们之前已将讲过了mysql5.7的安装,所以这里直接安装hive.
我们这里使用的hive版本是apache-hive-1.2.1-bin.tar.gz的版本,不是最新版,为什么不用最新版,因为最新版的hive已经不适用mapreduce了,它抛弃了mapreduce投入了spark的怀抱。如果我们使用最新版,我们就要有spark集群才能运行。我们这里就先学习一下,等到学习spark的时候再换。
解压缩之后,我们就要配置hive了,hive的配置文件在hive-default.xml中。但是这个是他的默认配置。我们要覆盖它的默认参数,不一定要改它的所有参数。我们可以只改那些我们想改的。所以我们可以新建一个文件。
vi hive-site.xml
我们首先要做的就是告诉他Mysql在哪里。
配置如下:
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?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>123456</value>
</property>
</configuration>
配置完之后,我们就可以使用hive了。那么我们怎么使用hive呢?
hive的目录下的bin下有启动命令,它会启动一个交互式的界面。这个命令是
./hive
如果我们不想这样写,我们可以配置环境变量:
vi /etc/profile
export HIVE_HOME=/root/app/hive-1.2.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin
配置完之后让他生效:
source /etc/profile
之后我们使用直接使用hive命令,还是会报错,错误如下:
Caused by: org.datanucleus.store.rdbms.connectionpool.DatastoreDriverNotFoundException:
The specified datastore driver ("com.mysql.jdbc.Driver") was not found in the CLASSPATH
这是因为我们没有设置mysql驱动的jar包,所以我们就需要将mysql链接驱动的jar包放在hive的lib目录下。
mv mysql-connector-java-5.1.21-bin.jar app/hive-1.2.1/lib/
这样我们就安装好了hive
接下来我们尝试的写几个sql语句,在hive中是不区分大小写的,而且string和varchar一样,其实varchar的本质就是string。
接下来我们尝试插入一条数据:
我们可以看到它这里启动了mapreduce job,生成了一个文件,放在表对应的目录中了。那这个表对应的目录在哪呢?
在HDFS中,我们来看一下:
这就是我们刚才传上去的数据,它使用的分隔符是^A,是看不见的,在linux中要想写出来要先按ctrl+v,然后按ctrl+A。
那么如果我们自己按照这种分隔符的格式写一个文件,然后丢到那个目录下,hive可以查出来吗?
我们可以尝试一下:
接下来我们将其传到hdfs的那个目录下:
hdfs dfs -put a.txt /user/hive/warehouse/t_user/
然后我们用hive进行查询:
我们可以看到,这样也可以查询到。说明我们只要把文件丢进去,它就可以进行分析。