Win10系統下Hadoop和Hive開發環境搭建填坑指南

2020-11-04 熱衷技術的Java程式設計師

前提

筆者目前需要搭建數據平臺,發現了Windows系統下,Hadoop和Hive等組件的安裝和運行存在大量的坑,而本著有坑必填的目標,筆者還是花了幾個晚上的下班時候在多個網際網路參考資料的幫助下完成了Windows10系統下Hadoop和Hive開發環境的搭建。這篇文章記錄了整個搭建過程中的具體步驟、遇到的問題和對應的解決方案。

環境準備

基於筆者的軟體版本潔癖,所有選用的組件都會使用當前(2020-10-30)最高的版本。



下面列舉部分組件對應的下載地址:

  • Apache Hadoop 3.3.0:https://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz
  • Apache Hive 3.1.2:https://mirrors.bfsu.edu.cn/apache/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz
  • Apache Hive 1.2.2 src:https://mirrors.bfsu.edu.cn/apache/hive/hive-1.2.2/apache-hive-1.2.2-src.tar.gz
  • winutils:https://github.com/kontext-tech/winutils(如果下載速度慢,可以先把倉庫導入gitee.com再下載,或者用筆者已經同步好的倉庫https://gitee.com/throwableDoge/winutils)

下載完這一系列軟體之後,MySQL正常安裝為系統服務隨系統自啟。解壓hadoop-3.3.0.tar.gz、apache-hive-3.1.2-bin.tar.gz、apache-hive-1.2.2-src.tar.gz和winutils到指定目錄:



接著把源碼包apache-hive-1.2.2-src.tar.gz解壓後的bin目錄下的文件拷貝到apache-hive-3.1.2-bin的bin目錄中:



然後把winutils中的hadoop-3.3.0\bin目錄下的hadoop.dll和winutils.exe文件拷貝到Hadoop的解壓目錄的bin文件夾下:



最後再配置一下JAVA_HOME和HADOOP_HOME兩個環境變量,並且在Path中添加%JAVA_HOME%\bin;和%HADOOP_HOME%\bin:



❝ 筆者本地安裝的JDK版本為1.8.0.212,理論上任意一個小版本的JDK8都可以。 ❞

接著用命令行測試一下,如果上述步驟沒問題,控制臺輸出如下:



配置和啟動Hadoop

在HADOOP_HOME的etc\hadoop子目錄下,找到並且修改下面的幾個配置文件:

「core-site.xml」(這裡的tmp目錄一定要配置一個非虛擬目錄,別用默認的tmp目錄,否則後面會遇到權限分配失敗的問題)

<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/e:/LittleData/hadoop-3.3.0/data/tmp</value> </property> </configuration>

「hdfs-site.xml」(這裡要預先創建nameNode和dataNode的數據存放目錄,注意一下每個目錄要以/開頭,筆者這裡預先在HADOOP_HOME/data創建了nameNode和dataNode子目錄)

<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.http.address</name> <value>0.0.0.0:50070</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/e:/LittleData/hadoop-3.3.0/data/nameNode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/e:/LittleData/hadoop-3.3.0/data/dataNode</value> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property></configuration>

「mapred-site.xml」

<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</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>

至此,最小化配置基本完成。接著需要格式化namenode並且啟動Hadoop服務。切換至$HADOOP_HOME/bin目錄下,使用CMD輸入命令hdfs namenode -format(格式化namenode切記不要重複執行):



格式化namenode完畢後,切換至$HADOOP_HOME/sbin目錄下,執行start-all.cmd腳本:



這裡命令行會提示start-all.cmd腳本已經過期,建議使用start-dfs.cmd和start-yarn.cmd替代。同理,如果執行stop-all.cmd也會有類似的提示,可以使用stop-dfs.cmd和stop-yarn.cmd替代。start-all.cmd成功執行後,會拉起四個JVM實例(見上圖中的Shell窗口自動新建了四個Tab),此時可以通過jps查看當前的JVM實例:

