Spark快速大数据分析——Spark的Hadoop配置(肆)
Spark快速大數據分析——Spark的Hadoop配置(肆)
本文主要參考林子雨老師的hadoop搭建文檔,在此放下鏈接,如需使用hadoop3.1.3版本可進行參考:
廈門大學林子雨老師博客
系列文章目錄
Spark快速大數據分析——Scala語言基礎(壹)。
Spark快速大數據分析——Spark安裝與IDEA 開發(貳)。
Spark快速大數據分析——Spark的WSL環境安裝與Hadoop環境配置(叁)
文章目錄
- Spark快速大數據分析——Spark的Hadoop配置(肆)
- 系列文章目錄
- 軟件環境:
- Hadoop單機配置(非分布式)
- 注意!
- Hadoop偽分布式配置
- Hadoop配置文件說明
- 注意!
- 注意!
- Hadoop無法正常啟動的解決方法
- 運行Hadoop偽分布式實例
- 注意!
軟件環境:
- Hadoop-3.2
- Spark-3.1.3
- JDK 8
- WSL2 Ubuntu20.04
- Windos10 20H2
Hadoop單機配置(非分布式)
Hadoop 默認模式為非分布式模式(本地模式),無需進行其他配置即可運行。非分布式即單 Java 進程,方便進行 調試。
現在我們可以執行例子來測試一下Hadoop 的運行是否正常。
Hadoop 附帶了豐富的例子(運行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar 可以看到所有例子),包括 wordcount、 terasort、join、grep 等。
在此我們選擇運行grep例子,我們將input文件夾的所有文件作為輸入,篩選當中符合正則表達式 dfs[a-z.]+ 的單 詞并統計出現的次數,最后輸出結果到 output 文件夾中。
首先切換到hadoop用戶下:
jszszzy@LAPTOP-74GAR8S9:~$ su hadoop切換對應文件夾下:
hadoop@LAPTOP-74GAR8S9:/home/jszszzy$ cd /usr/local/hadoop創建一個input文件夾,把配置文件拷貝過來,將配置文件作為輸入文件:
hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ mkdir ./input hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ cp ./etc/hadoop/*.xml ./input最后調用運行,注意不要換行!(顯示的可能有換行),注意版本和你本機安裝的版本相對應:
hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ ./bin/hadoop jar./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar grep ./input ./output 'dfs[a-z.]+'如果在這個地方產生報錯:
Error: Could not find or load main class jar..share.hadoop.mapreduce.hadoop請刪除hadoop重新解壓一下,刪除命令如下,解壓命令參考第三篇:
cd /usr/local sudo rm -r hadoop等待運行完成后查看結果:
hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ cat ./output/* 1 dfsadmin完成后結果如下:
顯示符合正則的單詞 dfsadmin 出現了1次。
注意!
注意,Hadoop 默認不會覆蓋結果文件,因此再次運行上面實例會提示出錯,需要先將 ./output 刪除。
刪除命令:
hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ rm -r ./outputHadoop偽分布式配置
Hadoop 可以在單節點上以偽分布式的方式運行,Hadoop 進程以分離的 Java 進程來運行,節點既作為 NameNode 也作為 DataNode,同時,讀取的是 HDFS 中的文件。
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,偽分布式需要修改2個配置文件 core-site.xml 和 hdfssite.xml 。Hadoop的配置文件是 xml 格式,每個配置以聲明 property 的 name 和 value 的方式來實現。
修改配置文件 core-site.xml: vim ./etc/hadoop/core-site.xml ,將當中的
<configuration> </configuration>修改為下面配置:
<configuration><property><name>hadoop.tmp.dir</name><value>file:/usr/local/hadoop/tmp</value><description>Abase for other temporary directories.</description></property><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.name.dir</name><value>file:/usr/local/hadoop/tmp/dfs/name</value></property><property><name>dfs.datanode.data.dir</name><value>file:/usr/local/hadoop/tmp/dfs/data</value></property> </configuration>Hadoop配置文件說明
Hadoop 的運行方式是由配置文件決定的(運行 Hadoop 時會讀取配置文件),因此如果需要從偽分布式模 式切換回非分布式模式,需要刪除 core-site.xml 中的配置項。
此外,偽分布式雖然只需要配置 fs.defaultFS 和 dfs.replication 就可以運行(官方教程如此),不過若沒有 配置 hadoop.tmp.dir 參數,則默認使用的臨時目錄為 /tmp/hadoo-hadoop,而這個目錄在重啟時有可能被系 統清理掉,導致必須重新執行 format 才行。所以我們進行了設置,同時也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否則在接下來的步驟中可能會出錯。
我們繼續回到配置:
配置完成后,執行 NameNode 的格式化,注意這里路徑是什么:
hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ ./bin/hdfs namenode -format成功的話,會看到 “successfully formatted” 的提示,具體返回信息類似如下:
hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ ./bin/hdfs namenode -format WARNING: /usr/local/hadoop/logs does not exist. Creating. 2022-04-14 13:20:01,596 INFO namenode.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode STARTUP_MSG: host = LAPTOP-74GAR8S9.localdomain/127.0.1.1 STARTUP_MSG: args = [-format] STARTUP_MSG: version = 3.2.2 STARTUP_MSG: classpath = /usr/local/hadoop/etc/hadoop:/usr/local/hadoop/share/hadoop/common/lib/netty-3.10.6.Final.注意!
如果在這一步報錯:
Error: JAVA_HOME is not set and could not be found.
則說明之前設置 JAVA_HOME 環境變量那邊就沒設置好,請按教程先設置好 JAVA_HOME 變量,否則后面的過程都是進行不下去 。
如果已經按照前面教程在.bashrc文件中設置了JAVA_HOME。還是出現 Error: JAVA_HOME is not set and could not be found. 的錯誤。
那么,請到hadoop的安裝目錄修改配置文件/usr/local/hadoop/etc/hadoop/hadoop-env.sh”,在里面找到“export JAVA_HOME=${JAVA_HOME}”這行,然后,把它修改成JAVA安裝路徑的具體地址,比 如,“export JAVA_HOME=/usr/lib/jvm/default-java”,然后,再次啟動Hadoop。
設置后仍報錯:
打開環境配置文件:
添加:export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
接著開啟NameNode和DataNode守護進程:
hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ cd /usr/local/hadoop hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ ./sbin/start-dfs.sh輸入命令以后開始運行:
hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ cd /usr/local/hadoop hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ ./sbin/start-dfs.sh如果有報錯如下:
hadoop@LAPTOP-HO0AHQKI:/usr/local/hadoop$ sudo ./sbin/start-dfs.sh WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER. Starting namenodes on [localhost] localhost: root@localhost: Permission denied (publickey). Starting datanodes localhost: root@localhost: Permission denied (publickey). Starting secondary namenodes [LAPTOP-HO0AHQKI] LAPTOP-HO0AHQKI: root@laptop-ho0ahqki: Permission denied (publickey).請使用:
exit退出ssh!
注意!
若出現如下SSH提示,輸入yes即可:
啟動時可能會出現如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable WARN 提示可以忽略,并不會影響正常使用。
啟動 Hadoop 時提示 Could not resolve hostname 如果啟動 Hadoop 時遇到輸出非常多“ssh: Could not resolve hostname xxx”的異常情況,如下圖所示:
這個并不是 ssh 的問題,可通過設置 Hadoop 環境變量來解決。首先按鍵盤的 ctrl + c 中斷啟動,然后在 ~/.bashrc 中,增加如下兩行內容(設置過程與 JAVA_HOME 變量一樣,其中 HADOOP_HOME 為 Hadoop 的安裝目錄):
export HADOOP_HOME=/usr/local/hadoop export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native保存后,務必執行 source ~/.bashrc 使變量設置生效,然后再次執行 ./sbin/start-dfs.sh 啟動 Hadoop。
啟動完成后,可以通過命令 jps 來判斷是否成功啟動,若成功啟動則會列出如下進程: “NameNode”、”DataNode” 和 “SecondaryNameNode”(如果 SecondaryNameNode 沒有啟動,請運行 sbin/stop-dfs.sh 關閉進程,然后再次嘗 試啟動嘗試)。如果沒有 NameNode 或 DataNode ,那就是配置不成功,請仔細檢查之前步驟,或通過查看啟動日志排查原因。
使用后:
Hadoop無法正常啟動的解決方法
- 一般可以查看啟動日志來排查原因
,注意幾點: 啟動時會提示形如 “DBLab-XMU: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoopnamenode-DBLab-XMU.out”,其中 DBLab-XMU 對應你的機器名,但其實啟動日志信息是記錄在 /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.log 中,所以應該查看這個后綴為 .log 的 文件; - 每一次的啟動日志都是追加在日志文件之后,所以得拉到最后面看,對比下記錄的時間就知道了。
- 一般出錯的提示在最后面,通常是寫著 Fatal、Error、Warning 或者 Java Exception 的地方。
- 可以在網上搜索一下出錯信息,看能否找到一些相關的解決方法
此外,若是 DataNode 沒有啟動,可嘗試如下的方法(注意這會刪除 HDFS 中原有的所有數據,如果原有的 數據很重要請不要這樣做):
$ # 針對 DataNode 沒法啟動的解決方法 $ cd /usr/local/hadoop $ ./sbin/stop-dfs.sh # 關閉 $ rm -r ./tmp # 刪除 tmp 文件,注意這會刪除 HDFS 中原有的所有數據 $ ./bin/hdfs namenode -format # 重新格式化 NameNode $ ./sbin/start-dfs.sh # 重啟運行Hadoop偽分布式實例
上面的單機模式,grep 例子讀取的是本地數據,偽分布式讀取的則是 HDFS 上的數據。要使用 HDFS,首先需要在 HDFS 中創建用戶目錄:
hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ ./bin/hdfs dfs -mkdir -p /user/hadoop接著將 ./etc/hadoop 中的 xml 文件作為輸入文件復制到分布式文件系統中,即將 /usr/local/hadoop/etc/hadoop 復制 到分布式文件系統中的 /user/hadoop/input 中。我們使用的是 hadoop 用戶,并且已創建相應的用戶目錄 /user/hadoop ,因此在命令中就可以使用相對路徑如 input,其對應的絕對路徑就是 /user/hadoop/input:
hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ ./bin/hdfs dfs -mkdir -p /user/hadoop/input hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ ./bin/hdfs dfs -put ./etc/hadoop/*.xml input可以使用ls查看一下文件信息:
hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ ./bin/hdfs dfs -ls input Found 9 items -rw-r--r-- 1 hadoop supergroup 9213 2022-04-14 13:37 input/capacity-scheduler.xml -rw-r--r-- 1 hadoop supergroup 1033 2022-04-14 13:37 input/core-site.xml -rw-r--r-- 1 hadoop supergroup 11392 2022-04-14 13:37 input/hadoop-policy.xml -rw-r--r-- 1 hadoop supergroup 1079 2022-04-14 13:37 input/hdfs-site.xml -rw-r--r-- 1 hadoop supergroup 620 2022-04-14 13:37 input/httpfs-site.xml -rw-r--r-- 1 hadoop supergroup 3518 2022-04-14 13:37 input/kms-acls.xml -rw-r--r-- 1 hadoop supergroup 682 2022-04-14 13:37 input/kms-site.xml -rw-r--r-- 1 hadoop supergroup 758 2022-04-14 13:37 input/mapred-site.xml -rw-r--r-- 1 hadoop supergroup 690 2022-04-14 13:37 input/yarn-site.xml偽分布式運行 MapReduce 作業的方式跟單機模式相同,區別在于偽分布式讀取的是HDFS中的文件(可以將單機步 驟中創建的本地 input 文件夾,輸出結果 output 文件夾都刪掉來驗證這一點)。
注意:命令沒有換行:
hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar grep input output 'dfs[a-z.]+'查看運行結果的命令(查看的是位于 HDFS 中的輸出結果):
hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ ./bin/hdfs dfs -cat output/* 1 dfsadmin 1 dfs.replication 1 dfs.namenode.name.dir 1 dfs.datanode.data.dirHadoop 運行程序時,輸出目錄不能存在,否則會提示錯誤 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists”
因此若要再次執行,需要執行如下命令刪除 output 文件夾:
hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ ./bin/hdfs dfs -rm -r output Deleted output注意!
運行程序時,輸出目錄不能存在 運行 Hadoop 程序時,為了防止覆蓋結果,程序指定的輸出目錄(如 output)不能存在,否則會提示錯誤, 因此運行前需要先刪除輸出目錄。在實際開發應用程序時,可考慮在程序中加上如下代碼,能在每次運行時 自動刪除輸出目錄,避免繁瑣的命令行操作:
Configuration conf = new Configuration(); Job job = new Job(conf); /* 刪除輸出目錄 */ Path outputPath = new Path(args[1]); outputPath.getFileSystem(conf).delete(outputPath, true);若要關閉 Hadoop,則運行:
hadoop@LAPTOP-74GAR8S9:/usr/local/hadoop$ ./sbin/stop-dfs.sh Stopping namenodes on [localhost] Stopping datanodes Stopping secondary namenodes [LAPTOP-74GAR8S9]總結
以上是生活随笔為你收集整理的Spark快速大数据分析——Spark的Hadoop配置(肆)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机开启网络共享,一键开启共享_局域网
- 下一篇: kali安装pip