导读
最近一个数据分析朋友需要学习 Hive,刚好我也想学,便利用手头的服务器搭建一个学习环境,但是搭建过程中,发现网上的教程很多过时了,而且部署过程中,很多地方走不通,博主也没有给出对应的说明。花了大力气才从各种资料中完成 Hadoop、Mysql、Hive 三者的部署。
因此,本文记录在 Windows 下部署三者的过程以及如何解决部署过程中出现的问题,减少读者折腾消耗的时间。
Hadoop、Hive 是什么
由于 Hadoop、Hive 都是 Java 编写的程序,因此在 Windows 、Linux 下的部署是差不多的,最重要的是配置 Hadoop、Hive 的配置文件,在 Windows、Linux 配置方式是相同的,过程也是一致的。所以在 Windows 学习配置后,在 Linux 下也适用。
本文之所以使用 Windows 部署,是因为笔者在 Linux 下部署屡次失败,前后重新部署了几次,花掉了大量时间,最后使用 Windows 部署,折腾好久之后终于成功。
不愧是 Java,屎环境又配置了一天。
首先有一个疑问,为什么学习 Hive,还要部署 Hadoop、Mysql?
在一开始笔者就不理解,初入门学习,为什么要部署这么多东西呢?
在 Google 很多资料之后,笔者发现这得先了解 Hadoop 和 Hive 是什么玩意儿开始说起。
首先是 Hadoop,看文档对 Hadoop 的描述:
“Hadoop 是一个开源软件框架,用于在分散式运算环境中存储和处理大量数据。它旨在处理大数据,并基于 MapReduce 编程模型,该模型允许并行处理大数据集。”
读者可以从这里了解 Hadoop 到底是啥玩意儿:https://aws.amazon.com/cn/emr/details/hadoop/what-is-hadoop/
也就是说,首先 Hadoop 可以存储大量数据,这不就是数据库么,只不过它的特点是为分布式而生,可以在不同服务器上存储数据。接着, Hadoop 还可以处理大量数据。
总结起来就是,Haddop 具有两大功能:存储、处理大数据。
实现这两大功能,是通过 HDFS 存储大量数据、MapReduce 并行计算数据,两大组件完成的。
HDFS:一个在标准或低端硬件上运行的分布式文件系统。
MapReduce:对数据运行并行计算的框架。这个东西学习成本高。
另外 Hadoop 为了维护集群,还需要管理与监控集群节点和资源使用情况,所以还需要使用 YARN 组件。
在入门阶段,我们并不需要了解 HDFS、MapReduce 有多牛逼,我们只需要知道 HDFS 是用来存储数据的,MapReduce 是用来计算数据的即可。
既然 Hadoop 自己就可以存储、计算数据,那么还要 Hive 这些东西干嘛?
原因是:Hadoop 生态系统包含众多工具和应用程序,可用来帮助收集、存储、处理、分析和管理大数据。
也就是说,基于 Hadoop 的基础能力,Spark、Hive、HBase 等工具可以对 Hadoop 进行扩展,提供对开发者来说更加容易使用的方式,简化使用成本。
Hadoop 没有提供 SQL 支持,而 Hive 提供了通过 SQL 界面使用 Hadoop MapReduce 的方式。所以,我们要安装 Hive,才能通过 SQL 去使用 Hadoop。
在 Hive 中,它提供类似 SQL 的接口来处理/查询数据,称为 HiveQL。Hive 会将 HiveQL 查询转换成在 Hadoop 的 MapReduce 上,完成对数据的处理。但是Hive 可以将数据存储在外部表中,所以可以不使用 HDFS,Hive 还支持其他文件格式,如 ORC、 Avro 文件、文本文件等。
了解完 Hadoop、Hive 之后,再来看看另一个问题,为啥还需要安装 Mysql 呢?
原因是需要存储与 Hive 相关的元数据(列名、数据类型、注释等),Hive 通过 Metastore 组件来实现存储元数据,Metastore 需要一个存储后端才能存储这些元数据,Hive 本身附带了 derby 数据库,但是这个 derby 数据库并不是一个出色的数据库,因此我们可以使用 MySQL 或 PostgreSQL 来存储 Hive 的元数据。
如果只是学习使用,并不需要安装 Mysql 或 PostgreSQL。
运行环境
搞懂 Hadoop、Hive、Mysql 之间的关系之后,我们开始下载各种东西,提前做好准备给 Hadoop、HIve 运行的环境。
Java 环境
首先安装 Java 运行环境,请一定使用 Java8,经过大量踩坑之后,笔者才发现 Java 11 运行 Hive 最后一步会爆炸, Windows 、Linux 都是如此。
下载 Java8 地址:
官网地址: https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html
国内华为镜像站点: https://repo.huaweicloud.com/java/jdk/
点击
jdk-8u202-windows-x64.exe
下载安装包。
下载后,点击 .exe 文件进行安装。
请一定不要安装到有空格的目录,如:C:\Program Files\Java
。
目录一定不能带有空格。
安装目录路径尽可能简单,例如,笔者安装到了 E:\Java
。
接着,添加环境变量 JAVA_HOME
:
添加 Path 环境变量:E:\Java\jdk1.8.0_202\bin
然后打开 cmd,执行 java -version
,确保 Java8 已经被成功安装。
Mysql
大多数教程都是在安装 Hive 时,穿插安装 Mysql,搞得安装的时候莫名其妙的,思路容易断。。。
所以,我们可以提前装好 Mysql,设置好账号密码,配置 Hive 的时候可以一步到位。
安装 Mysql 的方法有很多,不尽相同,读者可以参考别的文章安装 Mysql,可以根据其它资料以最简单的方法安装。
下载 Mysql 安装包不能直接运行,需要先安装 Microsoft Visual C++ Redistributable,点击此链接找到对应 x64 的安装包地址:
https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170
点击 VC_redist.x64.exe 开始安装。
接着通过国内的华为镜像站点加速下载 Mysql:
https://mirrors.huaweicloud.com/mysql/Downloads/MySQL-8.0/
找到
mysql-8.0.24-winx64.msi
,点击下载。
安装 Mysql 之后,需要找到安装位置,然后添加到环境变量 Path 中,如:
C:\Program Files\MySQL\MySQL Server 8.0\bin
接着执行命令初始化 Mysql 服务:
mysqld --install
mysqld --initialize --user=mysql --console
执行命令之后,请注意控制台输出的 Mysql 随机密码!
如果安装出现其他问题,可以试试:
mysqld --initialize --user=mysql --console
sc delete mysql
mysqld -install
执行命令之后,请注意控制台输出的 Mysql 随机密码!
然后执行 net start mysql
命令,启动 Mysql 引擎,让其在后台运行。
然后使用工具连接 Mysql 数据库:
创建一个名称为 hive 的数据库,其字符集使用 latin1
。
下载 Hadoop、Hive 和 驱动
接下来先点击下面的链接把文件下载好,不急于安装。
下面提供一些国内镜像源,方便下载。
下载 hadoop :
https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/stable/
笔者当前版本是 3.3.4。
下载 hive:
https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-3.1.3/
下载 Windows hive 支持
https://github.com/HadiFadl/Hive-cmd
后面再解释为什么要下载这个。
下载 Mysql Java 驱动
https://downloads.mysql.com/archives/c-j/
Hive 连接 Mysql 需要一个 Mysql 驱动,打开页面后,选择 Platform Independent
,然后下载其中一种压缩包即可。
安装 Hadoop
将压缩包解压到目录中,请不要使用带空格的目录,解压目录不宜太深,路径越短越好。
然后添加一个 HADOOP_HOME
环境变量:
然后添加 Path 环境变量:
接着打开 https://github.com/cdarlint/winutils ,下载压缩包:
Hadoop 要在 Windows 下运行,需要 winutils.exe 、hadoop.dll 、hdfs.dll,这个仓库中包含了 Hadoop 在 Windows 下运行所需要的一些依赖。
解压后,找到最新版本的目录(不一定跟你下载的 Hadoop 版本一致),将 bin 目录中的所有文件,复制到 Hadoop 的 bin 目录中。
然后将 hadoop.dll 复制放到 sbin
和 C:\Windows\System32
中。
接下来需要修改五个配置文件,文件都在 etc\hadoop
目录中。
.xml
文件的配置都是空的:
<configuration>
configuration>
复制下面的配置直接替换再编辑即可。
core-site.xml
直接替换,不需要修改:
fs.defaultFS
<value>hdfs://localhost:9000
hdfs-site.xml
复制内容进行替换:
<configuration>
<property>
<name>dfs.replicationname>
<value>1value>
property>
<property>
<name>dfs.namenode.http-addressname>
<value>localhost:50070value>
property>
<property>
<name>dfs.namenode.dirname>
<value>/E:/hadoop-3.3.4/data/dfs/namenodevalue>
property>
<property>
<name>dfs.datanode.name.dirname>
<value>/E:/hadoop-3.3.4/data/dfs/datanodevalue>
property>
configuration>
里面有两个地址需要替换。
首先到 Hadoop 目录下,依次创建 data/dfs/namenode
,data/dfs/datanode
目录。
然后替换到上面即可,注意前面有个 /
开头。
俺也不清楚这个为啥要加上
/
。实际上好像创建了这些也没用。
笔者根本没有创建这两个目录也可以运行 Hadoop。
mapred-site.xml
直接替换即可。
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
<property>
<name>mapred.job.trackername>
<value>hdfs://localhost:9001value>
property>
configuration>
yarn-site.xml
直接替换即可。
<configuration>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.classname>
<value>org.apache.hadoop.mapred.ShuffleHandlervalue>
property>
configuration>
hadoop-env.cmd
找到 set JAVA_HOME=...
,改成:
set JAVA_HOME=E:\Java\jdk1.8.0_202
如果没有记录,就在最后一行加上此命令。注意替换地址为 jdk 安装目录。
有就改,没有就新增。
启动 Hadoop
打开 powershell 或 cmd,执行命令格式化节点:
hdfs namenode -format
然后到 sbin
目录,先点击 start-dfs.cmd,跑起来之后再点击 start-yarn.cmd。
如果跑起来没有报错,那么下次可以使用 start-all.cmd 一次性启动,不需要再分开启动。
启动之后,会有四个窗口。
然后打开文件存储系统界面:
http://localhost:50070/dfshealth.html#tab-overview
打开集群管理界面:
接着,先关闭所有窗口,以便停止 Hadoop。
然后打开 powershell 或 cmd,执行以下命令,以便后面为 Hive 提供数据存储。这一步并不影响 Hadoop,而是为了 Hive 运行而添加的。
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
然后再运行 start-all.cmd,让四个窗口一直挂在后台。
安装 Hive
将 Hive 压缩包解压,然后配置环境变量 HIVE_HOME
。
接着配置 Path:
因为本文使用 Mysql 存储 Hive 的元数据,因此需要给 Hive 配置 Mysql 的驱动。
将下载的 Mysql java 驱动解压,找到 mysql-connector-j-8.0.31.jar 文件复制放到 lib 目录中。
Hive 只做了 Linux 启动脚本,官方并没有支持在 Windows 下运行,因此,必须自己添加 Windows Hive 运行脚本和文件。
解压前面从 https://github.com/HadiFadl/Hive-cmd 下载的文件,将 Hive-cmd-master/bin 目录下的所有文件和目录复制到 Hive 中的 bin 目录下。
配置 Hive
打开 Hive 的 conf 目录。
复制四个模板文件,并修改为新的名称:
如果已经存在新名称的文件,则直接编辑即可。
如果没有找到对应的模板文件,直接创建新的名称文件即可。
原名称 | 新的名称 |
---|---|
hive-default.xml.template | hive-site.xml |
hive-env.sh.template | hive-env.sh |
hive-exec-log4j2.properties.template | hive-exec-log4j2.properties |
hive-log4j2.properties.template | hive-log4j2.properties |
hive-env.sh
添加三行:
HADOOP_HOME=E:\hadoop-3.3.4
export HIVE_CONF_DIR=E:\apache-hive-3.1.3-bin\conf
export HIVE_AUX_JARS_PATH=E:\apache-hive-3.1.3-bin\lib
需要修改 Hive 目录地址。
如果文件不存在,直接创建并添加三行内容即可。
hive-site.xml
这个文件要修改的地方太多,而且这个文件有几千行,所以修改的时候需要注意别改错,查找的时候要复制名称直接搜索。
笔者下面给出了
标签,读者替换的时候,只需要替换
中的内容即可,并不需要将整个内容替换过去。
首先在 Hive 目录下创建一个 data 目录。
找到 hive.exec.local.scratchdir
,替换目录地址。你需要在 data 目录下新建一个 scratch_dir
目录。
<property>
<name>hive.exec.local.scratchdirname>
<value>E:/apache-hive-3.1.3-bin/data/scratch_dirvalue>
<description>Local scratch space for Hive jobsdescription>
property>
替换
E:/apache-hive-3.1.3-bin/data/scratch_dir
为实际的目录。
找到 hive.downloaded.resources.dir
,替换目录地址。你需要在 data 目录下新建一个 resources_dir
目录。
<property>
<name>hive.downloaded.resources.dirname>
<value>E:/apache-hive-3.1.3-bin/data/resources_dirvalue>
<description>Temporary local directory for added resources in the remote file system.description>
property>
找到 hive.querylog.location
,替换目录地址。你需要在 data 目录下新建一个 querylog
目录。
<property>
<name>hive.querylog.locationname>
<value>E:/apache-hive-3.1.3-bin/data/querylogvalue>
<description>Location of Hive run time structured log filedescription>
property>
找到 hive.server2.logging.operation.log.location
,替换目录地址。你需要在 data 目录下新建一个 operation_logs
目录。
<property>
<name>hive.server2.logging.operation.log.locationname>
<value>E:/apache-hive-3.1.3-bin/data/operation_logsvalue>
<description>Top level directory where operation logs are stored if logging functionality is enableddescription>
property>
接着,需要修改 Hive 默认连接的存储元数据的数据库。
找到 javax.jdo.option.ConnectionDriverName
,替换其值为 com.mysql.jdbc.Driver
,表示使用 Mysql 驱动连接数据库。
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
<description>Driver class name for a JDBC metastoredescription>
property>
找到 javax.jdo.option.ConnectionURL
,替换其数据库连接字符串:
<property>
<name>javax.jdo.option.ConnectionURLname>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=truevalue>
<description>
JDBC connect string for a JDBC metastore.
To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
description>
property>
替换为
jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true
。
找到 javax.jdo.option.ConnectionUserName
,替换其中的值为连接数据库的用户名,默认为 root。
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>rootvalue>
<description>Username to use against metastore databasedescription>
property>
找到 javax.jdo.option.ConnectionPassword
,替换值为数据库密码。
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>123456value>
<description>password to use against metastore databasedescription>
property>
运行 Hive
前面提到,Hive 需要存储元数据,其依赖于一个名为 Metastore 的组件。在上一个小节中,我们已经在 hive-site.xml
配置好了 Mysql,现在我们可以先启动 Metastore。
hive --service metastore
顺利的话,过一段时间后,可以在 Mysql 看到被写入了很多表:
接着,再启动一个 powershell 或 cmd 终端,执行 hive
命令。
启动之后,就可以输入命令。
你可以执行命令创建数据库,命令完成后,可以在 Hadoop 中看到变化。
create table userinfo(id int, name string, age int);
然后打开:http://localhost:50070/explorer.html#/user/hive/warehouse
可以看到新建的表。
经过以上步骤,即可将 Hadoop、Hive 跑起来。
连接到 Hive
DBeaver 为开发人员、数据库管理员、分析人员和所有需要使用数据库的人提供免费的多平台数据库工具,功能强大,支持 Hive,在本节中将会使用 DBeaver 连接到 Hive 中。
DBeaver 下载地址:https://dbeaver.io/download/
下载完成之后直接安装即可。
为了可以使用数据库连接工具连接到 Hive 执行命令,需要启动 hiveserver2 服务。
执行命令:
hive --service hiveserver2
打开 webui: http://localhost:10002/
为了能够通过通过连接到 Hive 执行命令,需要先到 Hadoop 配置允许其它用户执行命令。
否则会报这个错误:
接着,停止 Hadoop(关闭四个窗口)、停止 hiveserver2,然后复制下面的配置到 Hadoop 的 etc/hadoop/core.site.xml
中。
<property>
<name>hadoop.proxyuser.Administrator.hostsname>
<value>*value>
property>
<property>
<name>hadoop.proxyuser.Administrator.groupsname>
<value>*value>
property>
请替换里面的 Administrator 为你当前用户的用户名。
修改后的完整配置:
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://localhost:9000value>
property>
<property>
<name>hadoop.proxyuser.Administrator.hostsname>
<value>*value>
property>
<property>
<name>hadoop.proxyuser.Administrator.groupsname>
<value>*value>
property>
configuration>
然后再点击 start-all.cmd,恢复 Hadoop 服务。
重新执行 hive --service metastore
、 hive --service hiveserver2
。
接着查看 Hive 目录下的 hive-site.xml,找到 hive.server2.thrift.client.user
,里面记录了 hiveserver2 进行登录的用户名和密码,默认都是 anonymous
。
<property>
<name>hive.server2.thrift.client.username>
<value>anonymousvalue>
<description>Username to use against thrift clientdescription>
property>
<property>
<name>hive.server2.thrift.client.passwordname>
<value>anonymousvalue>
<description>Password to use against thrift clientdescription>
property>
然后配置 DBeaver,在用户名和密码中输入 anonymous
。
然后点击 ”编辑驱动设置“。
把里面原有的记录都删除掉,然后点击 ”添加文件“,使用 Hive 中最新的驱动。
这个驱动文件在 Hive 的 jdbc 目录中。
添加完成后,测试连接到 Hive。
至此,可以愉快地学习 Hive 啦!