λ jps19408 ResourceManager16324 NodeManager14792 Jps15004 NameNode2252 DataNode

可見已經啟動了ResourceManager、NodeManager、NameNode和DataNode四個應用,至此Hadoop的單機版已經啟動成功。通過stop-all.cmd命令退出這四個進程。可以通過http://localhost:8088/查看調度任務的狀態:



通過http://localhost:50070/去查看HDFS的狀態和文件:



重啟Hadoop的辦法:先執行stop-all.cmd腳本,再執行start-all.cmd腳本。

配置和啟動Hive

Hive是構築於HDFS上的,所以務必確保Hadoop已經啟動。Hive在HDFS中默認的文件路徑前綴是/user/hive/warehouse,因此可以先通過命令行在HDFS中創建此文件夾:

hdfs dfs -mkdir /user/hive/warehousehdfs dfs -chmod -R 777 /user/hive/warehouse

同時需要通過下面的命令創建並為tmp目錄賦予權限:

hdfs dfs -mkdir /tmphdfs dfs -chmod -R 777 /tmp

在系統變量中添加HIVE_HOME,具體的值配置為E:\LittleData\apache-hive-3.1.2-bin,同時在Path變量添加%HIVE_HOME%\bin;,跟之前配置HADOOP_HOME差不多。下載和拷貝一個mysql-connector-java-8.0.x.jar到$HIVE_HOME/lib目錄下:



創建Hive的配置文件,在$HIVE_HOME/conf目錄下已經有對應的配置文件模板,需要拷貝和重命名,具體如下:

  • $HIVE_HOME/conf/hive-default.xml.template => $HIVE_HOME/conf/hive-site.xml
  • $HIVE_HOME/conf/hive-env.sh.template => $HIVE_HOME/conf/hive-env.sh
  • $HIVE_HOME/conf/hive-exec-log4j.properties.template => $HIVE_HOME/conf/hive-exec-log4j.properties
  • $HIVE_HOME/conf/hive-log4j.properties.template => $HIVE_HOME/conf/hive-log4j.properties



修改hive-env.sh腳本,在尾部添加下面內容:

export HADOOP_HOME=E:\LittleData\hadoop-3.3.0export HIVE_CONF_DIR=E:\LittleData\apache-hive-3.1.2-bin\confexport HIVE_AUX_JARS_PATH=E:\LittleData\apache-hive-3.1.2-bin\lib

修改hive-site.xml文件,主要修改下面的屬性項:



修改完畢之後,在本地的MySQL服務新建一個資料庫hive,編碼和字符集可以選用範圍比較大的utf8mb4(雖然官方建議是latin1,但是字符集往大範圍選沒有影響):



上面的準備工作做完之後,可以進行Hive的元資料庫初始化,在$HIVE_HOME/bin目錄下執行下面的腳本:

hive --service schematool -dbType mysql -initSchema

這裡有個小坑,hive-site.xml文件的第3215行有個神奇的無法識別的符號:



此無法識別符號會導致Hive的命令執行異常,需要去掉。當控制臺輸出Initialization script completed schemaTool completed的時候,說明元資料庫已經初始化完畢:



在$HIVE_HOME/bin目錄下,通過hive.cmd可以連接Hive(關閉控制臺即可退出):

> hive.cmd

嘗試創建一個表t_test:

hive> create table t_test(id INT,name string);hive> show tables;

查看http://localhost:50070/確認t_test表已經創建成功。



嘗試執行一個寫入語句和查詢語句:

hive> insert into t_test(id,name) values(1,'throwx');hive> select * from t_test;



寫用了30多秒,讀用了0.165秒。

使用JDBC連接Hive

HiveServer2是Hive服務端接口模塊,必須啟動此模塊,遠程客戶端才能對Hive進行數據寫入和查詢。目前,此模塊還是基於Thrift RPC實現,它是HiveServer的改進版,支持多客戶端接入和身份驗證等功能。配置文件hive-site.xml中可以修改下面幾個關於HiveServer2的常用屬性:



