歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Hadoop學習筆記 - 簡介和安裝

Hadoop學習筆記 - 簡介和安裝

日期:2017/2/27 16:05:53   编辑:Linux教程
這裡先大致介紹一下Hadoop.
本文大部分內容都是從官網Hadoop上來的。其中有一篇介紹HDFS的pdf文檔,裡面對Hadoop介紹的比較全面了。我的這一個系列的Hadoop學習筆記也是從這裡一步一步進行下來的,同時又參考了網上的很多文章,對學習Hadoop中遇到的問題進行了歸納總結。
言歸正傳,先說一下Hadoop的來龍去脈。談到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包含兩個部分:

1、HDFS

即Hadoop Distributed File System (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,Client便這些本地臨時文件夾中的數據塊寫入指定的數據節點。
HDFS采取了副本策略,其目的是為了提高系統的可靠性,可用性。HDFS的副本放置策略是三個副本,一個放在本節點上,一個放在同一機架中的另一個節點上,還有一個副本放在另一個不同的機架中的一個節點上。當前版本的hadoop0.12.0中還沒有實現,但是正在進行中,相信不久就可以出來了。

2、MapReduce的實現

MapReduce是Google 的一項重要技術,它是一個編程模型,用以進行大數據量的計算。對於大數據量的計算,通常采用的處理手法就是並行計算。至少現階段而言,對許多開發人員來說,並行計算還是一個比較遙遠的東西。MapReduce就是一種簡化並行計算的編程模型,它讓那些沒有多少並行計算經驗的開發人員也可以開發並行應用。
MapReduce的名字源於這個模型中的兩項核心操作:Map和 Reduce。也許熟悉Functional Programming(函數式編程)的人見到這兩個詞會倍感親切。簡單的說來,Map是把一組數據一對一的映射為另外的一組數據,其映射的規則由一個函數來指定,比如對[1, 2, 3, 4]進行乘2的映射就變成了[2, 4, 6, 8]。Reduce是對一組數據進行歸約,這個歸約的規則由一個函數指定,比如對[1, 2, 3, 4]進行求和的歸約得到結果是10,而對它進行求積的歸約結果是24。
關於MapReduce的內容,建議看看孟巖的這篇MapReduce:The Free Lunch Is Not Over!

好了,作為這個系列的第一篇就寫這麼多了,我也是剛開始接觸Hadoop,下一篇就是講Hadoop的部署,談談我在部署Hadoop時遇到的問題,也給大家一個參考,少走點彎路。

Hadoop學習筆記二 安裝部署

本文主要是以安裝和使用hadoop-0.12.0為例,指出在部署Hadoop的時候容易遇到的問題以及如何解決。

硬件環境
共有3台機器,均使用的FC5系統,Java使用的是jdk1.6.0。IP配置如下:
dbrg-1:202.197.18.72
dbrg-2:202.197.18.73
dbrg-3:202.197.18.74

這裡有一點需要強調的就是,務必要確保每台機器的主機名和IP地址之間能正確解析。

一個很簡單的測試辦法就是ping一下主機名,比如在dbrg-1上ping dbrg-2,如果能ping通就OK!若不能正確解析,可以修改/etc/hosts文件,如果該台機器作Namenode用,則需要在hosts文件中加上集群中所有機器的IP地址及其對應的主機名;如果該台機器作Datanode用,則只需要在hosts文件中加上本機IP地址和Namenode機器的IP地址。

以本文為例,dbrg-1中的/etc/hosts文件看起來就應該是這樣的:
127.0.0.0 localhost localhost
202.197.18.72 dbrg-1 dbrg-1
202.197.18.73 dbrg-2 dbrg-2
202.197.18.74 dbrg-3 dbrg-3

dbrg-2中的/etc/hosts文件看起來就應該是這樣的:
127.0.0.0 localhost localhost
202.197.18.72 dbrg-1 dbrg-1
202.197.18.73 dbrg-2 dbrg-2

在上一篇學習筆記中提到過,對於Hadoop來說,在HDFS看來,節點分為Namenode和Datanode,其中Namenode只有一個,Datanode可以是很多;在MapReduce看來,節點又分為Jobtracker和Tasktracker,其中Jobtracker只有一個,Tasktracker可以是很多。
我是將namenode和jobtracker部署在dbrg-1上,dbrg-2,dbrg-3作為datanode和tasktracker。當然你也可以將namenode,datanode,jobtracker,tasktracker全部部署在一台機器上


目錄結構
由於Hadoop要求所有機器上hadoop的部署目錄結構要相同,並且都有一個相同的用戶名的帳戶。
我的三台機器上是這樣的:都有一個dbrg的帳戶,主目錄是/home/dbrg
Hadoop部署目錄結構如下:/home/dbrg/HadoopInstall,所有的hadoop版本放在這個目錄中。
將hadoop0.12.0壓縮包解壓至HadoopInstall中,為了方便以後升級,建議建立一個鏈接指向要使用的hadoop版本,不妨設為hadoop
[dbrg@dbrg-1:HadoopInstall]$ln -s hadoop0.12.0 hadoop
這樣一來,所有的配置文件都在/hadoop/conf/目錄中,所有執行程序都在/hadoop/bin目錄中。
但是由於上述目錄中hadoop的配置文件和hadoop的安裝目錄是放在一起的,這樣一旦日後升級hadoop版本的時候所有的配置文件都會被覆蓋,因此建議將配置文件與安裝目錄分離,一種比較好的方法就是建立一個存放配置文件的目錄,/home/dbrg/HadoopInstall/hadoop-config/,然後將/hadoop/conf/目錄中的hadoop_site.xml,slaves,hadoop_env.sh三個文件拷貝到hadoop-config/目錄中(這個問題很奇怪,在官網上的Getting Started With Hadoop中說是只需要拷貝這個三個文件到自己創建的目錄就可以了,但我在實際配置的時候發現還必須把masters這個文件也拷貝到hadoop-conf/目錄中才行,不然啟動Hadoop的時候就會報錯說找不到masters這個文件),並指定環境變量$HADOOP_CONF_DIR指向該目錄。環境變量在/home/dbrg/.bashrc和/etc/profile中設定。
綜上所述,為了方便以後升級版本,我們需要做到配置文件與安裝目錄分離,並通過設定一個指向我們要使用的版本的hadoop的鏈接,這樣可以減少我們對配置文件的維護。在下面的部分,你就會體會到這樣分離以及鏈接的好處了。


SSH設置
在Hadoop啟動以後,Namenode是通過SSH(Secure Shell)來啟動和停止各個節點上的各種守護進程的,這就需要在節點之間執行指令的時候是不需要輸入密碼的方式,故我們需要配置SSH使用無密碼公鑰認證的方式。
首先要保證每台機器上都裝了SSH服務器,且都正常啟動。實際中我們用的都是OpenSSH,這是SSH協議的一個免費開源實現。FC5中默認安裝的OpenSSH版本是OpenSSH4.3P2。
以本文中的三台機器為例,現在dbrg-1是主節點,它需要主動發起SSH連接到dbrg-2和dbrg-3,對於SSH服務來說,dbrg-1就是SSH客戶端,而dbrg-2、dbrg-3則是SSH服務端,因此在dbrg-2,dbrg-3上需要確定sshd服務已經啟動。簡單的說,在dbrg-1上需要生成一個密鑰對,即一個私鑰,一個公鑰。將公鑰拷貝到dbrg-2,dbrg-3上,這樣,比如當dbrg-1向dbrg-2發起ssh連接的時候,dbrg-2上就會生成一個隨機數並用dbrg-1的公鑰對這個隨機數進行加密,並發送給dbrg-1;dbrg-1收到這個加密的數以後用私鑰進行解密,並將解密後的數發送回dbrg-2,dbrg-2確認解密的數無誤後就允許dbrg-1進行連接了。這就完成了一次公鑰認證過程。

對於本文中的三台機器,首先在dbrg-1上生成密鑰對:
[dbrg@dbrg-1:~]$ssh-keygen -t rsa
這個命令將為dbrg-1上的用戶dbrg生成其密鑰對,詢問其保存路徑時直接回車采用默認路徑,當提示要為生成的密鑰輸入passphrase的時候,直接回車,也就是將其設定為空密碼。生成的密鑰對id_rsa,id_rsa.pub,默認存儲在/home/dbrg/.ssh目錄下。然後將id_rsa.pub的內容復制到每個機器(也包括本機)的/home/dbrg/.ssh/authorized_keys文件中,如果機器上已經有authorized_keys這個文件了,就在文件末尾加上id_rsa.pub中的內容,如果沒有authorized_keys這個文件,直接cp或者scp就好了,下面的操作假設各個機器上都沒有authorized_keys文件。

對於dbrg-1
[dbrg@dbrg-1:.ssh]$cp id_rsa.pub authorized_keys

對於dbrg-2(dbrg-3同dbrg-2的方法)
[dbrg@dbrg-2:~]$mkdir .ssh
[dbrg@dbrg-1:.ssh]$scp authorized_keys dbrg-2:/home/dbrg/.ssh/
此處的scp就是通過ssh進行遠程copy,此處需要輸入遠程主機的密碼,即dbrg-2機器上dbrg帳戶的密碼,當然,你也可以用其他方法將authorized_keys文件拷貝到其他機器上

[dbrg@dbrg-2:.ssh]$chmod 644 authorized_keys
這一步非常關鍵,必須保證authorized_keys只對其所有者有讀寫權限,其他人不允許有寫的權限,否則SSH是不會工作的。我就曾經在配置SSH的時候郁悶了好久。

[dbrg@dbrg-2:.ssh]ls -la
drwx------ 2 dbrg dbrg .
drwx------ 3 dbrg dbrg ..
-rw-r--r-- 1 dbrg dbrg authorized_keys
注意每個機器上的.ssh目錄的ls -la都應該和上面是一樣的

接著,在三台機器上都需要對sshd服務進行配置(其實是可以不用配置的,完成了上面的那些操作了以後SSH就已經可以工作了),在三台機器上修改文件/etc/ssh/sshd_config
#去除密碼認證
PasswordAuthentication no
AuthorizedKeyFile .ssh/authorized_keys

至此各個機器上的SSH配置已經完成,可以測試一下了,比如dbrg-1向dbrg-2發起ssh連接
[dbrg@dbrg-1:~]$ssh dbrg-2
如果ssh配置好了,就會出現以下提示信息
The authenticity of host [dbrg-2] can't be established.
Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52.
Are you sure you want to continue connecting (yes/no)?
OpenSSH告訴你它不知道這台主機,但是你不用擔心這個問題,因為你是第一次登錄這台主機。鍵入“yes”。這將把這台主機的“識別標記”加到“~/.ssh/know_hosts”文件中。第二次訪問這台主機的時候就不會再顯示這條提示信息了。
然後你會發現不需要輸入密碼就可以建立ssh連接了,恭喜你,配置成功了
不過,別忘了測試本機ssh dbrg-1


Hadoop環境變量
在/home/dbrg/HadoopInstall/hadoop-conf目錄下的hadoop_env.sh中設置Hadoop需要的環境變量,其中JAVA_HOME是必須設定的變量。HADOOP_HOME變量可以設定也可以不設定,如果不設定,HADOOP_HOME默認的是bin目錄的父目錄,即本文中的/home/dbrg/HadoopInstall/hadoop。我的是這樣設置的
export HADOOP_HOME=/home/dbrg/HadoopInstall/hadoop
export JAVA_HOME=/usr/java/jdk1.6.0
從這個地方就可以看出前面所述的創建hadoop0.12.0的鏈接hadoop的優點了,當以後更新hadoop的版本的時候,就不需要在改配置文件,只需要更改鏈接就可以了。


Hadoop配置文件
如前所述,在hadoop-conf/目錄下,打開slaves文件,該文件用來指定所有的從節點,一行指定一個主機名。即本文中的dbrg-2,dbrg-3,因此slaves文件看起來應該是這樣的
dbrg-2
dbrg-3
在conf/目錄中的hadoop-default.xml中包含了Hadoop的所有配置項,但是不允許直接修改!可以在hadoop-conf/目錄下的hadoop-site.xml裡面定義我們需要的項,其值會覆蓋hadoop-default.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>dbrg-1:9000</value>
<description>The name of the default file system. Either the literal string "local" or a host:port for DFS.</description>
</property>
<property>
<name>mapred.job.tracker</name>
<value>dbrg-1:9001</value>
<description>The host and port that the MapReduce job tracker runs at. If "local", then jobs are run in-process as a single map and reduce task.</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/dbrg/HadoopInstall/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>dfs.name.dir</name>
<value>/home/dbrg/HadoopInstall/filesystem/name</value>
<description>Determines where on the local filesystem the DFS name node should store the name table. If this is a comma-delimited list of directories then the name table is replicated in all of the directories, for redundancy. </description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/dbrg/HadoopInstall/filesystem/data</value>
<description>Determines where on the local filesystem an DFS data node should store its blocks. If this is a comma-delimited list of directories, then data will be stored in all named directories, typically on different devices. Directories that do not exist are ignored.</description>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
<description>Default block replication. The actual number of replications can be specified when the file is created. The default is used if replication is not specified in create time.</description>
</property>
</configuration>


部署Hadoop
前面講的這麼多Hadoop的環境變量和配置文件都是在dbrg-1這台機器上的,現在需要將hadoop部署到其他的機器上,保證目錄結構一致。
[dbrg@dbrg-1:~]$scp -r /home/dbrg/HadoopInstall dbrg-2:/home/dbrg/
[dbrg@dbrg-1:~]$scp -r /home/dbrg/HadoopInstall dbrg-3:/home/dbrg/
至此,可以說,Hadoop已經在各個機器上部署完畢了下面就讓我們開始啟動Hadoop吧


啟動Hadoop
啟動之前,我們先要格式化namenode,先進入~/HadoopInstall/hadoop目錄,執行下面的命令
[dbrg@dbrg-1:hadoop]$bin/hadoop namenode -format
不出意外,應該會提示格式化成功。如果不成功,就去hadoop/logs/目錄下去查看日志文件
下面就該正式啟動hadoop啦,在bin/下面有很多啟動腳本,可以根據自己的需要來啟動。
* start-all.sh 啟動所有的Hadoop守護。包括namenode, datanode, jobtracker, tasktrack
* stop-all.sh 停止所有的Hadoop
* start-mapred.sh 啟動Map/Reduce守護。包括Jobtracker和Tasktrack
* stop-mapred.sh 停止Map/Reduce守護
* start-dfs.sh 啟動Hadoop DFS守護.Namenode和Datanode
* stop-dfs.sh 停止DFS守護

在這裡,簡單啟動所有守護
[dbrg@dbrg-1:hadoop]$bin/start-all.sh

同樣,如果要停止hadoop,則
[dbrg@dbrg-1:hadoop]$bin/stop-all.sh


HDFS操作
運行bin/目錄的hadoop命令,可以查看Haoop所有支持的操作及其用法,這裡以幾個簡單的操作為例。

建立目錄
[dbrg@dbrg-1:hadoop]$bin/hadoop dfs -mkdir testdir
在HDFS中建立一個名為testdir的目錄

復制文件
[dbrg@dbrg-1:hadoop]$bin/hadoop dfs -put /home/dbrg/large.zip testfile.zip
把本地文件large.zip拷貝到HDFS的根目錄/user/dbrg/下,文件名為testfile.zip

查看現有文件
[dbrg@dbrg-1:hadoop]$bin/hadoop dfs -ls
轉載地址:http://www.cnblogs.com/wayne1017
Copyright © Linux教程網 All Rights Reserved