前言: java
Hadoop簡介node
Hadoop是一個分佈式系統基礎架構,由Apache基金會開發。用戶能夠在不瞭解分佈式底層細節的狀況下,開發分佈式程序。充分利用集羣的威力高速運算和存儲。簡單地說來,Hadoop是一個能夠更容易開發和運行處理大規模數據的軟件平臺。Hadoop實現了一個分佈式文件系統(HadoopDistributedFileSystem),簡稱HDFS。HDFS有着高容錯性(fault-tolerent)的特色,而且設計用來部署在低廉的(low-cost)硬件上。並且它提供高傳輸率(highthroughput)來訪問應用程序的數據,適合那些有着超大數據集(largedataset)的應用程序。HDFS放寬了(relax)POSIX的要求(requirements)這樣能夠流的形式訪問(streamingaccess)文件系統中的數據。linux
談到Hadoop就不得不提到Lucene和Nutch。首先,Lucene並非一個應用程序,而是提供了一個純Java的高性能全文索引引擎工具包,它能夠方便的嵌入到各類實際應用中實現全文搜索/索引功能。Nutch是一個應用程序,是一個以Lucene爲基礎實現的搜索引擎應用,Lucene爲Nutch提供了文本搜索和索引的API,Nutch不光有搜索的功能,還有數據抓取的功能。在nutch0.8.0版本以前,Hadoop還屬於Nutch的一部分,而從nutch0.8.0開始,將其中實現的NDFS和MapReduce剝離出來成立一個新的開源項目,這就是Hadoop,而nutch0.8.0版本較之之前的Nutch在架構上有了根本性的變化,那就是徹底構建在Hadoop的基礎之上了。在Hadoop中實現了Google的GFS和MapReduce算法,使Hadoop成爲了一個分佈式的計算平臺。其實,Hadoop並不只僅是一個用於存儲的分佈式文件系統,而是設計用來在由通用計算設備組成的大型集羣上執行分佈式應用的框架。算法
Hadoop包含兩個部分:編程
一、HDFS緩存
Hadoop簡介中的HDFS。HDFS即HadoopDistributedFileSystem(Hadoop分佈式文件系統)HDFS具備高容錯性,而且能夠被部署在低價的硬件設備之上。HDFS很適合那些有大數據集的應用,而且提供了對數據讀寫的高吞吐率。HDFS是一個master/slave的結構,就一般的部署來講,在master上只運行一個Namenode,而在每個slave上運行一個Datanode。HDFS支持傳統的層次文件組織結構,同現有的一些文件系統在操做上很相似,好比你能夠建立和刪除一個文件,把一個文件從一個目錄移到另外一個目錄,重命名等等操做。Namenode管理着整個分佈式文件系統,對文件系統的操做(如創建、刪除文件和文件夾)都是經過Namenode來控制。安全
HDFS的結構圖中能夠看出,Namenode,Datanode,Client之間的通訊都是創建在TCP/IP的基礎之上的。當Client要執行一個寫入的操做的時候,命令不是立刻就發送到Namenode,Client首先在本機上臨時文件夾中緩存這些數據,當臨時文件夾中的數據塊達到了設定的Block的值(默認是64M)時,Client便會通知Namenode,Namenode便響應Client的RPC請求,將文件名插入文件系統層次中而且在Datanode中找到一塊存放該數據的block,同時將該Datanode及對應的數據塊信息告訴Client,Cliet便這些本地臨時文件夾中的數據塊寫入指定的數據節點。HDFS採起了副本策略,其目的是爲了提升系統的可靠性,可用性。HDFS的副本放置策略是三個副本,一個放在本節點上,一個放在同一機架中的另外一個節點上,還有一個副本放在另外一個不一樣的機架中的一個節點上。當前版本的hadoop0.12.0中尚未實現,可是正在進行中,相信不久就能夠出來了。架構
二、MapReduce的實現框架
Hadoop簡介中MapReduce的實現。MapReduce是Google的一項重要技術,它是一個編程模型,用以進行大數據量的計算。對於大數據量的計算,一般採用的處理手法就是並行計算。至少現階段而言,對許多開發人員來講,並行計算仍是一個比較遙遠的東西。MapReduce就是一種簡化並行計算的編程模型,它讓那些沒有多少並行計算經驗的開發人員也能夠開發並行應用。MapReduce的名字源於這個模型中的兩項核心操做:Map和Reduce。也許熟悉FunctionalProgramming(函數式編程)的人見到這兩個詞會倍感親切。簡單的說來,Map是把一組數據一對一的映射爲另外的一組數據,其映射的規則由一個函數來指定,好比對[1,2,3,4]進行乘2的映射就變成了[2,4,6,8]。Reduce是對一組數據進行歸約,這個歸約的規則由一個函數指定,好比對[1,2,3,4]進行求和的歸約獲得結果是10,而對它進行求積的歸約結果是24。dom
安裝Hadoop集羣以前咱們得先檢驗系統是否安裝了以下的必備軟件:
rpm -qa ssh rsync
若有未安裝的請參考 http://crushlinux.blog.51cto.com/2663646/1274819 配置yum倉庫
yum install rsync ssh
一、更改本機主機名:master與3個slave都須要更改
master:
vi /etc/hostname
10.0.0.10 master
slave1
vi /etc/hostname
10.0.0.11 slave1
slave2
vi /etc/hostname
10.0.0.12 slave2
slave3
vi /etc/hostname
10.0.0.13 slave3
二、更改hosts信息:可讓master與slave之間互相解析
master
vi /etc/hosts
10.0.0.10 master
10.0.0.11 slave1
10.0.0.12 slave2
10.0.0.13 slave3
每一個slave上都要配置master的信息
vi /etc/hosts
10.0.0.10 master
三、新建hadoop用戶
Hadoop要求全部機器上hadoop的部署目錄結構要相同,而且都有一個相同的用戶名的賬
戶,因此須要每臺機器建立一個同名的用戶。
在這4臺機器上建hadoop用戶,密碼:hadoop,用戶主目錄/home/hadoop/。
useradd hadoop
passwd hadoop
四、SSH設置
Hadoop須要master與3個slave之間經過ssh無密鑰方式互相訪問
master:
su - hadoop
mkdir .ssh
chmod 755 .ssh/
ls -la
cd .ssh/
ssh-keygen -t rsa
cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys
chmod 600 authorized_keys
scp -r /home/hadoop/.ssh/authorized_keys 10.0.0.11:/home/hadoop/.ssh/
slave1
mkdir .ssh
chmod 755 .ssh/
cd .ssh/
chmod 600 authorized_keys
ssh-keygen -t rsa
cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys
scp -r /home/hadoop/.ssh/authorized_keys 10.0.0.10:/home/hadoop/.ssh/
master
scp -r /home/hadoop/.ssh/authorized_keys 10.0.0.12:/home/hadoop/.ssh/
slave2
mkdir .ssh
chmod 755 .ssh/
cd .ssh/
chmod 600 authorized_keys
ssh-keygen -t rsa
cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys
scp -r /home/hadoop/.ssh/authorized_keys 10.0.0.10:/home/hadoop/.ssh/
master
scp -r /home/hadoop/.ssh/authorized_keys 10.0.0.13:/home/hadoop/.ssh/
slave3
mkdir .ssh
chmod 755 .ssh/
cd .ssh/
chmod 600 authorized_keys
ssh-keygen -t rsa
cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys
scp -r /home/hadoop/.ssh/authorized_keys 10.0.0.10:/home/hadoop/.ssh/
五、jdk 的安裝及配置
用root操做
/usr/java/jdk1.6.0_21/lib/
# chmod +x jdk-6u24-linux-x64.bin (以64位操做系統爲例)
#./jdk-6u24-linux-x64.bin
會出現一個jdk-6u24-linux-x64.rpm包
rpm -ivh jdk-6u24-linux-x64.rpm
jdk 的安裝到這兒就結束了。
下面我們配置java 跟hadoop的環境變量
vi /etc/profile 到最下面添加以下內容:
export JAVA_HOME=/usr/java/jdk1.6.0_21
export HADOOP_HOME=/home/hadoop/hadoop-0.21.0
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$HADOOP_HOME/bin:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
六、安裝hadoop (注:都用hadoop用戶操做否則後面啓動時會有些報錯)
將hadoop-0.20.2.tar文件下載到 /home/hadoop 目錄下
tar –zxvf hadoop-0.20.2.tar.gz
cd hadoop-0.20.2/conf
vi hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.6.0_21 將註釋去掉並更改JAVA_HOME的路徑
vi /home/hadoop/hadoop-0.21.0/conf/masters
10.0.0.10 maste
vi /home/hadoop/hadoop-0.21.0/conf/slaves
10.0.0.11 slave1
10.0.0.12 slave2
10.0.0.13 slave3
vi /home/hadoop/hadoop-0.21.0/conf/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://10.0.0.10:9000</value>
</property>
</configuration>
vi /home/hadoop/hadoop-0.21.0/conf/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/hadoop/namenode</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/hadoop/data</value>
</property>
</configuration>
vi /home/hadoop/hadoop-0.21.0/conf/mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>10.0.0.10:9001</value>
</property>
</configuration>
基本配置已經配好了下面我們把在master上配置好的hadoop文件發送給每一個slave
scp –r /home/hadoop/hadoop-0.20.2 hadoop@10.0.0.11:/home/hadoop
scp –r /home/hadoop/hadoop-0.20.2 hadoop@10.0.0.12:/home/hadoop
scp –r /home/hadoop/hadoop-0.20.2 hadoop@10.0.0.13:/home/hadoop
傳完以後我們須要執行一下格式化的操做
cd /home/hadoop/hadoop-0.20.2
./bin/hadoop namedode –format
七、啓動hadoop
啓動前建議關閉iptables 防火牆及selinux安全組件等功能
service iptables stop
setenforce 0
bin下有不少腳本文件是來控制的hadoop的
我們能夠用 ./bin/start-all.sh來啓動hadoop
八、hadoop的測試
咱們用以下命令驗證一下是否啓動成功:
./bin/hadoop dfsadmin –report
若是沒有錯誤提示或者出現文件列表,那麼恭喜你,Hadoop成功啓動了,另外,咱們能夠
經過訪問http://10.0.0.10:50070 來查看hdfs的狀態,訪問http://10.0.0.10:50030 來查看
map/reduce的狀態。
./bin/hadoop dfs –put input /input將input 放到hadoop根目錄下input 目錄
./bin/hadoop jar hadoop-*examples.jar wordcount /input /output 數單詞測試
./bin/hadoop jar hadoop*examples.jar randomwriter /rand 產生數據
./bin/hadoop jar hadoop*examples.jar sort /rand /rand_sort 排序測試