導讀
最近一個數據分析朋友需要學習 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
直接替換,不需要修改:
<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/namenode
,data/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
打開集羣管理界面:
接着,先關閉所有窗口,以便停止 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 metastore
、 hive --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 啦!