在$HIVE_HOME/bin目錄下執行下面的命令可以啟動HiveServer2:

hive.cmd --service hiveserver2

客戶端需要引入hadoop-common和hive-jdbc依賴,依賴的版本儘量和對接的Hadoop和Hive版本對應。

<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.3.0</version></dependency><dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>3.1.2</version></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <version>2.3.5.RELEASE</version></dependency>

hadoop-common依賴鏈比較長,會連帶下載大量其他相關依賴,所以可以找個空閒時間在某個Maven項目先掛起該依賴下載的任務(筆者掛起此依賴下載任務洗完澡仍然沒下完,還會出現org.glassfish:javax.el的快照包無法下載的問題,不過不影響正常使用)。最後添加一個單元測試類HiveJdbcTest:

@Slf4jpublic class HiveJdbcTest { private static JdbcTemplate TEMPLATE; private static HikariDataSource DS; @BeforeClass public static void beforeClass() throws Exception { HikariConfig config = new HikariConfig(); config.setDriverClassName("org.apache.hive.jdbc.HiveDriver"); // 這裡筆者修改過hive-site.xml的對應配置,因為埠不是默認的10000// config.setJdbcUrl("jdbc:hive2://127.0.0.1:10091"); config.setJdbcUrl("jdbc:hive2://127.0.0.1:10091/db_test"); DS = new HikariDataSource(config); TEMPLATE = new JdbcTemplate(DS); } @AfterClass public static void afterClass() throws Exception { DS.close(); } @Test public void testCreateDb() throws Exception { TEMPLATE.execute("CREATE DATABASE db_test"); } @Test public void testCreateTable() throws Exception { TEMPLATE.execute("CREATE TABLE IF NOT EXISTS t_student(id INT,name string,major string)"); log.info("創建t_student表成功"); } @Test public void testInsert() throws Exception { int update = TEMPLATE.update("INSERT INTO TABLE t_student(id,name,major) VALUES(?,?,?)", p -> { p.setInt(1, 10087); p.setString(2, "throwable"); p.setString(3, "math"); }); log.info("寫入t_student成功,更新記錄數:{}", update); // 這裡比較神奇,數據寫入了,返回的update數量為0 } @Test public void testSelect() throws Exception { List<Student> result = TEMPLATE.query("SELECT * FROM t_student", rs -> { List<Student> list = new ArrayList<>(); while (rs.next()) { Student student = new Student(); student.setId(rs.getLong("id")); student.setName(rs.getString("name")); student.setMajor(rs.getString("major")); list.add(student); } return list; }); // 列印日誌:查詢t_student成功,結果:[HiveJdbcTest.Student(id=10087, name=throwable, major=math)] log.info("查詢t_student成功,結果:{}", result); } @Data private static class Student { private Long id; private String name; private String major; }}

可能遇到的問題

下面小結一下可能遇到的問題。

Java虛擬機啟動失敗

目前定位到是Hadoop無法使用JDK[9+的任意版本JDK,建議切換為任意JDK8的小版本。

出現找不到Hadoop執行文件異常

確保已經把winutils中的hadoop-3.3.0\bin目錄下的hadoop.dll和winutils.exe文件拷貝到Hadoop的解壓目錄的bin文件夾中。

start-all.cmd腳本執行時有可能出現找不到批處理腳本的異常。此問題在公司的開發機出現過,在家用的開發機沒有重現,具體解決方案是在start-all.cmd腳本的首行加入cd $HADOOP_HOME,如cd E:\LittleData\hadoop-3.3.0。

無法訪問localhost:50070

一般是因為hdfs-site.xml配置遺漏了dfs.http.address配置項,添加:

<property> <name>dfs.http.address</name> <value>0.0.0.0:50070</value></property>

然後調用stop-all.cmd,再調用start-all.cmd重啟Hadoop即可。

Hive連接MySQL異常

注意MySQL的驅動包是否已經正確拷貝到$HIVE_HOME/lib下,並且檢查javax.jdo.option.ConnectionURL等四個屬性是否配置正確。如果都正確,注意是否MySQL的版本存在問題,或者服務的版本與驅動版本不匹配。

Hive找不到批處理文件

一般描述是'xxx.cmd' is not recognized as an internal or external command...,一般是Hive的命令執行時的異常,需要把Hive 1.x的源碼包的bin目錄下的所有.cmd腳本拷貝到$HIVE_HOME/bin對應的目錄下。

文件夾權限問題

常見如CreateSymbolicLink異常,會導致Hive無法使用INSERT或者LOAD命令寫入數據。出現這類問題可以通過下面方式解決:

  • Win + R然後運行gpedit.msc - 計算機設置 - Windows設置 — 安全設置 - 本地策略 - 用戶權限分配 - 創建符號連結 - 添加當前用戶。



或者「直接使用管理員帳號或者管理員權限啟動CMD」,然後執行對應的腳本啟動Hadoop或者Hive。

SessionNotRunning異常

啟動HiveServer2中或者外部客戶端連接HiveServer2時候有可能出現此異常,具體是java.lang.ClassNotFoundException: org.apache.tez.dag.api.TezConfiguration的異常。解決方案是:配置文件hive-site.xml中的hive.execution.engine屬性值由tez修改為mr,然後重啟HiveServer2即可。因為沒有集成tez,重啟後依然會報錯,但是60000ms後會自動重試啟動(一般重試後會啟動成功):



這算是一個遺留問題,但是不影響客戶端正常連接,只是啟動時間會多了60秒。

HiveServer2埠衝突

修改配置文件hive-site.xml中的hive.server2.thrift.port屬性值為未被佔用的埠,重啟HiveServer2即可。

數據節點安全模式異常

一般是出現SafeModeException異常,提示Safe mode is ON。通過命令hdfs dfsadmin -safemode leave解除安全模式即可。

AuthorizationException

常見的是Hive通過JDBC客戶端連接HiveServer2服務時候會出現這個異常,具體是信息是:User: xxx is not allowed to impersonate anonymous。這種情況只需要修改Hadoop的配置文件core-site.xml,添加:

<property> <name>hadoop.proxyuser.xxx.hosts</name> <value>*</value></property><property> <name>hadoop.proxyuser.xxx.groups</name> <value>*</value></property>

❝ 這裡的xxx是指報錯時候具體的系統用戶名,例如筆者開發機的系統用戶名為doge ❞

然後重啟Hadoop服務即可。

MapRedTask的權限問題

常見的是Hive通過JDBC客戶端連接HiveServer2服務執行INSERT或者LOAD操作時候拋出的異常,一般描述是Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. Permission denied: user=anonymous, access=EXECUTE, inode="/tmp/hadoop-yarn":xxxx:supergroup:drwx------。通過命令hdfs dfs -chmod -R 777 /tmp賦予匿名用戶/tmp目錄的讀寫權限即可。

小結

沒什麼事最好還是直接在Linux或者Unix系統中搭建Hadoop和Hive的開發環境比較合理,Windows系統的文件路徑和權限問題會導致很多意想不到的問題。本文參考了大量網際網路資料和Hadoop和Hive的入門書籍,這裡就不一一貼出,站在巨人的肩膀上。

相關焦點

  • 手把手教你在 Windows 平臺搭建本地 Hive 訪問環境
    spark-sql訪問已經被hive創建的表出現的問題簡介學習大數據最痛苦和費時間的就是入門時的環境搭建,對於大數據工程師而言,這個過程必不可少,但對於一些簡單的測試,每次都要打開自己搭建好的虛擬機,未免有些麻煩。對於數據分析師而言,一般只需要使用hive和spark就好,搭建集群實在是一件費力沒有效果的事。
  • 快速搭建CDH-Hadoop-Hive-Zoopkeeper-Sqoop學習環境
    在使用sqoop需要先部署CDH版本的Hadoop&Hive,CDH版本和apache版本的服務不要混用,只開啟CDH或者只開啟apache服務就可以。-0.13.1-cdh5.3.6.tar.gz -C /opt/bigdata/tar -zxvf hadoop-2.5.0-cdh5.3.6.tar.gz -C /opt/bigdata/我們進入hadoop目錄,把share下doc目錄東西刪除掉,這個用處不大配置三個env(hadoop,mapred,yarn)文件export JAVA_HOME
  • 數據倉庫組件:Hive環境搭建和基礎用法
    二、Hive環境安裝1、準備安裝包hive-1.2,依賴Hadoop集群環境,位置放在hop01服務上。hive-env.sh添加內容[root@hop01 conf]# vim hive-env.shexport HADOOP_HOME=/opt/hadoop2.7export HIVE_CONF_DIR=/opt/hive1.2/conf配置內容一個是Hadoop路徑,和hive配置文件路徑。
  • CentOS+Hadoop+MySQL安裝Hive
    大數據02_CentOS7+Hadoop-3-1-2+MySQL5-1-73安裝配置Hive-3-1-2一、安裝環境作業系統:CentOS7Hadoop版本:Hadoop-3.1.2.MySQL版本:MySQL5.1.73HIve版本:Hive-3.1.2在Hive安裝之前,要先安裝好Hadoop,本次實驗是在Hadoop偽分布模式下,具體安裝配置過程可以參考文章
  • HBase基礎環境搭建之Hive和Sqoop安裝
    準備工具解壓縮文件tar -zxvf apache-hive-1.2.1-hbase.tar.gz -C /opt/bigdata/tar -zxvf sqoop-1.4.7.tar.gz -C /opt/bigdata/安裝mysql檢查下是否已下載還有卸載殘留rpm -qa | grep
  • hadoop運行環境搭建-虛擬機安裝與配置(開發重點)
    儘管安裝其實很簡單,網站也有很多虛擬機安裝安裝配置教程,但由於對 Linux 環境不熟悉,書上跟官網上簡略的安裝步驟新手往往 Hold 不住。加上網上不少教程也甚是坑,導致新手摺騰老幾天愣是沒裝好,很是打擊學習熱情。
  • Centos7.5搭建Hadoop環境
    Hadoop今天終於完成了Hadoop單機環境的搭建,是在網上網友的博客幫助下完成的,最後對照了下官方教程,實際上就是官方教程的中文版本,搭建的過程總結起來有如下步驟:第一步,關掉Centos的防火牆吧,不然各種問題配置
  • Hadoop學習探秘(8)在eclispe下怎麼搭建Hadoop開發環境圖文方法
    DKHadoop目錄一、添加插件二、在Windows上安裝Hadoop2.7.51、將hadoop-2.7.5-centos-6.7.tar.gz解壓到Windows上的C盤software目錄中2、配置hadoop的環境變量3、修改Hadoop安裝目錄C:\software\hadoop-2.7.5\etc\hadoop中hadoop-env.cmd4
  • Hadoop分布式環境搭建
    掌握如何配置 Java 環境變量,掌握 Java 基本命令。了解為何需要配置 SSH 免密碼登錄,掌握如何配置 SSH 免密碼登錄。熟練掌握在 Linux 環境下如何構建分布模式下的 Hadoop 集群。實驗內容安裝和配置 CentOS7 的 Liunx 發行版。
  • MIPS環境填坑指南
    0x00前言:今年來IoT安全火熱,2019年公眾號發了一篇《QEMU搭建樹莓派環境》,算是給研究ARM平臺下的漏洞分析、漏洞挖掘以及熟悉ARM指令等打下了基礎。合天網安實驗室也開設了相關實驗課程:《ARM彙編教程》、《ARM漏洞利用技術》ARM在移動平臺,或者說物聯網領域獨領風騷,不過在路由器領域基本還是以MIPS為主,本文的目的就是搭建在軟體層面分析路由器安全(MIPS架構下)的環境。
  • 如何使用docker快速搭建hive環境
    寫在前面想練練Hive SQL,但是沒有hive shell環境。現在只有一臺空的CentOS 7機子,一想要弄jdk、hadoop、mysql、hive就頭疼。部署hive使用hive命令行收尾工作安裝docker要用到docker和docker-compose,我們依次來安裝
  • 好程式設計師大數據分享Hadoop2.X的環境配置與運行官方案例
    一、安裝之前的準備1.1 修改主機名稱進入 Linux 系統查看本機的主機名。通過 hostname 命令查看。為hadoop用戶設置免密碼sudo權限1.5 安裝JDK環境首先先把jdk的安裝包上傳到software 文件夾下,之後對其安裝1)解壓 sudo tar -zvxf jdk-8u181-linux-x64.tar.gz 2)配置JDK環境變量首先獲取JDK的安裝路徑[hadoop
  • HIVE的安裝與配置
    1 Hive安裝部署1.1 環境準備(1)安裝hive的前提是要配置好hadoop集群,啟動hive之前要先啟動hadoop集群。到/opt/module/目錄下面[root@hadoop111 software] mv apache-hive-1.2.1-bin/ hive(4)修改/opt/module/hive/conf 目錄下的 hive-env.sh.template 名稱為 hive-env.sh[root@hadoop111
  • Hive學習筆記,看懂 Hive
    熟悉SQL開發的開發者可以很方便的使用Hive進行開發。數據存儲位置Hive 是建立在 Hadoop 之上的,所有 Hive 的數據都是存儲在 HDFS 中的。而資料庫則可以將數據保存在塊設備或者本地文件系統中。
  • 什麼是hadoop集群搭建?hadoop集群搭建環境部署圖文教程
    由於在本機模式下測試和調試MapReduce程序較為方便,因此,這種模式適宜用在開發階段。單機模式是Hadoop的默認模式。當首次解壓Hadoop的源碼包時,Hadoop無法了解硬體安裝環境,便保守地選擇了最小配置。在這種默認模式下所有3個XML文件均為空。當配置文件為空時,Hadoop會完全運行在本地。
  • Hadoop大數據平臺數據倉庫hive與資料庫hbase集成
    Hive提供了與hbase的集成,能夠在Hive上使用HQL語句進行查詢、插入、Join和Union等複雜查詢HBase表數據功能。可以將ETL數據存入HBase表。配置HBase環境:hive-env.shexport HBASE_HOME=/opt/module/hbase-1.2.0export HIVE_CLASSPATH=$HIVE_CLASSPATH:/opt/module/hbase-1.2.0/lib/*配合ZooKeeper集群:hive-site.xml<property
  • 使用sqoop在MySQL、hadoop、hive間同步數據
    /usr/local/service/sqoop/bin/sqoop-import \--connect jdbc:mysql://$mysqlIP/test --username root -P --table sqoop_test \--hive-import --hive-database db_sqoop_test --hive-table sqoop_test
  • HIVE擴展GIS函數
    Apache Hive是一個建立在hadoop架構之上的數據倉庫。它能夠提供數據的精煉,查詢和分析。下載完源碼,修改最外層的pom.xml,修改hadoop、hive、java版本為生產環境中版本,重新編譯項出spatial-sdk-json-2.1.0.jar和spatial-sdk-hive-2.1.0.jar。
  • win10搭建vue開發環境
    對於現代開發來說,大多使用了前後端分離技術,前端大多用VUE框架,很方便,今天跟大家分享一下win10上搭建vue開發環境。2、下載完之後就可以安裝了,小清不推薦安裝在系統盤如C盤裡面,可以安裝在D盤裡面,安裝完畢後記得配置系統環境變量,將node.js安裝路徑添加進系統環境變量裡面去,除此之外還要添加環境變量然後win+R,輸入cdm ,再輸入node -v如果出現版本號就證明安裝成功。
  • Hadoop框架:集群模式下分布式環境搭建
    一、基礎環境配置1、三臺服務準備三臺Centos7服務,基礎環境從偽分布式環境克隆過來。6、環境清理從偽分布式環境虛擬機克隆三臺Centos7服務,刪除原來Hadoop環境配置的data和log文件夾。