Hadoop是Apache軟件基金會旗下的一個開源分佈式計算平臺。以Hadoop分佈式文件系統(HDFS,Hadoop Distributed Filesystem)和MapReduce(Google MapReduce的開源實現)爲核心的Hadoop爲用戶提供了系統底層細節透明的分佈式基礎架構。java
對於Hadoop的集羣來說,能夠分紅兩大類角色:Master和Salve。一個HDFS集羣是由一個NameNode和若干個DataNode組成的。其中NameNode做爲主服務器,管理文件系統的命名空間和客戶端對文件系統的訪問操做;集羣中的DataNode管理存儲的數據。MapReduce框架是由一個單獨運行在主節點上的JobTracker和運行在每一個集羣從節點的TaskTracker共同組成的。主節點負責調度構成一個做業的全部任務,這些任務分佈在不一樣的從節點上。主節點監控它們的執行狀況,而且從新執行以前的失敗任務;從節點僅負責由主節點指派的任務。當一個Job被提交時,JobTracker接收到提交做業和配置信息以後,就會將配置信息等分發給從節點,同時調度任務並監控TaskTracker的執行。
從上面的介紹能夠看出,HDFS和MapReduce共同組成了Hadoop分佈式系統體系結構的核心。HDFS在集羣上實現分佈式文件系統,MapReduce在集羣上實現了分佈式計算和任務處理。HDFS在MapReduce任務處理過程當中提供了文件操做和存儲等支持,MapReduce在HDFS的基礎上實現了任務的分發、跟蹤、執行等工做,並收集結果,兩者相互做用,完成了Hadoop分佈式集羣的主要任務。node
集羣架構:包括4個節點:1個Master,3個Salve,節點之間局域網鏈接,能夠相互ping通。
linux
節點IP地址分佈以下:apache
主機名 IP | 系統版本 | Hadoop | node | hadoop進程名 |
---|---|---|---|---|
Master | 192.168.33.200 | CentOS 6.5 | master | namenode,jobtracker |
Slave1 | 192.168.33.201 | CentOS 6.5 | slave | datanode,tasktracker |
Slave2 | 192.168.33.202 | CentOS 6.5 | slave | datanode,tasktracker |
Slave3 | 192.168.33.203 | CentOS 6.5 | slave | datanode,tasktracker |
四個節點上均是CentOS 6.5系統,而且有一個相同的用戶hadoop。Master機器主要配置NameNode和JobTracker的角色,負責總管分佈式數據和分解任務的執行;3個Salve機器配置DataNode和TaskTracker的角色,負責分佈式數據存儲以及任務的執行。vim
四臺虛擬機按照上面的網絡環境來進行配置
主機名
,靜態ip
,hosts映射
。瀏覽器
1.修改主機名服務器
vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=Master
2.修改ip地址網絡
vi /etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTO="static" #dhcp改成static ONBOOT="yes" #開機啓用本配置 IPADDR=192.168.33.200 #靜態IP GATEWAY=192.168.33.1 #默認網關 NETMASK=255.255.255.0 #子網掩碼
service network restart
架構
3.修改ip地址和主機名的映射關係app
vi /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.33.200 Master 192.168.33.201 Slave1 192.168.33.202 Slave2 192.168.33.203 Slave3
4.關閉iptables並設置其開機啓動/不啓動
service iptables stop
chkconfig iptables on
chkconfig iptables off
在4臺機器上分別配置好jdk
1.上傳jdk-8u121-linux-x64.tar.gz到Linux上
2.解壓jdk到/usr/local目錄
tar -zxvf jdk-8u121-linux-x64.tar.gz -C /usr/local/
3.設置環境變量,在/etc/profile文件最後追加相關內容
vi /etc/profile export JAVA_HOME=/usr/local/jdk1.8.0_121 export PATH=$PATH:$JAVA_HOME/bin
4.刷新環境變量
source /etc/profile
5.測試java命令是否可用
java -version
[root@localhost ~]# adduser cmj
爲這個用戶初始化密碼,linux會判斷密碼複雜度,不過能夠強行忽略:
[root@localhost ~]# passwd cmj 更改用戶 cmj 的密碼 新的 密碼: 無效的密碼: 密碼未經過字典檢查 - 過於簡單化/系統化 從新輸入新的 密碼: passwd:全部的身份驗證令牌已經成功更新。
2.受權
[root@localhost ~]# ls -l /etc/sudoers -r--r----- 1 root root 4251 9月 25 15:08 /etc/sudoers
sudoers只有只讀的權限,若是想要修改的話,須要先添加w權限:
[root@localhost ~]# chmod -v u+w /etc/sudoers mode of "/etc/sudoers" changed from 0440 (r--r-----) to 0640 (rw-r-----)
而後就能夠添加內容了,在下面的一行下追加新增的用戶:
[root@localhost ~]# vim /etc/sudoers ## Allow root to run any commands anywher root ALL=(ALL) ALL cmj ALL=(ALL) ALL #這個是新增的用戶
wq保存退出,這時候要記得將寫權限收回:
[root@localhost ~]# chmod -v u-w /etc/sudoers mode of "/etc/sudoers" changed from 0640 (rw-r-----) to 0440 (r--r-----)
這時候使用新用戶登陸,使用sudo:
第一次使用會提示你,你已經化身超人,身負責任。並且須要輸入密碼才能夠下一步。若是不想須要輸入密碼怎麼辦,將最後一個ALL修改爲NOPASSWD: ALL
。
在Hadoop啓動之後,Namenode是經過SSH(Secure Shell)來啓動和中止各個datanode上的各類守護進程的,這就需要在節點之間執行指令的時候是不需要輸入密碼的形式,故咱們需要配置SSH運用無密碼公鑰認證的形式。以本文中的四臺機器爲例,如今Master是主節點,他需要鏈接Slave一、Slave2和Slave3。需要肯定每臺機器上都安裝了ssh,而且datanode機器上sshd服務已經啓動。
切換到hadoop用戶( 保證用戶hadoop能夠無需密碼登陸,由於咱們後面安裝的hadoop屬主是hadoop用戶。)須要使得Master到Slave1,Slave2,Slave3免密登錄,以及Slave1,Slave2,Slave3到Master的免密登錄,以及Master,Slave1,Slave2,Slave3到自身迴環口的免密登錄
注意是在cmj用戶之下,而不是root,由於咱們最終是要使用cmj用戶來使用hadoop,而你在cmj用戶下配置免密登錄後,切換至root用戶或者其餘用戶的使用ssh登錄時,仍然須要密碼。
#su cmj #ssh-keygen -t rsa #cat ~/.ssh/id_rsa.pub
這個命令生成一個密鑰對:id_rsa(私鑰文件)和id_rsa.pub(公鑰文件)。默認被保存在~/.ssh/目錄下。
在/home/cmj/.ssh/下建立authorized_keys
上傳Master公鑰到Slave1中:
#scp /home/cmj/.ssh/id_rsa.pub cmj@slave1:/home/cmj/
到slave1中將剛纔複製的公鑰追加到authorized_keys中
#cd ~ #cat id_rsa.pub >> .ssh/authorized_keys #rm -f id_rsa.pub #刪除Master複製到slave1下的臨時key
權限設置爲600.(這點很重要,網沒有設置600權限會致使登錄失敗)
#chmod 600 .ssh/authorized_keys
測試登錄
$ ssh Slave1 The authenticity of host 'Master (192.168.33.200)' can't be established. RSA key fingerprint is d5:18:cb:5f:92:66:74:c7:30:30:bb:36:bf:4c:ed:e9. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'Master,192.168.33.200' (RSA) to the list of known hosts. Last login: Fri Aug 30 21:31:36 2013 from slave1 [cmj@Slave1 ~]$
一樣的方法,將Master 的公鑰複製到其餘節點。另外自身節點要設置免密登錄。把自身的公鑰追加到自身的authorized_keys中。
步驟相似上面。
1) 切換爲cmj用戶,下載安裝包後,直接解壓安裝便可:
#su cmj #wget http://apache.stu.edu.tw/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz #tar -zxvf hadoop-1.2.1.tar.gz
個人安裝目錄爲:
/home/cmj/hadoop-1.2.1
爲了方便,使用hadoop命令或者start-all.sh等命令,修改Master上/etc/profile 新增如下內容:
export HADOOP_HOME=/home/cmj/hadoop-1.2.1 export PATH=$PATH:$HADOOP_HOME/bin
修改完畢後,執行source /etc/profile
來使其生效。
2) 配置conf/hadoop-env.sh文件
配置conf/hadoop-env.sh文件,添加:
export JAVA_HOME=/usr/local/jdk1.8.0_121/
這裏修改成你的jdk的安裝位置。
測試hadoop安裝:
/home/cmj/hadoop-1.2.1/bin/hadoop jar hadoop-0.20.2-examples.jarwordcount conf/ /tmp/out
<configuration> <property> <name>fs.default.name</name> <value>Master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/cmj/tmp</value> </property> </configuration>
fs.default.name
是NameNode的URI。hdfs://主機名:端口/
hadoop.tmp.dir
:Hadoop的默認臨時路徑,這個最好配置,若是在新增節點或者其餘狀況下莫名其妙的DataNode啓動不了,就刪除此文件中的tmp目錄便可。不過若是刪除了NameNode機器的此目錄,那麼就須要從新執行NameNode格式化的命令。
<configuration> <property> <name>mapred.job.tracker</name> <value>hdfs://Master:9001</value> </property>
mapred.job.tracker
是JobTracker的主機(或者IP)和端口。主機:端口。
<configuration> <property> <name>dfs.replication</name> <value>3</value> </property> </configuration>
dfs.name.dir
是NameNode持久存儲名字空間及事務日誌的本地文件系統路徑。 當這個值是一個逗號分割的目錄列表時,nametable數據將會被複制到全部目錄中作冗餘備份。
dfs.data.dir
是DataNode存放塊數據的本地文件系統路徑,逗號分割的列表。 當這個值是逗號分割的目錄列表時,數據將被存儲在全部目錄下,一般分佈在不一樣設備上。
dfs.replication
是數據須要備份的數量,默認是3,若是此數大於集羣的機器數會出錯。
注意:此處的name一、name二、data一、data2目錄不能預先建立,hadoop格式化時會自動建立,若是預先建立反而會有問題。
配置conf/masters和conf/slaves來設置主從結點,注意最好使用主機名,而且保證機器之間經過主機名能夠互相訪問,每一個主機名一行。
$vim masters:
輸入:
Master
$vim slaves:
輸入:
Slave1 Slave2 Slave3
配置結束,把配置好的hadoop文件夾拷貝到其餘集羣的機器中,而且保證上面的配置對於其餘機器而言正確,例如:若是其餘機器的Java安裝路徑不同,要修改conf/hadoop-env.sh
$scp -r /home/cmj/hadoop-1.2.1 Slave1:/home/cmj/ $scp -r /home/cmj/hadoop-1.2.1 Slave2:/home/cmj/ $scp -r /home/cmj/hadoop-1.2.1 Slave3:/home/cmj/
$ cd /home/cmj/hadoop-1.2.1 $ bin/hadoop namenode -format
成功狀況下系統輸出:
Warning: $HADOOP_HOME is deprecated. 13/09/10 16:39:31 INFO namenode.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode STARTUP_MSG: host = Master/192.168.137.100 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.6.0_45 ************************************************************/ 13/09/10 16:39:32 INFO util.GSet: Computing capacity for map BlocksMap 13/09/10 16:39:32 INFO util.GSet: VM type = 64-bit 13/09/10 16:39:32 INFO util.GSet: 2.0% max memory = 1013645312 13/09/10 16:39:32 INFO util.GSet: capacity = 2^21 = 2097152 entries 13/09/10 16:39:32 INFO util.GSet: recommended=2097152, actual=2097152 13/09/10 16:39:32 INFO namenode.FSNamesystem: fsOwner=hadoop 13/09/10 16:39:32 INFO namenode.FSNamesystem: supergroup=supergroup 13/09/10 16:39:32 INFO namenode.FSNamesystem: isPermissionEnabled=true 13/09/10 16:39:32 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100 13/09/10 16:39:32 INFO namenode.FSNamesystem: isAccessTokenEnabled=falseaccessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s) 13/09/10 16:39:32 INFO namenode.FSEditLog: dfs.namenode.edits.toleration.length = 0 13/09/10 16:39:32 INFO namenode.NameNode: Caching file names occuring more than 10 times 13/09/10 16:39:33 INFO common.Storage: Image file /home/hadoop/name1/current/fsimage of size 112 bytes saved in 0 seconds. 13/09/10 16:39:33 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/home/hadoop/name1/current/edits 13/09/10 16:39:33 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/home/hadoop/name1/current/edits 13/09/10 16:39:33 INFO common.Storage: Storage directory /home/hadoop/name1 has been successfully formatted. 13/09/10 16:39:33 INFO common.Storage: Image file /home/hadoop/name2/current/fsimage of size 112 bytes saved in 0 seconds. 13/09/10 16:39:33 INFO namenode.FSEditLog: closing edit log: position=4, editlog= /home/hadoop/name2/current/edits 13/09/10 16:39:33 INFO namenode.FSEditLog: close success: truncate to 4, editlog= /home/hadoop/name2/current/edits 13/09/10 16:39:33 INFO common.Storage: Storage directory /home/hadoop/name2 has been successfully formatted. 13/09/10 16:39:33 INFO namenode.NameNode: SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at Master/192.168.137.100 ************************************************************/
查看輸出保證分佈式文件系統格式化成功執行完後能夠到master機器上看到/home/hadoop//name1和/home/hadoop/name2兩個目錄。在主節點master上面啓動hadoop,主節點會啓動全部從節點的hadoop。
$ bin/start-all.sh
(同時啓動HDFS和Map/Reduce)系統輸出:
$ bin/start-all.sh Warning: $HADOOP_HOME is deprecated. starting namenode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-namenode-Master.out Slave3: starting datanode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-datanode-Slave3.out Slave2: starting datanode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-datanode-Slave2.out Slave1: starting datanode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-datanode-Slave1.out The authenticity of host 'master (192.168.137.100)' can't be established. RSA key fingerprint is d5:18:cb:5f:92:66:74:c7:30:30:bb:36:bf:4c:ed:e9. Are you sure you want to continue connecting (yes/no)? yes Master: Warning: Permanently added 'master,192.168.137.100' (RSA) to the list of known hosts. hadoop@master's password: Master: starting secondarynamenode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-secondarynamenode-Master.out starting jobtracker, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-jobtracker-Master.out Slave2: starting tasktracker, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-tasktracker-Slave2.out Slave3: starting tasktracker, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-tasktracker-Slave3.out Slave1: starting tasktracker, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-tasktracker-Slave1.out
執行完後能夠到master(Master)和slave(Slave1,Slave2,Slave3)機器上看到/home/hadoop/hadoopfs/data1和/home/hadoop/data2兩個目錄。
啓動Hadoop集羣須要啓動HDFS集羣和Map/Reduce集羣。
在分配的NameNode上,運行下面的命令啓動HDFS:
$ bin/start-dfs.sh
(單獨啓動HDFS集羣)
bin/start-dfs.sh
腳本會參照NameNode上${HADOOP_CONF_DIR}/slaves
文件的內容,在全部列出的slave上啓動DataNode守護進程。
在分配的JobTracker上,運行下面的命令啓動Map/Reduce:$bin/start-mapred.sh
(單獨啓動Map/Reduce)
bin/start-mapred.sh
腳本會參照JobTracker上${HADOOP_CONF_DIR}/slaves
文件的內容,在全部列出的slave上啓動TaskTracker守護進程。
從主節點master關閉hadoop,主節點會關閉全部從節點的hadoop。
$ bin/stop-all.sh
Hadoop守護進程的日誌寫入到 ${HADOOP_LOG_DIR}
目錄 (默認是 ${HADOOP_HOME}/logs)
.
${HADOOP_HOME}
就是安裝路徑.
$ /usr/local/jdk1.6.0_45/bin/jps 3180 Jps 2419 SecondaryNameNode 2236 NameNode 2499 JobTracker
$ /usr/local/jdk1.6.0_45/bin/jps 2631 Jps 2277 DataNode 2365 TaskTracker
NameNode – http://Master:50070/dfshealth.jsp
http://master:50030
對剛剛安裝好的hadoop集羣作個測試
準備兩個數據文件test1.txt,test2.txt,將其put到hadoop的file system的in裏面
說明:bin/hadoop fs -put ../input ./in
:將當前目錄下的input文件夾拷貝到hadoop文件系統的in文件夾裏面
[cmj@Master hadoop-1.2.1]$ bin/hadoop jar hadoop-examples-1.2.1.jar wordcount in out 17/04/16 19:50:37 INFO input.FileInputFormat: Total input paths to process : 2 17/04/16 19:50:37 INFO util.NativeCodeLoader: Loaded the native-hadoop library 17/04/16 19:50:37 WARN snappy.LoadSnappy: Snappy native library not loaded 17/04/16 19:50:37 INFO mapred.JobClient: Running job: job_201704161933_0001 17/04/16 19:50:38 INFO mapred.JobClient: map 0% reduce 0% 17/04/16 19:50:45 INFO mapred.JobClient: map 100% reduce 0% 17/04/16 19:50:54 INFO mapred.JobClient: map 100% reduce 33% 17/04/16 19:50:55 INFO mapred.JobClient: map 100% reduce 100% 17/04/16 19:50:57 INFO mapred.JobClient: Job complete: job_201704161933_0001 17/04/16 19:50:57 INFO mapred.JobClient: Counters: 29 17/04/16 19:50:57 INFO mapred.JobClient: Map-Reduce Framework 17/04/16 19:50:57 INFO mapred.JobClient: Spilled Records=8 17/04/16 19:50:57 INFO mapred.JobClient: Map output materialized bytes=61 17/04/16 19:50:57 INFO mapred.JobClient: Reduce input records=4 17/04/16 19:50:57 INFO mapred.JobClient: Virtual memory (bytes) snapshot=5800771584 17/04/16 19:50:57 INFO mapred.JobClient: Map input records=2 17/04/16 19:50:57 INFO mapred.JobClient: SPLIT_RAW_BYTES=210 17/04/16 19:50:57 INFO mapred.JobClient: Map output bytes=41 17/04/16 19:50:57 INFO mapred.JobClient: Reduce shuffle bytes=61 17/04/16 19:50:57 INFO mapred.JobClient: Physical memory (bytes) snapshot=395091968 17/04/16 19:50:57 INFO mapred.JobClient: Reduce input groups=3 17/04/16 19:50:57 INFO mapred.JobClient: Combine output records=4 17/04/16 19:50:57 INFO mapred.JobClient: Reduce output records=3 17/04/16 19:50:57 INFO mapred.JobClient: Map output records=4 17/04/16 19:50:57 INFO mapred.JobClient: Combine input records=4 17/04/16 19:50:57 INFO mapred.JobClient: CPU time spent (ms)=1470 17/04/16 19:50:57 INFO mapred.JobClient: Total committed heap usage (bytes)=324055040 17/04/16 19:50:57 INFO mapred.JobClient: File Input Format Counters 17/04/16 19:50:57 INFO mapred.JobClient: Bytes Read=25 17/04/16 19:50:57 INFO mapred.JobClient: FileSystemCounters 17/04/16 19:50:57 INFO mapred.JobClient: HDFS_BYTES_READ=235 17/04/16 19:50:57 INFO mapred.JobClient: FILE_BYTES_WRITTEN=160505 17/04/16 19:50:57 INFO mapred.JobClient: FILE_BYTES_READ=55 17/04/16 19:50:57 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=25 17/04/16 19:50:57 INFO mapred.JobClient: Job Counters 17/04/16 19:50:57 INFO mapred.JobClient: Launched map tasks=2 17/04/16 19:50:57 INFO mapred.JobClient: Launched reduce tasks=1 17/04/16 19:50:57 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=10333 17/04/16 19:50:57 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0 17/04/16 19:50:57 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=10492 17/04/16 19:50:57 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0 17/04/16 19:50:57 INFO mapred.JobClient: Data-local map tasks=2 17/04/16 19:50:57 INFO mapred.JobClient: File Output Format Counters 17/04/16 19:50:57 INFO mapred.JobClient: Bytes Written=25
HDFS操做
運行bin/目錄的hadoop命令,能夠查看Haoop全部支持的操做及其用法,這裏以幾個簡單的操做爲例。
創建目錄
$bin/hadoop dfs -mkdir testdir Warning: $HADOOP_HOME is deprecated. 13/09/10 17:29:05 WARN fs.FileSystem: "Master:9000" is a deprecated filesystem name. Use"hdfs://Master:9000/" instead.
在HDFS中創建一個名爲testdir的目錄
複製文件
$ bin/hadoop dfs -put /home/hadoop/hadoop-1.2.1.tar.gz testfile.zip Warning: $HADOOP_HOME is deprecated. 13/09/10 17:30:32 WARN fs.FileSystem: "Master:9000" is a deprecated filesystem name. Use"hdfs://Master:9000/" instead. 13/09/10 17:30:33 WARN fs.FileSystem: "Master:9000" is a deprecated filesystem name. Use"hdfs://Master:9000/" instead
把本地文件/home/hadoop/hadoop-1.2.1.tar.gz拷貝到HDFS的根目錄/user/hadoop/下,文件名爲testfile.zip
查看現有文件
$ bin/hadoop dfs -ls Warning: $HADOOP_HOME is deprecated. 13/09/10 17:32:00 WARN fs.FileSystem: "Master:9000" is a deprecated filesystem name. Use"hdfs://Master:9000/" instead. Found 2 items drwxr-xr-x - hadoop supergroup 0 2013-09-10 17:29 /user/hadoop/testdir -rw-r--r-- 3 hadoop supergroup 63851630 2013-09-10 17:30 /user/hadoop/testfile.zip
經過啓動或中止hadoop咱們會發現會出現 「Warning: $HADOOP_HOME is deprecated」 這樣一個警告,下面給出解決方案:
第一種:去除/etc/profile
中export HADOOP_HOME=/home/cmj/hadoop-1.2.1
,而後source /etc/profile
不過咱們通常推薦第二種,由於咱們仍是須要$HADOOP_HOME的,方便引用。
因此咱們通常在/etc/profile
文件最後加上 export HADOOP_HOME_WARN_SUPPRESS=1
,而後輸入命令source /etc/profile
使其生效便可。