天天看點

Linux-Ubuntu環境下Hadoop的安裝(單機模式&僞分布式模式)

目錄

基本環境:

Hadoop3.x的安裝

Hadoop單機配置(非分布式)

Hadoop僞分布式配置

  • 基本環境:

VMware下挂載安裝Ubuntu16.0 

jdk1.8

  • Hadoop3.x的安裝

Hadoop 3 可以通過 http://mirror.bit.edu.cn/apache/hadoop/common/ 或 http://mirrors.cnnic.cn/apache/hadoop/common/ 下載下傳,一般選擇下載下傳最新的穩定版本,即下載下傳 “stable” 下的 hadoop-3.x.y.tar.gz 這個格式的檔案,這是已經編譯好的,另一個包含 src 的則是 Hadoop 源代碼,需要進行編譯才可使用。是以建議下載下傳前者。

注意:

1.如果采用的是使用虛拟機方式安裝Ubuntu的使用者,請用虛拟機中的Ubuntu自帶firefox浏覽器通路本指南,再點選下面的位址,才能把hadoop檔案下載下傳虛拟機ubuntu中。

2.如果是Windows系統下的浏覽器下載下傳的或者在windows本地已下載下傳好,由于虛拟機中的Ubuntu無法通路外部Windows系統的檔案,是以需要使用XShell或者SecurityCRT将本地的檔案上傳至Ubuntu中。

