Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。Hive的优点是学习成本低,可以通过类似SQL语句实现快速MapReduce统计,使MapReduce变得更加简单,而不必开发专门的MapReduce应用程序。hive是十分适合数据仓库的统计分析和Windows注册表文件。
1. 安装
安装Hive之前先要安装Hadoop,请参考 Mac Hadoop安装
brew install hive
2. 配置环境变量
export HIVE_HOME=/usr/local/Cellar/hive/3.1.2
export PATH=$HIVE_HOME/bin:$PATH
3. 在命令行中输入hive命令
在命令行中输入hive直接回车,正常情况下会出现hive >
表示成功,但很可能会报错:
- Exception in thread “main” java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V 此问题是应为Hadoop中的Guava-xxx.jar和Hive中的Guava-xxx.jar版本不一致造成的,解决办法就是看Hadoop和Hive中的那个Guava-xxx.jar版本号高,将高版本的覆盖掉低版本的,让Hadoop和Hive的版本完全一致。版本号统一之后重新启动Hadoop。
- Exception in thread “main” java.lang.ClassCastException: java.base/jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to java.base/java.net.URLClassLoader 这个是JDK版本的问题,不要使用jdk1.9+, 解决办法是配置hadoop中使用jdk1.8版本,需要在libexec/etc/hadoop/hadoop-env.sh 中配置JAVA_HOME
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_141.jdk/Contents/Home
配置完需要重启Hadoop。
4. 创建数据库
在MySQL中创建metastore数据库, 可以通过终端、Navicat等数据库客户端来创建一个数据库。
mysql> create database metastore;
# 可以创建一个用户也可以直接使用root账号,此步骤可以省略
mysql> create user 'hive'@'localhost' identified by '123456';
mysql> grant select,insert,update,delete,alter,create,index,references on metastore.* to 'hive'@'localhost';
mysql> flush privileges;
5. 下载MySQL驱动包
打开MySQL官网选择 Platform Independent --> Download -> 解压 -> 将mysql-connector-java-8.0.19.jar放入到/usr/local/Cellar/hive/3.1.2/libexec/lib目录下
6. 配置 hive-site.xml
在/usr/local/Cellar/hive/3.1.2/libexec/conf目录下创建hive-site.xml文件(注意该文件并不存在,需要手动创建)。
<configuration>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/metastore</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<!--mysql用户名-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!--mysql密码-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root123</value>
</property>
<!-- hive用来存储不同阶段的map/reduce的执行计划的目录,同时也存储中间输出结果
,默认是/tmp/<user.name>/hive,我们实际一般会按组区分,然后组内自建一个tmp目录存>储 -->
<property>
<name>hive.exec.local.scratchdir</name>
<value>/tmp/hive</value>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/tmp/hive</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/data/hive/warehouse</value>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/tmp/hive</value>
</property>
</configuration>
7. 初始化metastore数据库
数据库初始化之后会生成很多张表。
cd /usr/local/Cellar/hive/3.1.2/libexec/bin
schematool -initSchema -dbType mysql
8. 运行hive
有些hql是需要启动metastore服务的,所以最好先启动metastore服务。
./hive --service metastore &
在终端中直接输入hive命令
hive> show databases;
OK
default
Time taken: 1.098 seconds, Fetched: 1 row(s)