hadoop配置與wordcount

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

<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示例程序

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,參考博客得到解決辦法有兩個:

    1. yarn-env.sh中添加(但是我試過不可行,由於本人不會java,因此放棄深究)

      export YARN_RESOURCEMANAGER_OPTS="--add-modules=ALL-SYSTEM"
      export YARN_NODEMANAGER_OPTS="--add-modules=ALL-SYSTEM"
    2. 更換爲jdk8
  • 第一次運行wordcount程序時候將$HADOOP_HOME/etc/hadoop整個文件夾全傳入作爲輸入,結果出錯,根據log發現是內存不足,我的每個虛擬機只開了1G的內存。由此可見這樣的配置只是僅僅能夠作爲熟悉hadoop分佈式環境用途,根本達不到能夠解決問題的條件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章