1. 程式人生 > >centos7 + hadoop 1.2.1基本安裝配置

centos7 + hadoop 1.2.1基本安裝配置

本節所講的hadoop基本安裝配置主要包含三部分內容:

單機

偽分佈

全分佈

本次實驗環境所用的作業系統為centos7,在進行安裝之前,我們首先要做以下準備工作:

1.建立hadoop使用者

為方便操作我們建立一個名為hadoop的使用者來執行程式,這樣可以使得不同使用者之間有明確的許可權區別,同時針對hadoop的配置操作也可以不影響其它使用者的使用。對於一些大的軟體比如MySql,在企業中也常常為它單獨建立一個使用者。

建立使用者的命令是useradd,設定密碼為passwd,此外可能部分系統還需要為使用者建立資料夾,在這裡我們就不詳細說明了。

2.java安裝

由於hadoop本身是由java編寫,因此對於hadoop開發和執行都需要java的支援,對於版本上的要求為java 6或者更新的版本。對於centos7本身,系統上可能已經預裝了java7,它的jdk版本應該為openjdk,路徑為/usr/lib/jvm/java-1.7.0-openjdk,此即為後文中需要配置的JAVA_HOME環境。

對於hadoop而言,使用oracle公司更為廣泛應用的java版本在功能上可能會更穩定一些,因此使用者也可以根據自己的愛好安裝oracle版本的java,在安裝過程中請記錄jdk的路徑,即JAVA_HOME的位置,這個路徑的設定將在後文hadoop的配置檔案中,目的是讓hadoop程式可以找到依賴的java工具。

3.ssh登陸許可權

對於hadoop的偽分佈和全分佈而言,hadoop主控機namenode需要啟動叢集中所有主機的hadoop守護程序,而這個過程是通過ssh登陸實現的。hadoop並沒有提供ssh輸入密碼登陸的形式,因此為了能夠順利登陸每臺機器,需要將所有機器配置為主控機namenode可以無密碼登陸。

ssh無密碼登陸的方式是指namenode生成自己的ssh key:

ssh-keygen -t rsa -P ''  //在後面選擇存放位置時按照預設位置,會存放在使用者目錄的.ssh/路徑下。

生成自己的key之後,將它的public key傳送給叢集中其它的主機。我們將id_dsa.pub中的內容新增到要匿名登陸的節點的.ssh/authorized_key下,然後在理論上就可以無密碼登陸了。對於無密碼登陸本機而言,程式碼可以為:

cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
這時大家可以通過ssh localhost 檢測一下是否需要輸入密碼。對於ubuntu而言,到這裡ssh就配置好了,但是由於centos7更為嚴格的安全措施,還需要修改兩個地方:

1.修改/etc/ssh/sshd_config檔案,將其中以下幾行的註釋去掉

  RSAAuthentication yes
  PubkeyAuthentication yes
  AuthorizedKeysFile      .ssh/authorized_keys

2.確認~/.ssh/authorized_keys的許可權為600

這樣配置之後,ssh的配置就完成了

4.安裝單機hadoop

本文中使用的hadoop版本為1.2.1,雖然hadoop目前最新版本已經為2.6.0,但由於新的功能在本文中並不會用到,因此我們選擇1.2.1版本,下載連結為http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-1.2.1/,在目錄中選擇hadoop-1.2.1.tar.gz

將該資料夾解壓後,放置到自己喜歡的位置,如/usr/lcoal/hadoop資料夾下,注意資料夾的使用者和組保證為hadoop:hadoop。

在hadoop的資料夾中,conf/下面放置了配置檔案,對於單機安裝,我們首先需要更改hadoop-env.sh檔案,以配置hadoop執行的環境變數,這裡只需要將JAVA_HOME環境變數指定到本機的jdk目錄就可以了,如:

export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk

完成之後,我們試著檢視hadoop版,執行/usr/local/hadoop/bin/hadoop version

此時應該得到這樣的提示

Hadoop 1.2.1
........
This command was run using /usr/local/hadoop/hadoop-core-1.2.1.jar

hadoop文件中還附帶了一些例子來供我們測試,我們可以執行WordCount的例子檢測一下安裝是否成功。

我們將conf資料夾下的配置檔案拷貝到當前目錄新建的input資料夾中,作為輸入資料,然後在當前目錄建立output資料夾,執行如下程式碼:

./bin/hadoop jar hadoop-examples-2.4.1.jar grep input output 'dfs[a-z.]+'
執行之後,我們
cat ./output/*
會得到
1  dfsadmin
這意味著在所有的配置檔案中只有一個符合正則表示式的單詞,結果正確。

5 hadoop偽分散式安裝

偽分散式安裝是指在一臺機器上模擬一個小的叢集。當hadoop應用於叢集時,不論是偽分散式還是真正的分散式執行,都需要通過配置檔案對各元件的協同工作進行設定,最重要的幾個配置檔案見下表:

對於偽分散式配置我們需要修改core-site-xml、hdfs-site-xml和mapred-site-xml三個檔案

core-site-xml:

<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
 

配置檔案的格式十分簡單,<name>標籤代表了配置項的名字,<value>項設定的是配置的值,對於core-site-xml檔案我們只需要在其中指定檔案系統的預設名字,並設定了通訊埠號,這裡我們按照官方文件設定為9000。

hdfs-site-xml:

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

對於hdfs-site-xml檔案,我們設定replication值為1,這也是hadoop執行的預設最小值,它限制了hdfs檔案系統的備份方案,詳細內容可以參照文件。

mapred-site-xml:

<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
對於mapred-site-xml檔案,我們在其中設定jobtracker的埠資訊。

對於本文中的實驗,我們這樣配置後就已經滿足執行要求了,我們還會給出一個官方文件的詳細地址,感興趣的讀者可以檢視文件配置其它專案http://hadoop.apache.org/docs/r1.2.1/api/index.html

在配置完成後,我們首先初始化檔案系統,由於hadoop的很多工作是在自帶的HDFS檔案系統上完成的,因此需要將檔案系統初始化之後才能進一步執行計算任務,命令如下

[[email protected] hadoop]$ ./bin/hadoop namenode -format
15/01/14 18:04:15 INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = localhost.localdomain/127.0.0.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 1.2.1
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1503152; compiled by 'mattf' on Mon Jul 22 15:23:09 PDT 2013
STARTUP_MSG:   java = 1.7.0_71
************************************************************/
15/01/14 18:04:15 INFO util.GSet: Computing capacity for map BlocksMap
15/01/14 18:04:15 INFO util.GSet: VM type       = 64-bit
15/01/14 18:04:15 INFO util.GSet: 2.0% max memory = 932184064
15/01/14 18:04:15 INFO util.GSet: capacity      = 2^21 = 2097152 entries
........
15/01/14 18:04:16 INFO common.Storage: Storage directory file:/usr/local/hadoop/hadoop_hadoop/dfs/name has been successfully formatted.
15/01/14 18:04:16 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost.localdomain/127.0.0.1
************************************************************/
在看到successfully formatted之後說明初始化成功了。

然後用如下命令啟動所有節點,可以通過提示資訊得知所有的啟動資訊都寫入了對應的日誌檔案中,如果出現啟動錯誤,則我們可以在日誌中檢視錯誤原因:

[[email protected] hadoop]$ ./bin/start-all.sh
執行之後,我們輸入jps指令,檢視所有的java程序,在正常啟動時,我們可以得到如下結果:
[[email protected] conf]$ jps
18271 JobTracker
18860 Jps
17998 DataNode
17854 NameNode
18431 TaskTracker
18171 SecondaryNameNode

此時可以訪問Web介面http://localhost:50070來檢視Hadoop的資訊。

接下來我們執行命令./bin/hadoop dfs -mkdir input 建立儲存資料的資料夾,然後執行命令./bin/hadoop fs -put ./input/ input 將之前資料夾中的資料移動到新的input資料夾中,然後我們執行字數統計測試樣例:

[[email protected] hadoop]$ ./bin/hadoop jar hadoop-examples-1.2.1.jar wordcount input output
然後在輸出的資訊中可以看到相關資訊
15/01/16 17:41:50 INFO input.FileInputFormat: Total input paths to process : 7
15/01/16 17:41:50 INFO util.NativeCodeLoader: Loaded the native-hadoop library
15/01/16 17:41:50 WARN snappy.LoadSnappy: Snappy native library not loaded
15/01/16 17:41:51 INFO mapred.JobClient: Running job: job_201501161728_0002
15/01/16 17:41:52 INFO mapred.JobClient:  map 0% reduce 0%
15/01/16 17:41:58 INFO mapred.JobClient:  map 28% reduce 0%
15/01/16 17:42:01 INFO mapred.JobClient:  map 57% reduce 0%
15/01/16 17:42:03 INFO mapred.JobClient:  map 85% reduce 0%
15/01/16 17:42:05 INFO mapred.JobClient:  map 100% reduce 0%
15/01/16 17:42:06 INFO mapred.JobClient:  map 100% reduce 28%
15/01/16 17:42:13 INFO mapred.JobClient:  map 100% reduce 100%
15/01/16 17:42:14 INFO mapred.JobClient: Job complete: job_201501161728_0002
15/01/16 17:42:14 INFO mapred.JobClient: Counters: 29
15/01/16 17:42:14 INFO mapred.JobClient:   Job Counters 
15/01/16 17:42:14 INFO mapred.JobClient:     Launched reduce tasks=1
15/01/16 17:42:14 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=19671
15/01/16 17:42:14 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
15/01/16 17:42:14 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
15/01/16 17:42:14 INFO mapred.JobClient:     Launched map tasks=7
15/01/16 17:42:14 INFO mapred.JobClient:     Data-local map tasks=7
15/01/16 17:42:14 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=14965
15/01/16 17:42:14 INFO mapred.JobClient:   File Output Format Counters 
15/01/16 17:42:14 INFO mapred.JobClient:     Bytes Written=6289
15/01/16 17:42:14 INFO mapred.JobClient:   FileSystemCounters
15/01/16 17:42:14 INFO mapred.JobClient:     FILE_BYTES_READ=10153
15/01/16 17:42:14 INFO mapred.JobClient:     HDFS_BYTES_READ=15849
15/01/16 17:42:14 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=466761
15/01/16 17:42:14 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=6289
15/01/16 17:42:14 INFO mapred.JobClient:   File Input Format Counters 
15/01/16 17:42:14 INFO mapred.JobClient:     Bytes Read=14995
15/01/16 17:42:14 INFO mapred.JobClient:   Map-Reduce Framework
15/01/16 17:42:14 INFO mapred.JobClient:     Map output materialized bytes=10189
15/01/16 17:42:14 INFO mapred.JobClient:     Map input records=369
15/01/16 17:42:14 INFO mapred.JobClient:     Reduce shuffle bytes=10189
15/01/16 17:42:14 INFO mapred.JobClient:     Spilled Records=1164
15/01/16 17:42:14 INFO mapred.JobClient:     Map output bytes=20817
15/01/16 17:42:14 INFO mapred.JobClient:     Total committed heap usage (bytes)=1243086848
15/01/16 17:42:14 INFO mapred.JobClient:     CPU time spent (ms)=4540
15/01/16 17:42:14 INFO mapred.JobClient:     Combine input records=1741
15/01/16 17:42:14 INFO mapred.JobClient:     SPLIT_RAW_BYTES=854
15/01/16 17:42:14 INFO mapred.JobClient:     Reduce input records=582
15/01/16 17:42:14 INFO mapred.JobClient:     Reduce input groups=419
15/01/16 17:42:14 INFO mapred.JobClient:     Combine output records=582
15/01/16 17:42:14 INFO mapred.JobClient:     Physical memory (bytes) snapshot=1402548224
15/01/16 17:42:14 INFO mapred.JobClient:     Reduce output records=419
15/01/16 17:42:14 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=7075622912
15/01/16 17:42:14 INFO mapred.JobClient:     Map output records=1741
在計算完成後,大家可以輸入命令./bin/hadoop fs -cat output/* 檢視最終結果。當需要重新執行程式時,請首先將output資料夾刪除。