hadoop集群配置和測試


剛接觸Hadoop三天,今天終於成功用三台機跑起測試,記錄一下。

 

一、准備(所有節點都需要做):

系統:Ubuntu12.04

java版本:JDK1.7(安裝步驟看上一篇文章)

SSH(ubuntu自帶)

確保三台機在同一個ip段,最好設置為靜態IP,重啟后就不用糾結IP變化了

機器分配:一台master,兩台slave

 

我的主機信息是(hosts文件添加如下信息):

192.168.88.123    h1

192.168.88.124    h2

192.168.88.125    h3

其中第一項是內網IP ,第二項是主機名

 

各節點作用:

h1:NameNode、JobTracker

h2:DataNode、TaskTracker

h3:DataNode、TaskTracker

 

安裝SSH:

sudo apt-get install ssh

測試:ssh localhost

輸入當前用戶的密碼回車 沒異常說明安裝成功

 

開啟SSHD服務:

安裝:sudo apt-get install openssh-server

確認是否啟動:

ps  -e | grep  ssh

找到到sshd,有即啟動了。

 

創建Hadoop用戶(名為grid)

adduser grid

信息隨便填,以后運行操作Hadoop都是用這個用戶(注意看清命令行別用了其他用戶)

 

二、配置Hadoop

  1.無密碼登陸

  在Hadoop啟動以后,Namenode是通過SSH(Secure Shell)來啟動和停止各個datanode上的各種守護進程的,這就須要在節點之間執行指令的時候是不須要輸入密碼的形式,故我們須要配置SSH運用無密碼公鑰認證的形式。

 首先設置namenode的ssh為無需密碼的、自動登陸。

  換切到grid用戶

  su grid

  cd

  ssh-keygen -t rsa

  完成后會在grid目錄產生隱藏文件.ssh,通過ls查看,然后

  cp id_rsa.pub authorized_keys

  測試

  ssh h1

  第一次會提示確認繼續連接,打yes,這會把該服務器添加到你的已知主機列表中

  同樣在h2,h3上做以上操作

  最后,如何使各個節點相互訪問不需要密碼,將三個節點的authorized_keys文件里面的內容合成一個文件然后替換掉原來的,替換完畢后可以用 

  ssh XX(XX為主機名)

  相互測試是否連接成功。

 

  2.配置Hadoop文件:

在hadoop/conf目錄下修改文件有hadoop-env.sh,core-site.xml,hdfs-site.xml,mapred-site.xml,master,slaves

hadoop-env.sh

修改JAVA_HOME路徑

export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_45

記得去掉前面的#

 

core-site.xml:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://h1:49000</value>
    </property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/grid/var</value>
</property>
</configuration>

 

1)fs.default.name是NameNode的URI。hdfs://主機名:端口/
2)hadoop.tmp.dir :Hadoop的默認臨時路徑,這個最好配置,如果在新增節點或者其他情況下莫名其妙的DataNode啟動不了,就刪除此文件中的tmp目錄即可。不過如果刪除了NameNode機器的此目錄,那么就需要重新執行NameNode格式化的命令。

 

 

hdfs-site.xml:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
    <name>dfs.name.dir</name>
    <value>/home/grid/name1,/home/grid/name2</value> 
    <description> </description>
</property>
<property>
    <name>dfs.data.dir</name>
    <value>/home/grid/data1,/home/grid/data2</value>
    <description> </description>
</property>
<property>
    <name>dfs.replication</name>
    <value>2</value>
    </property>
</configuration>

 

1) dfs.name.dir是NameNode持久存儲名字空間及事務日志的本地文件系統路徑。 當這個值是一個逗號分割的目錄列表時,nametable數據將會被復制到所有目錄中做冗余備份。
2) dfs.data.dir是DataNode存放塊數據的本地文件系統路徑,逗號分割的列表。 當這個值是逗號分割的目錄列表時,數據將被存儲在所有目錄下,通常分布在不同設備上。
3)dfs.replication是數據需要備份的數量,默認是3,如果此數大於集群的機器數會出錯。

注意:此處的name1、name2、data1、data2目錄不能預先創建,hadoop格式化時會自動創建,如果預先創建反而會有問題。

mapred-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
    <property>
        <name>mapred.job.tracker</name>
        <value>h1:49001</value>    
    </property>
    <property>
        <name>mapred.local.dir</name>
        <value>/home/grid/var</value>
    </property>
</configuration>

 

1)mapred.job.tracker是JobTracker的主機(或者IP)和端口。主機:端口。

 

配置masters和slaves主從結點

master

h1

slaves

h2
h3

 

配置完畢,把配置好的hadoop文件夾拷貝到其他集群的機器上,並保證其他機器的JDK 安裝路徑一致(如果不一致就另外再修改配置文件conf/hadoop-env.sh憋)

scp -r /home/grid/hadoop-0.20.2 grid@h2:/home/grid

scp -r /home/grid/hadoop-0.20.2 grid@h2:/home/grid

 

三、啟動Hadoop

1、先格式化一個新的分布式文件系統

cd

bin/hadoop namenode -format

成功后系統輸出: 

INFO common.Storage: Storagedirectory /opt/hadoop/hadoopfs/name2 has been successfully formatted.

這一行,看到successfully單詞木有,格式化成功。

 

執行完后可以到master機器上看到/home/hadoop//name1和/home/hadoop//name2兩個目錄。

 

2.啟動所有節點

在主節點master上面啟動hadoop,主節點會啟動所有從節點的hadoop

cd

bin/start-all.sh(同時啟動HDFS和Map/Reduce)

輸出:

grid@h1:~/hadoop-0.20.2$ bin/start-all.sh
starting namenode, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-namenode-h1.out
h2: starting datanode, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-datanode-h2.out
h3: starting datanode, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-datanode-h3.out
h1: starting secondarynamenode, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-secondarynamenode-h1.out
starting jobtracker, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-jobtracker-h1.out
h2: starting tasktracker, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-tasktracker-h2.out
h3: starting tasktracker, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-tasktracker-h3.out

 

沒有出現什么Error或Warming之類的就表示運行成功了

運行成功后看看程序是否正常

/usr/lib/jvm/jdk1.7.0_45/bin//jps

可以看到在h1結點上有進程

2928 NameNode
3319 Jps
3105 SecondaryNameNode
3184 JobTracker

很熟悉的字眼我就不多說了,在slaves結點上也檢測下是否正常,會有

TaskTracker,DataNode

 

若沒缺少以上進程即配置有問題。

 

四、測試

建一個目錄,里面建兩個txt文件,用hadoop項目現有的hadoop-0.20.2-examples.jar例子測試txt里面單詞的出現次數。

cd

mkdir input

cd input

echo "hello world" > test1.txt

echo "hello hadoop" > test2.txt

建完文件后,將文件放到HDFS系統的in目錄上

cd ../hadoop-0.20.2

bin/hadoop dfs -put ../input in

 

測試了,運行

bin/hadoop jar hadoop-0.20.2-examples.jar wordcount in out

會出現一系列的運行信息

grid@h1:~/hadoop-0.20.2$ bin/hadoop jar hadoop-0.20.2-examples.jar wordcount in out
13/12/26 14:04:05 INFO input.FileInputFormat: Total input paths to process : 2
13/12/26 14:04:06 INFO mapred.JobClient: Running job: job_201312261337_0006
13/12/26 14:04:07 INFO mapred.JobClient:  map 0% reduce 0%
13/12/26 14:04:14 INFO mapred.JobClient:  map 50% reduce 0%
13/12/26 14:04:15 INFO mapred.JobClient:  map 100% reduce 0%
13/12/26 14:04:23 INFO mapred.JobClient:  map 100% reduce 100%
13/12/26 14:04:25 INFO mapred.JobClient: Job complete: job_201312261337_0006
13/12/26 14:04:25 INFO mapred.JobClient: Counters: 17
13/12/26 14:04:25 INFO mapred.JobClient:   Job Counters 
13/12/26 14:04:25 INFO mapred.JobClient:     Launched reduce tasks=1
13/12/26 14:04:25 INFO mapred.JobClient:     Launched map tasks=2
13/12/26 14:04:25 INFO mapred.JobClient:     Data-local map tasks=2
13/12/26 14:04:25 INFO mapred.JobClient:   FileSystemCounters
13/12/26 14:04:25 INFO mapred.JobClient:     FILE_BYTES_READ=55
13/12/26 14:04:25 INFO mapred.JobClient:     HDFS_BYTES_READ=25
13/12/26 14:04:25 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=180
13/12/26 14:04:25 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=25
13/12/26 14:04:25 INFO mapred.JobClient:   Map-Reduce Framework
13/12/26 14:04:25 INFO mapred.JobClient:     Reduce input groups=3
13/12/26 14:04:25 INFO mapred.JobClient:     Combine output records=4
13/12/26 14:04:25 INFO mapred.JobClient:     Map input records=2
13/12/26 14:04:25 INFO mapred.JobClient:     Reduce shuffle bytes=61
13/12/26 14:04:25 INFO mapred.JobClient:     Reduce output records=3
13/12/26 14:04:25 INFO mapred.JobClient:     Spilled Records=8
13/12/26 14:04:25 INFO mapred.JobClient:     Map output bytes=41
13/12/26 14:04:25 INFO mapred.JobClient:     Combine input records=4
13/12/26 14:04:25 INFO mapred.JobClient:     Map output records=4
13/12/26 14:04:25 INFO mapred.JobClient:     Reduce input records=4

 

  

沒有什么Error或Warming之類的字眼特別是有

map 100% reduce 100%

表示成功運行了,結果可一輸入

bin/hadoop dfs -cat out/*

看到結果

hadoop 1
hello 2
world 1

 

over。。。。。。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM