溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

發(fā)布時間:2021-12-09 14:50:09 來源:億速云 閱讀:180 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析”吧!

環(huán)境準備

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

軟件版本備注
Windows10操作系統(tǒng)
JDK8暫時不要選用大于等于JDK9的版本,因為啟動虛擬機會發(fā)生未知異常
MySQL8.x用于管理Hive的元數(shù)據(jù)
Apache Hadoop3.3.0-
Apache Hive3.1.2-
Apache Hive src1.2.2因為只有1.x版本的Hive源碼提供了.bat啟動腳本,有能力可以自己寫腳本就不用下此源碼包
winutilshadoop-3.3.0HadoopWindows系統(tǒng)下的啟動依賴

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

  • 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正常安裝為系統(tǒng)服務隨系統(tǒng)自啟。解壓hadoop-3.3.0.tar.gz、apache-hive-3.1.2-bin.tar.gz、apache-hive-1.2.2-src.tar.gz和winutils到指定目錄:

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

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

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

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

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

最后再配置一下JAVA_HOME和HADOOP_HOME兩個環(huán)境變量,并且在Path中添加%JAVA_HOME%\bin;和%HADOOP_HOME%\bin:

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

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

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

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

配置和啟動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」(這里要預先創(chuàng)建nameNode和dataNode的數(shù)據(jù)存放目錄,注意一下每個目錄要以/開頭,筆者這里預先在HADOOP_HOME/data創(chuàng)建了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切記不要重復執(zhí)行):

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

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

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

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

&lambda; jps 19408 ResourceManager 16324 NodeManager 14792 Jps 15004 NameNode 2252 DataNode

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

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

通過http://localhost:50070/去查看HDFS的狀態(tài)和文件:

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

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

配置和啟動Hive

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

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

同時需要通過下面的命令創(chuàng)建并為tmp目錄賦予權限:

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

在系統(tǒng)變量中添加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目錄下:

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

創(chuàng)建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

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

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

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

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

屬性名屬性值備注
hive.metastore.warehouse.dir/user/hive/warehouseHive的數(shù)據(jù)存儲目錄,這個是默認值
hive.exec.scratchdir/tmp/hiveHive的臨時數(shù)據(jù)目錄,這個是默認值
javax.jdo.option.ConnectionURLjdbc:mysql://localhost:3306/hive?characterEncoding=UTF-8&amp;serverTimezone=UTCHive元數(shù)據(jù)存放的數(shù)據(jù)庫連接
javax.jdo.option.ConnectionDriverNamecom.mysql.cj.jdbc.DriverHive元數(shù)據(jù)存放的數(shù)據(jù)庫驅動
javax.jdo.option.ConnectionUserNamerootHive元數(shù)據(jù)存放的數(shù)據(jù)庫用戶
javax.jdo.option.ConnectionPasswordrootHive元數(shù)據(jù)存放的數(shù)據(jù)庫密碼
hive.exec.local.scratchdirE:/LittleData/apache-hive-3.1.2-bin/data/scratchDir創(chuàng)建本地目錄$HIVE_HOME/data/scratchDir
hive.downloaded.resources.dirE:/LittleData/apache-hive-3.1.2-bin/data/resourcesDir創(chuàng)建本地目錄$HIVE_HOME/data/resourcesDir
hive.querylog.locationE:/LittleData/apache-hive-3.1.2-bin/data/querylogDir創(chuàng)建本地目錄$HIVE_HOME/data/querylogDir
hive.server2.logging.operation.log.locationE:/LittleData/apache-hive-3.1.2-bin/data/operationDir創(chuàng)建本地目錄$HIVE_HOME/data/operationDir
datanucleus.autoCreateSchematrue可選
datanucleus.autoCreateTablestrue可選
datanucleus.autoCreateColumnstrue可選
hive.metastore.schema.verificationfalse可選

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

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

上面的準備工作做完之后,可以進行Hive的元數(shù)據(jù)庫初始化,在$HIVE_HOME/bin目錄下執(zhí)行下面的腳本:

hive --service schematool -dbType mysql -initSchema

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

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

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

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

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

> hive.cmd

嘗試創(chuàng)建一個表t_test:

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

查看http://localhost:50070/確認t_test表已經創(chuàng)建成功。

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

嘗試執(zhí)行一個寫入語句和查詢語句:

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

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

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

使用JDBC連接Hive

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

屬性名屬性值備注
hive.server2.thrift.min.worker.threads5最小工作線程數(shù),默認值為5
hive.server2.thrift.max.worker.threads500最大工作線程數(shù),默認值為500
hive.server2.thrift.port10000偵聽的TCP端口號,默認值為10000
hive.server2.thrift.bind.host127.0.0.1綁定的主機,默認值為127.0.0.1
hive.execution.enginemr執(zhí)行引擎,默認值為mr

在$HIVE_HOME/bin目錄下執(zhí)行下面的命令可以啟動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項目先掛起該依賴下載的任務(筆者掛起此依賴下載任務洗完澡仍然沒下完,還會出現(xiàn)org.glassfish:javax.el的快照包無法下載的問題,不過不影響正常使用)。最后添加一個單元測試類HiveJdbcTest:

@Slf4j public 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("創(chuàng)建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成功,更新記錄數(shù):{}", update);  // 這里比較神奇,數(shù)據(jù)寫入了,返回的update數(shù)量為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的小版本。

出現(xiàn)找不到Hadoop執(zhí)行文件異常

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

start-all.cmd腳本執(zhí)行時有可能出現(xiàn)找不到批處理腳本的異常。此問題在公司的開發(fā)機出現(xiàn)過,在家用的開發(fā)機沒有重現(xiàn),具體解決方案是在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的命令執(zhí)行時的異常,需要把Hive  1.x的源碼包的bin目錄下的所有.cmd腳本拷貝到$HIVE_HOME/bin對應的目錄下。

文件夾權限問題

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

  • Win + R然后運行gpedit.msc - 計算機設置 - Windows設置 &mdash; 安全設置 - 本地策略 - 用戶權限分配 - 創(chuàng)建符號鏈接 -  添加當前用戶。

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

或者「直接使用管理員賬號或者管理員權限啟動CMD」,然后執(zhí)行對應的腳本啟動Hadoop或者Hive。

SessionNotRunning異常

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

Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析

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

HiveServer2端口沖突

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

數(shù)據(jù)節(jié)點安全模式異常

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

AuthorizationException

常見的是Hive通過JDBC客戶端連接HiveServer2服務時候會出現(xiàn)這個異常,具體是信息是: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是指報錯時候具體的系統(tǒng)用戶名,例如筆者開發(fā)機的系統(tǒng)用戶名為doge

然后重啟Hadoop服務即可。

MapRedTask的權限問題

常見的是Hive通過JDBC客戶端連接HiveServer2服務執(zhí)行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系統(tǒng)中搭建Hadoop和Hive的開發(fā)環(huán)境比較合理,Windows系統(tǒng)的文件路徑和權限問題會導致很多意想不到的問題。本文參考了大量互聯(lián)網資料和Hadoop和Hive的入門書籍,這里就不一一貼出,站在巨人的肩膀上。

感謝各位的閱讀,以上就是“Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析”的內容了,經過本文的學習后,相信大家對Windows10系統(tǒng)下Hadoop和Hive開發(fā)環(huán)境問題分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI