參考的博客大多都是hadoop2.x和低版本的java之上的,配置過程寫出來看似很簡單,看別人的博客也感受步驟都差很少,可是本身配置時候出了不少問題:datanode啓動不了,網頁不能正常顯示,datanode莫名死掉,resourcemanager啓動不了,nodemanager啓動不了,mapreduce過程當中沒法鏈接到slave等等。這個過程看博客看日誌折騰了許多時間才弄好,記錄一下。java
我是在虛擬機中安裝了四個linux系統做爲節點,所需環境相同,所以這裏先配置一臺,而後用虛擬機自帶的功能直接複製獲得其餘三臺。node
環境:linux
在oracle官網下載最新的jdk壓縮文件,複製到安裝的目標目錄下解壓:web
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是全部用戶的環境變量。apache
vim /etc/profile
在末尾加入jdk的環境變量ubuntu
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
檢查是否配置正確。vim
在後面啓動resourcemanager時候出現了問題,更換成了jdk8,過程同上。bash
接着安裝hadoop,過程放在下一部分,安裝好了以後複製生成三個相同環境的虛擬機。我用的是parallels,相比於其餘的比較穩定易用。網絡
接着就是分佈式的部分了。純的分佈式是很難實現的,hadoop仍然是用一個master來集中式地管理數據節點,master並不存儲數據,而是將數據存儲在datanode之中,這裏命名爲slave1, slave2, slave3三個datanode,網絡鏈接均爲橋接。所以master須要能免密鑰登錄到slave。添加節點的ip地址(爲了在ip變化時候不用再從新配置,能夠配置靜態ip):oracle
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
從官網下載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
<configuration> <property> <name>hadoop.tmp.dir</name> <value>/usr/lib/hadoop-3.2.0/tmp</value> <description>Abase for other temporary directories.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> </configuration>
hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.name.dir</name> <value>/usr/lib/hadoop-3.2.0/hdfs/name</value> </property> <property> <name>dfs.data.dir</name> <value>/usr/lib/hadoop-3.2.0/hdfs/data</value> </property> </configuration>
yarn-site.xml
<configuration> <property> <name>yarn.resourcemanager.address</name> <value>master:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master:8088</value> </property> <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>
mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapred.job.tracker</name> <value>master:49001</value> </property> <property> <name>mapred.local.dir</name> <value>/usr/lib/hadoop-3.2.0/var</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value> </property> </configuration>
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能夠說是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代碼本身玩了,上手後就能夠本身寫了。
這個悲傷的故事告訴咱們,出了問題先去看看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"