hadoop配置與wordcount

hadoop配置與wordcount

參考的博客大多都是hadoop2.x和低版本的java之上的,配置過程寫出來看似很簡單,看別人的博客也感受步驟都差很少,可是本身配置時候出了不少問題:datanode啓動不了,網頁不能正常顯示,datanode莫名死掉,resourcemanager啓動不了,nodemanager啓動不了,mapreduce過程當中沒法鏈接到slave等等。這個過程看博客看日誌折騰了許多時間才弄好,記錄一下。java

我是在虛擬機中安裝了四個linux系統做爲節點,所需環境相同,所以這裏先配置一臺,而後用虛擬機自帶的功能直接複製獲得其餘三臺。node

環境:linux

  • Macos , Parallels Desktop
  • Linux 16.04
  • Jdk 1.8.0
  • Hadoop 3.2.0

Java 環境配置

在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

ssh 免密鑰鏈接

接着安裝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

安裝配置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分佈式環境用途,根本達不到可以解決問題的條件。
相關文章
相關標籤/搜索