版本选择
- hive1:计算引擎使用的是mr(基于磁盘计算的);
- hive2:计算引擎使用的默认是mr,但是可以更换计算引擎为spark、tez;spark是基于内存计算的,速度快,但是spark程序对内存要求比较高。
一、第一种安装方式
不要使用此安装方式,讲述这种安装方式,仅仅用于测试hive默认使用derby数据库的缺陷。你可以在下面的安装步骤中看到,我连环境变量都没有配置。
1)上传
2)解压
apps是我在家目录下的hadoop用户下(/home/hadoop),已经创建好的一个文件夹。我们将上传好的hive压缩包解压到apps目录下。
代码语言:javascript复制tar -zxvf apache-hive-2.3.6-bin.tar.gz -C apps/
3)初始化元数据库
- 进入到hive解压目录的bin目录下,进行元数据库的初始化,使用的命令如下:
./schematool -dbType derby -initSchema
- 当出现schemaTool completed,表示初始化元数据库成功。
- 初始化完成以后,bin目录下会多出如下两个文件: derby.log:存储一些日志信息; metastore_db:存储元数据信息;
- 执行效果如下:
4)启动
① 先在bin目录下,执行hive这个启动命令。
分析如下:
- 从上图中可以看出,完成元数据的初始化后,第一次是在bin目录下,执行hive的启动命令。
- 接着,执行了一系列的sql命令,还创建了一个新的数据库test,同时在该数据库中创建了一个test01表,最后在该表中插入了一条数据。
- 记住:我在这里已经创建了一个新数据库test。
- 往下看第②步,由于第一次是在bin目录下,执行hive的启动命令,这次我们切换到其它目录,启动hive(切换到bin目录的上一层目录,启动hive)。
- 看看会发生什么事情???
② 在bin目录的上一层目录apache-hive-2.3.6-bin,执行hive这个启动命令。
分析如下:
- 从上图可以看出:我们切换到bin目录的上一级目录下,启动hive。可以看到,当成功出现了"hive>" ,表示hive启动成功。
- 启动hive后,执行sql语句的时候(我执行的是"show databases"),会出现一个错误"元数据实例化错误。(unable to instantiate metadata)"
- 此时,删除derby.1og和metastore_db这两个文件,重新进行初始化操作,当出现“schemaTool compeleted”,证明元数据初始化成功。
- 然后,再次启动hive,成功启动后,再执行“show databases"命令,虽然没有问题,但是你有没有发现结果中少了一个数据库test(我们之前创建过这个test库)。
- 这就是derby数据库的缺陷,具体是什么缺陷,我们下面进行原因分析。
③ hive不使用derby作为默认数据库的原因是什么呢?
- derby属于"单用户模式",主要体现在目录上。
- 在不同的目录下启动hive执行相关sql操作,需要从新进行元数据初始化的工作。上面的演示中,第一次是在bin目录下进行元数据的初始化,接着启动hive的,此时我们在hive中所做的一系列操作,均只属于这一个用户。当我们再次切换到bin目录的上一级目录下,再次启动hive,是可以启动的,但是当我们想要执行sql命令时,却发现会报一个"元数据实例化错误。"。
- 这就说明: derby元数据库只记录了,第一次进行元数据库初始化后,在那个bin目录下所执行的任何sql命令的元数据信息。也就是说你任何时间想要访问你之前创建的库、表信息,只要是在该bin目录下都可以访问,一但不在这个目录下,你也就无法访问到这些库、表信息了。
- 什么是元数据库?什么是元数据信息呢?
- 元数据库就是用于存放元数据信息的数据库。元数据信息就是对表的抽象,像某个表属于哪个库、某个表有哪些字段、某个表属于那种类型等这些表信息,都属于元数据信息,这些信息都是存放在元数据库中的,表中真实数据都是在hdfs上分布式存储的,并不在元数据库中。这里你可能还是不太明白,目前只需要有一个大致印象,即可。元数据库相当于是这些库、表的家庭住址,只有先访问元数据库,你才可以访问这些库和表。而单用户模式,指的是你在哪里执行初始化操作,你就必须在该目录下执行sql操作,才可以访问到元数据库,因为元数据库就是在执行初始化操作的生成的。就是由于这种原因,才导致切换目录后,只能进入hive,却不能访问元数据库,也就不能执行sql操作了。
- 当我们再次切换到其它目录(比如说bin目录的上一级目录)启动hive后,如果我们想要执行相关sql操作,就必须重新执行元数据的初始化,否则就会出现“元数据实例化错误(unable to instantiate metadata)”。但是一旦重新初始化后,第一次初始化后的元数据库中的元数据信息,就会被覆盖掉,也就导致我们之前创建的库、表丢失了家庭地址,访问不到了,这就是上面我们使用"show databases"的时候,发现第一次创建的test库,根本没有。
- 总结如下:
- derby作为hive的默认数据库,也不是不可以,只是说我们在哪里执行的初始化操作,以后就必须在该目录下执行相关的sql操作。想要在任何地方启动hive,并执行sql操作,就必须重新初始化操作,也就是说你每换一个目录执行sql命令,都必须重新进行初始化。但是一旦当你重新进行初始化操作后,以前的元数据库中的元数据信息会被覆盖掉,以前创建的库、表的家庭地址也会因此丢失,那么以前创建的库、表也就访问不到了,像没创建过一样。也就是说,使用derby作为hive的默认数据库,不同用户之间元数据库不能共享,也就导致元数据信息不能共享,只能被当前用户"独享"。
二、第二种安装方式
推荐使用此种安装方式。
1)首先保证你的linux中安装好了mysql
2)上传安装包
3)解压
apps是我在家目录下的hadoop用户下(/home/hadoop),已经创建好的一个文件夹。我们将上传好的hive压缩包解压到apps目录下。
代码语言:javascript复制tar -zxvf apache-hive-2.3.6-bin.tar.gz -C apps/
4)配置环境变量
- 使用如下命令打开配置文件:普通用户修改配置文件,要使用sudo权限;
sudo vim /etc/profile
- 在配置文件中加入如下内容;
export HIVE_HOME=/home/hadoop/apps/apache-hive-2.3.6-bin
export PATH=$JAVA_HOME/IVEbin:$PATH:$CATALINA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin
- 重新加载配置文件,使之生效;
source /etc/profile
- 效果如下
5)修改配置文件
- 配置文件,在hive解压目录下的conf目录下,下面是我linux中的conf目录的全路径
/home/hadoop/apps/apache-hive-2.3.6-bin/conf
- 需要修改的配置文件是hive-site.xml 这里做一个说明:在conf目录下,其实是没有这个hive-site.xml文件的,因此需要我们自己手动创建一个hive-site.xml目录。
- 创建hive-site.xml文件
vim hive-site.xml
- 在hive-site.xml文件中,添加如下配置项
<configuration>
<property>
<!--元数据库的连接地址:这里使用的是mysql数据库-->
<!--这里指定了mysql安装的节点,为什么写localhost,看下面-->
<!--这里还指定了元数据库名,为myhive-->
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/myhive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
<!--如果mysql和hive在同一个服务器节点,那么请更改bigdata112为localhost-->
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description>password to use against metastore database</description>
</property>
</configuration>
6)将mysq1的驱动,添加到hive安装目录的1ib目录下
7)元数据库的初始化
- 命令如下:
schematool -dbType mysql -initSchema
- 效果如下: