工良出品:包教會,Hadoop、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

image-20230318162003722

接着,添加環境變量 JAVA_HOME

image-20230318162041625

添加 Path 環境變量:E:\Java\jdk1.8.0_202\bin

image-20230318162134001

然後打開 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

image-20230318162930173

點擊 VC_redist.x64.exe 開始安裝。

接着通過國內的華爲鏡像站點加速下載 Mysql:
https://mirrors.huaweicloud.com/mysql/Downloads/MySQL-8.0/

找到 mysql-8.0.24-winx64.msi ,點擊下載。

image-20230318162502871

image-20230318163630863

安裝 Mysql 之後,需要找到安裝位置,然後添加到環境變量 Path 中,如:

C:\Program Files\MySQL\MySQL Server 8.0\bin

image-20230318163203850

接着執行命令初始化 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 數據庫:

image-20230318163733956

創建一個名稱爲 hive 的數據庫,其字符集使用 latin1

image-20230318184336621

下載 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,然後下載其中一種壓縮包即可。

image-20230318171120303

安裝 Hadoop

將壓縮包解壓到目錄中,請不要使用帶空格的目錄,解壓目錄不宜太深,路徑越短越好。

image-20230318171259427

然後添加一個 HADOOP_HOME 環境變量:

image-20230318171442641

然後添加 Path 環境變量:

image-20230318171629165

接着打開 https://github.com/cdarlint/winutils ,下載壓縮包:

image-20230318174955630

Hadoop 要在 Windows 下運行,需要 winutils.exe 、hadoop.dll 、hdfs.dll,這個倉庫中包含了 Hadoop 在 Windows 下運行所需要的一些依賴。

解壓後,找到最新版本的目錄(不一定跟你下載的 Hadoop 版本一致),將 bin 目錄中的所有文件,複製到 Hadoop 的 bin 目錄中。

image-20230318175100670

然後將 hadoop.dll 複製放到 sbinC:\Windows\System32 中。

image-20230318175437654

接下來需要修改五個配置文件,文件都在 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 一次性啓動,不需要再分開啓動。

啓動之後,會有四個窗口。

image-20230318181507167

然後打開文件存儲系統界面:

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

image-20230318181807086

接着配置 Path:

image-20230318181830413

因爲本文使用 Mysql 存儲 Hive 的元數據,因此需要給 Hive 配置 Mysql 的驅動。

將下載的 Mysql java 驅動解壓,找到 mysql-connector-j-8.0.31.jar 文件複製放到 lib 目錄中。

image-20230318182020937

image-20230318181959536

Hive 只做了 Linux 啓動腳本,官方並沒有支持在 Windows 下運行,因此,必須自己添加 Windows Hive 運行腳本和文件。

解壓前面從 https://github.com/HadiFadl/Hive-cmd 下載的文件,將 Hive-cmd-master/bin 目錄下的所有文件和目錄複製到 Hive 中的 bin 目錄下。

image-20230318182333984

image-20230318182447139

配置 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 看到被寫入了很多表:

image-20230318190119752

接着,再啓動一個 powershell 或 cmd 終端,執行 hive 命令。

啓動之後,就可以輸入命令。

image-20230318190316354

你可以執行命令創建數據庫,命令完成後,可以在 Hadoop 中看到變化。

create table userinfo(id int, name string, age int);

然後打開:http://localhost:50070/explorer.html#/user/hive/warehouse

可以看到新建的表。

image-20230318190802193

經過以上步驟,即可將 Hadoop、Hive 跑起來。

連接到 Hive

DBeaver 爲開發人員、數據庫管理員、分析人員和所有需要使用數據庫的人提供免費的多平臺數據庫工具,功能強大,支持 Hive,在本節中將會使用 DBeaver 連接到 Hive 中。

DBeaver 下載地址:https://dbeaver.io/download/

下載完成之後直接安裝即可。

爲了可以使用數據庫連接工具連接到 Hive 執行命令,需要啓動 hiveserver2 服務。

執行命令:

hive --service hiveserver2

打開 webui: http://localhost:10002/

image-20230318211055900

爲了能夠通過通過連接到 Hive 執行命令,需要先到 Hadoop 配置允許其它用戶執行命令。

否則會報這個錯誤:

image-20230318213043739

接着,停止 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

image-20230318213556336

然後點擊 ”編輯驅動設置“。

把裏面原有的記錄都刪除掉,然後點擊 ”添加文件“,使用 Hive 中最新的驅動。

image-20230318213752423

這個驅動文件在 Hive 的 jdbc 目錄中。

image-20230318213848147

添加完成後,測試連接到 Hive。

image-20230318213957183

image-20230318214023720

至此,可以愉快地學習 Hive 啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章