版本选择
- hive1:计算引擎使用的是mr(基于磁盘计算的);
- hive2:计算引擎使用的默认是mr,但是可以更换计算引擎为spark、tez;spark是基于内存计算的,速度快,但是spark程序对内存要求比较高。
一、第一种安装方式
不要使用此安装方式,讲述这种安装方式,仅仅用于测试hive默认使用derby数据库的缺陷。你可以在下面的安装步骤中看到,我连环境变量都没有配置。
1)上传
2)解压
apps是我在家目录下的hadoop用户下(/home/hadoop),已经创建好的一个文件夹。我们将上传好的hive压缩包解压到apps目录下。
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的默认数据库,不同用户之间元数据库不能共享,也就导致元数据信息不能共享,只能被当前用户"独享"。