摘要:谷歌好久解決不了。這個悲傷的故事告訴我們,出了問題先去看看文件定位錯誤,大家的錯誤千奇百怪,谷歌不是萬能的。由此可見這樣的配置只是僅僅能夠作為熟悉分布式環境用途,根本達不到能夠解決問題的條件。
hadoop配置與wordcount
參考的博客大多都是hadoop2.x和低版本的java之上的,配置過程寫出來看似很簡單,看別人的博客也感覺步驟都差不多,但是自己配置時候出了很多問題:datanode啟動不了,網頁不能正常顯示,datanode莫名死掉,resourcemanager啟動不了,nodemanager啟動不了,mapreduce過程中無法連接到slave等等。這個過程看博客看日志折騰了許多時間才弄好,記錄一下。
我是在虛擬機中安裝了四個linux系統作為節點,所需環境相同,因此這里先配置一臺,然后用虛擬機自帶的功能直接復制得到其他三臺。
環境:
Macos , Parallels Desktop
Linux 16.04
Jdk 1.8.0
Hadoop 3.2.0
Java 環境配置在oracle官網下載最新的jdk壓縮文件,復制到安裝的目標目錄下解壓:
sudo tar -zxvf jdk-12_linux-x64_bin.tar.gz sudo rm jdk-12_linux-x64_bin.tar.gz
然后配置環境變量。可以寫在~/.bashrc或者/etc/profile中,其中~/.bashrc是在用戶的主目錄下,只對當前用戶生效,/etc/profile是所有用戶的環境變量。
vim /etc/profile
在末尾加入jdk的環境變量
JAVA_HOME=/usr/lib/jdk-12 CLASSPATH=.:$JAVA_HOME/lib.tools.jar PATH=$JAVA_HOME/bin:$PATH export JAVA_HOME CLASSPATH PATH
之后source /etc/profile生效,java —version檢查是否配置正確。
在后面啟動resourcemanager時候出現了問題,更換成了jdk8,過程同上。
ssh 免密鑰連接接著安裝hadoop,過程放在下一部分,安裝好了之后復制生成三個相同環境的虛擬機。我用的是parallels,相比于其他的比較穩定易用。
接著就是分布式的部分了。純的分布式是很難實現的,hadoop仍然是用一個master來集中式地管理數據節點,master并不存儲數據,而是將數據存儲在datanode之中,這里命名為slave1, slave2, slave3三個datanode,網絡連接均為橋接。因此master需要能免密鑰登陸到slave。添加節點的ip地址(為了在ip變化時候不用再重新配置,可以配置靜態ip):
vim /etc/hosts 192.168.31.26 master 192.168.31.136 slave1 192.168.31.47 slave2 192.168.31.122 slave3 vim /etc/hostname master # 分別配置slave1, slave2, slave3 ping slave1 # 測試
安裝ssh,這個在ubuntu官方的源里面很慢,我試圖換到國內的清華和阿里云等的源,但里面是沒有的,也可能是有不同的版本之類的原因吧。懶得去管的話直接耐心等待就好了。
sudo apt-get install ssh
然后生成公鑰和私鑰:
ssh-keygen -t rsa
這里默認路徑是用戶主目錄下.ssh,一路回車就好了。
使每臺主機能夠免密鑰連接自己:
cp .id_rsa.pub authorized_keys
接著為了使master能夠免密鑰連接到slave,將master的公鑰追加到每個slave的authorized_keys中。
然后測試是否能夠正常連接:
ssh slave1安裝配置hadoop
從官網下載hadoop3.2,解壓到/usr/lib/。并且將讀權限分配給hadoop用戶
cd /usr/lib sudo tar –xzvf hadoop-3.2.0.tar.gz chown –R hadoop:hadoop hadoop #將文件夾"hadoop"讀權限分配給hadoop普通用戶 sudo rm -rf hadoop-3.2.0.tar.gz
添加環境變量:
HADOOP_HOME=/usr/lib/hadoop-3.2.0 PATH=$HADOOP_HOME/bin:$PATH export HADOOP_HOME PATH
接著是最重要的配置hadoop部分,分別配置HADOOP_HOME/etc/hadoop/下的以下幾個文件:
hadoop-env.sh
export JAVA_HOME=/usr/lib/jdk1.8.0_201
core-site.xml
hadoop.tmp.dir /usr/lib/hadoop-3.2.0/tmp Abase for other temporary directories. fs.defaultFS hdfs://master:9000
hdfs-site.xml
dfs.replication 3 dfs.name.dir /usr/lib/hadoop-3.2.0/hdfs/name dfs.data.dir /usr/lib/hadoop-3.2.0/hdfs/data
yarn-site.xml
yarn.resourcemanager.address master:8032 yarn.resourcemanager.scheduler.address master:8030 yarn.resourcemanager.resource-tracker.address master:8031 yarn.resourcemanager.admin.address master:8033 yarn.resourcemanager.webapp.address master:8088 yarn.nodemanager.aux-services mapreduce_shuffle yarn.nodemanager.aux-services.mapreduce.shuffle.class org.apache.hadoop.mapred.ShuffleHandler
mapred-site.xml
mapreduce.framework.name yarn mapred.job.tracker master:49001 mapred.local.dir /usr/lib/hadoop-3.2.0/var yarn.app.mapreduce.am.env HADOOP_MAPRED_HOME=$HADOOP_HOME mapreduce.map.env HADOOP_MAPRED_HOME=$HADOOP_HOME mapreduce.reduce.env HADOOP_MAPRED_HOME=$HADOOP_HOME
workers
slave1 slave2 slave3
這些做完之后就配置完了,接著將整個文件夾復制到其他三臺主機就完成了。
啟動格式化namenode
hdfs namenode -format # 前提是已經將HADOOP_HOME添加到環境變量中
如果看到如上INFO說明這一步成功了。然后運行start腳本:
./sbin/start-all.sh # 在hadoop 2.x版本放在./bin/下面
用jps查看Java進程,master應該包含NameNode, SecondaryNameNode, ResourceManager,slave應該包含DataNode, NodeManager。這里很常見的問題包括沒有datanodes,沒有訪問權限,resouecemanager不能啟動等,一些原因我寫在下面了,大部分都是配置出了問題,查看log文件就能找到原因。
通過master:9870可以網頁查看集群狀態。
WordCount示例程序wordcount可以說是hadoop學習過程中的"hello world",網上可以找到源碼,也可以自己寫,我這里直接用了官方$HADOOP_HOME/share/hadoop/mapreduce/下的示例程序。
先將輸入文件傳到dfs中,我這里是自己寫了兩個含有"hadoop", "hello", "world"單詞的txt文件。然后運行示例程序:
hdfs dfs -mkdir /in hdfs dfs -put ~/Desktop/file*.txt /in hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.0.jar wordcount /in /out
這里可以看到mapreduce分為map和reduce過程。mapreduce分為map,shuffle,reduce過程,先將大任務分到各個節點分別計算,然后shuffle是按照一定的規則將不同的key值分到不同的節點做整合,然后提交任務再reduce整合。查看結果:
hdfs dfs -cat /out/part-r-00000
至此hadoop集群環境才能說是正確安裝了。接下來就是修改wordcount代碼自己玩了,上手后就可以自己寫了。
一些遇到的問題復制配置好的文件夾時候不小心復制錯了,復制成了之前一次配置失敗時候用過的文件夾,導致datanode啟動一直失敗,但是全程無提示。谷歌好久解決不了。后來看datanode的log文件找到錯誤的地方,是core-site.xml出了問題,修改之后重新格式化,啟動成功。
這個悲傷的故事告訴我們,出了問題先去看看log文件定位錯誤,大家的錯誤千奇百怪,谷歌不是萬能的。
沒有resourcemanager和nodemanager:查看日志找到原因為classNoFound(javax.XXXXXXX)。發現是由于java9以上的一些限制,默認禁用了javax的API,參考博客得到解決辦法有兩個:
在yarn-env.sh中添加(但是我試過不可行,由于本人不會java,因此放棄深究)
export YARN_RESOURCEMANAGER_OPTS="--add-modules=ALL-SYSTEM" export YARN_NODEMANAGER_OPTS="--add-modules=ALL-SYSTEM"
更換為jdk8
第一次運行wordcount程序時候將$HADOOP_HOME/etc/hadoop整個文件夾全傳入作為輸入,結果出錯,根據log發現是內存不足,我的每個虛擬機只開了1G的內存。由此可見這樣的配置只是僅僅能夠作為熟悉hadoop分布式環境用途,根本達不到能夠解決問題的條件。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74125.html
摘要:引語這幾周事情比較多,兩周沒寫博客了,這周總算把的實例給運行起來,然后跑了一下官方的例子用于統計文件中單詞出現的次數。接下來是我成功運行實例的記錄。 引語: 這幾周事情比較多,兩周沒寫博客了,這周總算把hadoop的實例給運行起來,然后跑了一下官方的wordcount例子(用于統計文件中單詞出現的次數)。接下來是我成功運行實例的記錄。運行的前提是安裝配置好hadoop(可以參考我上一篇...
摘要:運行程序運行你的根目錄運行這條命令后,會啟動一個來運行程序,而且會在集群上創建一個文件夾,將結果存在其中。 在安裝并配置好Hadoop環境之后,需要運行一個實例來驗證配置是否正確,Hadoop就提供了一個簡單的wordcount程序,其實就是統計單詞個數的程序,這個程序可以算是Hadoop中的Hello World了。 MapReduce 原理 MapReduce其實就是采用分而治之的...
閱讀 881·2023-04-26 03:03
閱讀 2206·2021-10-12 10:12
閱讀 1201·2021-09-24 09:48
閱讀 1645·2021-09-22 15:25
閱讀 3332·2021-09-22 15:15
閱讀 914·2019-08-29 16:21
閱讀 1063·2019-08-28 18:00
閱讀 3423·2019-08-26 13:44