下載下傳好後,一般可以直接使用,但是如果網絡不好可能會導緻檔案缺失,官方網站提供的 hadoop-2.x.y.tar.gz.mds 這個檔案,該檔案包含了檢驗值可用于檢查 hadoop-2.x.y.tar.gz 的完整性,否則若檔案發生了損壞或下載下傳不完整,Hadoop 将無法正常運作。(為了友善,我們可以直接在http://163.172.17.199/dist/hadoop/core上找到對應版本的.tar.tz.mds檔案。如下圖)

Linux-Ubuntu環境下Hadoop的安裝(單機模式&僞分布式模式)

進入之後我們可以看到MD5對應有一個序列:

Linux-Ubuntu環境下Hadoop的安裝(單機模式&僞分布式模式)

然後我們再通過指令檢視我們所下載下傳的Hadoop的MD5序列。Hadoop的預設下載下傳位置是在“下載下傳”目錄中(若不是請自行更改tar指令的相應目錄),另外,本人選擇的是 3.2.1 版本,如果你用的不是 3.2.1 版本,則将所有指令中出現的 3.2.1 更改為你所使用的版本。#及後面的内容為注釋

$ cd ~/下載下傳
$ md5sum ./hadoop-3.2.1.tar.gz | tr "a-z" "A-Z"   # 計算md5值,并轉化為大寫,友善比較
           
Linux-Ubuntu環境下Hadoop的安裝(單機模式&僞分布式模式)

對比兩個序列,若兩個字元串相等則檔案沒有損壞,如果不一樣請務必重新下載下傳!

我們選擇将Hadoop安裝到/usr/local中

$ sudo tar -zxf ~/下載下傳/hadoop-2.6.0.tar.gz -C /usr/local    # 解壓到/usr/local中
$ cd /usr/local/
$ sudo mv ./hadoop-2.6.0/ ./hadoop    # 将檔案夾名改為hadoop
$ sudo chown -R hadoop ./hadoop       # 修改檔案權限
           

解壓後即可使用。輸入如下指令來檢查 Hadoop 是否可用,成功則會顯示 Hadoop 版本資訊

$ cd /usr/local/hadoop
$ ./bin/hadoop version
           

Tips:

Linux下的相對路徑與絕對路徑:

請務必注意指令中的相對路徑與絕對路徑,本文後續出現的./bin/...,./etc/... 等包含 ./ 的路徑均為相對路徑,以 /usr/local/hadoop 為目前目錄。例如在 /usr/local/hadoop 目錄中執行 ./bin/hadoop version 等同于執行/usr/local/hadoop/bin/hadoop version。可以将相對路徑改成絕對路徑來執行,但如果你是在主檔案夾 ~ 中執行 ./bin/hadoop version,執行的會是/home/hadoop/bin/hadoop version,這就不是我們所想要的了。

  • Hadoop單機配置(非分布式)

Hadoop 預設模式為非分布式模式(本地模式),無需進行其他配置即可運作。非分布式即單 Java 程序,友善進行調試。現在我們可以執行例子來感受下 Hadoop 的運作。Hadoop 附帶了豐富的例子(運作 ./bin/hadoop.jar  ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar可以看到所有例子),包括 wordcount、terasort、join、grep 等。這裡我們選擇運作 grep 例子,我們将 input 檔案夾中的所有檔案作為輸入,篩選當中符合正規表達式 dfs[a-z.]+ 的單詞并統計出現的次數,最後輸出結果到 output 檔案夾中。

$ cd /usr/local/hadoop
$ mkdir ./input
$ cp ./etc/hadoop/*.xml ./input   # 将配置檔案作為輸入檔案
$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep ./input ./output 'dfs[a-z.]+'
$ cat ./output/*          # 檢視運作結果
           

執行成功後如下所示,輸出了作業的相關資訊,輸出的結果是符合正則的單詞 dfsadmin 出現了1次。

Linux-Ubuntu環境下Hadoop的安裝(單機模式&僞分布式模式)

注意,Hadoop 預設不會覆寫結果檔案,是以再次運作上面執行個體會提示出錯,需要先将 ./output 删除。

  • Hadoop僞分布式配置

Hadoop 可以在單節點上通過僞分布式的方式運作,Hadoop 程序以分離的 Java 程序來運作,節點既作為 NameNode 也作為 DataNode,同時,讀取的是 HDFS 中的檔案。關于NameNode和DataNode的簡單解釋如下:

Linux-Ubuntu環境下Hadoop的安裝(單機模式&僞分布式模式)

HDFS是Hadoop應用用到的一個最主要的分布式存儲系統。一個HDFS叢集主要由一個NameNode和很多個Datanode(通常以機架形式組織)組成:Namenode管理檔案系統的中繼資料,而Datanode存儲了實際的資料。HDFS的體系結構在這裡有詳細的描述。本文檔主要關注使用者以及管理者怎樣和HDFS進行互動。上圖描述了Namenode、Datanode和用戶端之間的基本的互動操作。基本上,用戶端聯系Namenode以擷取檔案的中繼資料或修飾屬性,而真正的檔案I/O操作是直接和Datanode進行互動的。

進入正題:僞分布式的配置步驟如下

Hadoop的配置檔案主要在/usr/local/hadoop/etc/hadoop/目錄下。僞分布式需要修改core-site.xml 和 hdfs-site.xml 兩個配置檔案。

(1)通過指令  gedit ./etc/hadoop/core-site.xml修改core-site.xml

<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>
           

(2)通過指令  gedit ./etc/hadoop/hdfs-site.xml修改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 時會讀取配置檔案),是以如果需要從僞分布式模式切換回非分布式模式,需要删除 core-site.xml 中的配置項。

此外,僞分布式雖然隻需要配置 fs.defaultFS 和 dfs.replication 就可以運作(官方教程如此),不過若沒有配置 hadoop.tmp.dir 參數,則預設使用的臨時目錄為 /tmp/hadoo-hadoop,而這個目錄在重新開機時有可能被系統清理掉,導緻必須重新執行 format 才行。是以我們進行了設定,同時也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否則在接下來的步驟中可能會出錯

配置完成後,執行NameNode格式化

$ ./bin/hdfs namenode -format
           

成功的話會看到如下圖所示:

Linux-Ubuntu環境下Hadoop的安裝(單機模式&amp;僞分布式模式)

可能會出現的問題:

如果在這一步時提示 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。

接着開啟 NameNode 和 DataNode 守護程序。

$ ./sbin/start-dfs.sh  #start-dfs.sh是個完整的可執行檔案,中間沒有空格
           

如出現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”的異常情況,如下圖所示

Linux-Ubuntu環境下Hadoop的安裝(單機模式&amp;僞分布式模式)

這個并不是 ssh 的問題,可通過設定 Hadoop 環境變量來解決。首先按鍵盤的 ctrl + c 中斷啟動,然後在 ~/.bashrc 中,增加如下兩行内容(設定過程與 JAVA_HOME 變量一樣,其中 HADOOP_HOME 為 Hadoop 的安裝目錄):

1.export HADOOP_HOME=/usr/local/hadoop
2.export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
           

儲存後,必須要執行 source ~/.bashrc 使變量設定生效,然後再次執行 ./sbin/start-dfs.sh 啟動 Hadoop。

執行成功後我們通過jps指令檢視是否啟動成功:

Linux-Ubuntu環境下Hadoop的安裝(單機模式&amp;僞分布式模式)

成功啟動後,可以通路 Web 界面 http://localhost:9870 (從Hadoop 3.0開始端口配置發生了變化,使用Hadoop3.0以前版本的讀者通路http://localhost:50070)檢視 NameNode 和 Datanode 資訊,還可以線上檢視 HDFS 中的檔案。如下圖:

Linux-Ubuntu環境下Hadoop的安裝(單機模式&amp;僞分布式模式)

運作Hadoop僞分布式執行個體:

剛才在我們介紹的單機模式的例子中讀取的是本地資料,而僞分布式則是從HDFS上讀取。要使用HDFS我們首先需要在HDFS中建立使用者目錄:

$ ./bin/hdfs dfs -mkdir -p /user/hadoop
           

對于hadoop fs、hadoop dfs、hdfs dfs三個指令的應用範圍:

hadoop fs 适用于操作不同的檔案系統。比如本地檔案系統和HDFS檔案系統
hadoop dfs 隻能适用于操作HDFS檔案系統
hdfs dfs 跟hadoop dfs一樣,隻适用于操作HDFS檔案系統

然後我們将./etc/hadoop中的.xml檔案作為輸入檔案複制到HDFS檔案系統中,就是将本地/usr/local/hadoop/etc/hadoop中的檔案複制到分布式檔案系統/usr/hadoop/input中。我們使用的是 hadoop 使用者,并且已建立相應的使用者目錄 /user/hadoop ,是以在指令中就可以使用相對路徑如 input,其對應的絕對路徑就是 /user/hadoop/input

$ ./bin/hdfs dfs -mkdir input
$ ./bin/hdfs dfs -put ./etc/hadoop/*.xml input
           

複制完成後我們可以通過下面的指令檢視檔案清單資訊:

./bin/hdfs dfs -ls input
           

僞分布式運作 MapReduce 作業的方式跟單機模式一樣的,但差別在于僞分布式讀取的是HDFS中的檔案(可以将單機步驟中建立的本地 input 檔案夾,輸出結果 output 檔案夾都删掉來驗證這一點),而單機模式是讀取的本地的input檔案夾。

$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
           

成功後我們通過下面指令檢視output的内容:(因為我們在配置僞分布式模式的時候修改了兩個.xml配置檔案的内容,是以運作結果和當初單機模式下的結果會不同。)

$ ./bin/hdfs dfs -cat output/*
           
Linux-Ubuntu環境下Hadoop的安裝(單機模式&amp;僞分布式模式)

我們也可以将運作結果取回本地:

$ rm -r ./output    # 先删除本地的 output 檔案夾(如果存在)
$ ./bin/hdfs dfs -get output ./output     # 将 HDFS 上的 output 檔案夾拷貝到本機
$ cat ./output/*
           
Linux-Ubuntu環境下Hadoop的安裝(單機模式&amp;僞分布式模式)

我們可以看到跟從HDFS檔案系統上的内容是一樣的。

Hadoop 運作程式時,輸出目錄不能存在,否則會提示錯誤 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,是以若要再次執行,需要執行如下指令删除 output 檔案夾:

$ ./bin/hdfs dfs -rm -r output    # 删除 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:

$ ./sbin/stop-dfs.sh
           

下次啟動 hadoop 時,無需進行 NameNode 的初始化,隻需要運作./sbin/start-dfs.sh就可以了

安裝Hadoop3.x叢集步驟詳見:

繼續閱讀