工良出品:包教会,Hadoop、Hive 搭建部署简易教程

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 导读Hadoop、Hive 是什么运行环境Java 环境Mysql下载 Hadoop、Hive 和 驱动安装 Hadoopcore-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xmlhadoop-env.cmd启动 Hadoop安装 Hive配置 Hivehive-env.shhive-site.xml运行 Hive连接到 Hive

导读

最近一个数据分析朋友需要学习 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 复制放到 sbinC:\Windows\System32 中。

接下来需要修改五个配置文件,文件都在 etc\hadoop 目录中。

.xml 文件的配置都是空的:

<configuration>
</configuration>

复制下面的配置直接替换再编辑即可。

core-site.xml

直接替换,不需要修改:

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
  </property>
</configuration>

hdfs-site.xml

复制内容进行替换:

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  <property>
    <name>dfs.namenode.http-address</name>
    <value>localhost:50070</value>
  </property>
  <property>
    <name>dfs.namenode.dir</name>
    <value>/E:/hadoop-3.3.4/data/dfs/namenode</value>
  </property>
  <property>
    <name>dfs.datanode.name.dir</name>
    <value>/E:/hadoop-3.3.4/data/dfs/datanode</value>
  </property>
</configuration>

里面有两个地址需要替换。

首先到 Hadoop 目录下,依次创建 data/dfs/namenodedata/dfs/datanode 目录。

然后替换到上面即可,注意前面有个 / 开头。

俺也不清楚这个为啥要加上 /

实际上好像创建了这些也没用。

笔者根本没有创建这两个目录也可以运行 Hadoop。

mapred-site.xml

直接替换即可。

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
  <property>
    <name>mapred.job.tracker</name>
    <value>hdfs://localhost:9001</value>
  </property>
</configuration>

yarn-site.xml

直接替换即可。

<configuration>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </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

打开集群管理界面:

http://localhost:8088/cluster

接着,先关闭所有窗口,以便停止 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

这个文件要修改的地方太多,而且这个文件有几千行,所以修改的时候需要注意别改错,查找的时候要复制名称直接搜索。

笔者下面给出了 <property> ... </property> 标签,读者替换的时候,只需要替换 <value> ... </value> 中的内容即可,并不需要将整个内容替换过去。

首先在 Hive 目录下创建一个 data 目录。

找到 hive.exec.local.scratchdir,替换目录地址。你需要在 data 目录下新建一个 scratch_dir 目录。

<property>
    <name>hive.exec.local.scratchdir</name>
    <value>E:/apache-hive-3.1.3-bin/data/scratch_dir</value>
    <description>Local scratch space for Hive jobs</description>
  </property>

替换 E:/apache-hive-3.1.3-bin/data/scratch_dir 为实际的目录。

找到 hive.downloaded.resources.dir,替换目录地址。你需要在 data 目录下新建一个 resources_dir 目录。

<property>
    <name>hive.downloaded.resources.dir</name>
    <value>E:/apache-hive-3.1.3-bin/data/resources_dir</value>
    <description>Temporary local directory for added resources in the remote file system.</description>
  </property>

找到 hive.querylog.location,替换目录地址。你需要在 data 目录下新建一个 querylog 目录。

<property>
    <name>hive.querylog.location</name>
    <value>E:/apache-hive-3.1.3-bin/data/querylog</value>
    <description>Location of Hive run time structured log file</description>
  </property>

找到 hive.server2.logging.operation.log.location,替换目录地址。你需要在 data 目录下新建一个 operation_logs 目录。

<property>
    <name>hive.server2.logging.operation.log.location</name>
    <value>E:/apache-hive-3.1.3-bin/data/operation_logs</value>
    <description>Top level directory where operation logs are stored if logging functionality is enabled</description>
  </property>

接着,需要修改 Hive 默认连接的存储元数据的数据库。

找到 javax.jdo.option.ConnectionDriverName,替换其值为 com.mysql.jdbc.Driver,表示使用 Mysql 驱动连接数据库。

<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
  </property>

找到 javax.jdo.option.ConnectionURL,替换其数据库连接字符串:

<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
    <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.ConnectionUserName</name>
    <value>root</value>
    <description>Username to use against metastore database</description>
  </property>

找到 javax.jdo.option.ConnectionPassword,替换值为数据库密码。

<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
    <description>password to use against metastore database</description>
  </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.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.Administrator.groups</name>
    <value>*</value>
</property>

请替换里面的 Administrator 为你当前用户的用户名。

修改后的完整配置:

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
  </property>
  <property>
    <name>hadoop.proxyuser.Administrator.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.Administrator.groups</name>
    <value>*</value>
</property>
</configuration>

然后再点击 start-all.cmd,恢复 Hadoop 服务。

重新执行 hive --service metastorehive --service hiveserver2

接着查看 Hive 目录下的 hive-site.xml,找到 hive.server2.thrift.client.user,里面记录了 hiveserver2 进行登录的用户名和密码,默认都是 anonymous

<property>
    <name>hive.server2.thrift.client.user</name>
    <value>anonymous</value>
    <description>Username to use against thrift client</description>
  </property>
  <property>
    <name>hive.server2.thrift.client.password</name>
    <value>anonymous</value>
    <description>Password to use against thrift client</description>
  </property>

然后配置 DBeaver,在用户名和密码中输入 anonymous

然后点击 ”编辑驱动设置“。

把里面原有的记录都删除掉,然后点击 ”添加文件“,使用 Hive 中最新的驱动。

这个驱动文件在 Hive 的 jdbc 目录中。

添加完成后,测试连接到 Hive。

至此,可以愉快地学习 Hive 啦!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
分布式计算 资源调度 Hadoop
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
65 2
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-13-Hive 启动Hive 修改启动参数命令行启动测试 几句简单的HQL了解Hive
Hadoop-13-Hive 启动Hive 修改启动参数命令行启动测试 几句简单的HQL了解Hive
56 2
|
9天前
|
分布式计算 资源调度 Hadoop
【赵渝强老师】部署Hadoop的本地模式
本文介绍了Hadoop的目录结构及本地模式部署方法,包括解压安装、设置环境变量、配置Hadoop参数等步骤,并通过一个简单的WordCount程序示例,演示了如何在本地模式下运行MapReduce任务。
|
2月前
|
分布式计算 Hadoop Java
Hadoop集群搭建,基于3.3.4hadoop和centos8【图文教程-从零开始搭建Hadoop集群】,常见问题解决
本文是一份详细的Hadoop集群搭建指南,基于Hadoop 3.3.4版本和CentOS 8操作系统。文章内容包括虚拟机创建、网络配置、Java与Hadoop环境搭建、克隆虚拟机、SSH免密登录设置、格式化NameNode、启动Hadoop集群以及通过UI界面查看Hadoop运行状态。同时,还提供了常见问题的解决方案。
Hadoop集群搭建,基于3.3.4hadoop和centos8【图文教程-从零开始搭建Hadoop集群】,常见问题解决
|
1月前
|
SQL 分布式计算 Hadoop
手把手的教你搭建hadoop、hive
手把手的教你搭建hadoop、hive
89 1
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
51 3
|
1月前
|
SQL 分布式计算 Hadoop
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
60 3
|
1月前
|
SQL 分布式计算 Hadoop
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
45 2
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
85 0
|
3月前
|
SQL 分布式计算 Hadoop
centos7通过CDH部署Hadoop
centos7通过CDH部署Hadoop