hadoop2 Ubuntu 下安装部署
搭建Hadoop環境( 我以hadoop 2.7.3 為例, 系統為 64bit Ubuntu14.04 ) hadoop 2.7.3 官網下載 , 選擇自己要安裝的版本。注意每個版本對應兩個下載選項source和binary,我們暫時下載binary,我們下載編譯好的文件hadoop-2.7.3.tar.gz , 解壓后為 hadoop-2.7.3 , 這個可以直接安裝部署. ( 如果下載源代碼文件 hadoop-2.7.3-src.tar.gz , 需要先編譯后才能進行安裝部署. )
Hadoop有三種安裝部署模式,分別是:第一,單機安裝部署;第二,偽分布式安裝部署;第三,全分布式安裝部署.? 我們還是以hadoop-2.7.3為例
第一以及第二在單個節點上部署集群,參見官網 Hadoop:設置單個節點集群。? 參考 Hadoop安裝教程_單機/偽分布式配置_Hadoop2.6.0/Ubuntu14.04 ?
第三是要在多個節點上進行部署集群,參見官網 Hadoop集群安裝??
安裝hadoop前的準備工作
(1) 安裝jdk ? ? 參見我的博客?安裝JDK+Eclipse+Maven(windows系統和linux系統) ?
(2) 安裝openssl-server???
集群、單節點模式都需要用到 SSH 登陸(類似于遠程登陸,你可以登錄某臺 Linux 主機,并且在上面運行命令),Ubuntu 默認已安裝了 SSH client,此外還需要安裝 SSH server: ( 或者直接 sudo apt-get install openssh )
安裝后,可以使用如下命令登陸本機:
$ ssh localhost此時會有如下提示(SSH首次登陸提示),輸入 yes 。然后按提示輸入密碼 ,這樣就登陸到本機了。
(3) 免密碼登陸
但這樣登陸是需要每次輸入密碼的,我們需要配置成SSH無密碼登陸比較方便。
單臺機器的無密碼登錄( 登錄 localhost ): ( 單機安裝部署以及偽分布式安裝部署 )
首先退出剛才的 ssh,就回到了我們原先的終端窗口,然后利用 ssh-keygen 生成密鑰,并將密鑰加入到授權中:
$ exit # 退出剛才的 ssh localhost$ cd ~/.ssh/ # 若沒有該目錄,請先執行一次ssh localhost $ ssh-keygen -t rsa # 會有提示,都按回車就可以 $ cat ./id_rsa.pub >> ./authorized_keys # 加入授權
此時再用 ssh localhost 命令,無需輸入密碼就可以直接登陸了
還有多臺機器間的無密碼登錄: ( 全分布式安裝部署 )
?
安裝Hadoop2
接下來我們安裝hadoop到/usr/local/目錄下, ( 也可以是其他目錄 )
$ cd /usr/local $ sudo cp ~/Desktop/hadoop-x.x.x.tar.gz . //別忽視最后的點,代表當前目錄 $ sudo tar -zxvf hadoop-x.x.x.tar.gz $ sudo mv hadoop-x.x.x hadoop //簡化名字而已,改不改都行$ sudo chown -R hadoop ./hadoop // 修改文件權限
Hadoop 解壓后即可使用。輸入如下命令來檢查 Hadoop 是否可用,成功則會顯示 Hadoop 版本信息:
$ cd /usr/local/hadoop $ ./bin/hadoop version配置全局變量:
$ sudo vim /etc/profile // 設置全局變量, 不配置的話只能命令所在的文件夾下運行添加如下代碼:
export HADOOP_HOME=/usr/local/hadoop export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib" export PATH=$HADOOP_HOME/bin:$PATH如果出現鏈接錯誤請關閉防火墻:
service iptables save service iptables stop chkconfig iptables off1 單機安裝部署
Hadoop 默認模式為非分布式模式,無需進行其他配置即可運行。非分布式即單 Java 進程,方便進行調試。( 可以運行 bin 下的命令, 但不能用 sbin 下的start-all.sh ) , 比如可以用 bin/hadoop version 查看hadoop版本號.
也可以按如下配置Hadoop.
?
配置Hadoop
更改/usr/local/hadoop/etc/hadoop下的 hadoop-env.sh 文件。(我的jdk也是安裝在/usr/lib/jvm下的), 還可以修改 mapred-env.sh 以及 yarn-env.sh 文件
#The java implementation to use. #export JAVA_HOME=${JAVA_HOME} export JAVA_HOME=/usr/lib/jvm/javacore-site.xml文件配置
<configuration><property><name>fs.default.name</name><value>hdfs://localhost:9000</value></property></configuration>hdfs-site.xml文件配置
<--更改hadoop默認的副本個數,由于我們是單節點所以改為只有一個副本就好--><configuration><property><name>dfs.replication</name><value>1</value></property></configuration>mapred-site.xml文件配置
<configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property></configuration>yarn-site.xml文件配置
<configuration><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property></configuration>?
2 偽分布式安裝部署
? Hadoop 可以在單節點上以偽分布式的方式運行,Hadoop 進程以分離的 Java 進程來運行,節點既作為 NameNode 也作為 DataNode,同時,讀取的是 HDFS 中的文件。Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,偽分布式需要修改2個配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每個配置以聲明 property 的 name 和 value 的方式來實現。
配置Hadoop
更改/usr/local/hadoop/etc/hadoop下的 hadoop-env.sh 文件。(我的jdk也是安裝在/usr/lib/jvm下的), 還可以修改 mapred-env.sh 以及 yarn-env.sh 文件
#The java implementation to use. #export JAVA_HOME=${JAVA_HOME} export JAVA_HOME=/usr/lib/jvm/java core-site.xml文件配置?? ( 為hdfs的工作目錄(可以不設)默認為hadoop的tmp目錄下(重啟后數據就會消失下次還得重新格式化) )
<property><name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property><property><name>hadoop.tmp.dir</name><value>file:/usr/local/hadoop/tmp</value><description>Abase for other temporary directories.</description></property></configuration>
hdfs-site.xml文件配置
<configuration><property><name>dfs.replication</name><value>1</value></property><property><name>dfs.namenode.name.dir</name><value>file:/usr/local/hadoop/tmp/dfs/name</value></property><property><name>dfs.datanode.data.dir</name><value>file:/usr/local/hadoop/tmp/dfs/data</value></property></configuration>mapred-site.xml文件配置
<configuration><property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>yarn-site.xml文件配置
<configuration><property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>配置完成后,執行 NameNode 的格式化:( 只能進行一次格式化, 否則會出錯 )
$ ./bin/hdfs namenode -format成功的話,會看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若為 “Exitting with status 1” 則是出錯。
如果在這一步時提示 Error: JAVA_HOME is not set and could not be found. 的錯誤,則說明之前設置 JAVA_HOME 環境變量那邊就沒設置好,請按教程先設置好 JAVA_HOME 變量,否則后面的過程都是進行不下去的。
接著開啟所有的守護進程。
$ ./sbin/start-all.sh若出現如下SSH提示,輸入yes即可。
啟動時可能會出現如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable。該 WARN 提示可以忽略,并不會影響正常使用(該 WARN 可以通過編譯 Hadoop 源碼解決)。
啟動完成后,可以通過命令 jps 來判斷是否成功啟動,若成功啟動則會列出如下進程: “NameNode”、”DataNode” 和 “SecondaryNameNode” , "ResourceManager" 和 "NodeManager"(如果 SecondaryNameNode 沒有啟動,請運行 sbin/stop-all.sh 關閉進程,然后再次嘗試啟動嘗試)。如果沒有 NameNode 或 DataNode ,那就是配置不成功,請仔細檢查之前步驟,或通過查看啟動日志排查原因。
成功啟動后,可以訪問 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,還可以在線查看 HDFS 中的文件。 ( 類似下圖的效果 )
?
3 全分布式安裝部署
包括單臺機器的虛擬機部署以及多個節點(即多臺機器)的部署
?
3.1 單臺機器的虛擬機安裝部署
hadoop學習通過虛擬機安裝hadoop完全分布式集群 ,? 虛擬機安裝 Hadoop? , VM虛擬機CentOS下hadoop集群安裝過程 , ?全分布式的Hadoop虛擬機安裝 ,?
3.2 多個節點(即多臺機器)的安裝部署
這個和虛擬機安裝部署類似,只不過是虛擬機是一臺機器虛擬出多臺機器, 而多臺機器的安裝是實實在在的有多個機器.
3.1 和 3.2 如下所式: ( 3.1 比3.2 多出? 安裝Vmware WorkStation軟件 以及? 在虛擬機上安裝linux操作系統 )
準備4個(虛擬)機器節點
配置好jdk以及ssh免密碼登錄之后. 一般HDFS的文件塊默認是3個備份, 所有至少有3個節點. 而且用戶名最好保持一致, 我的用戶名設置為 hadoop ,我這里有4臺機器,所以,在準備好這4個結點之后,需要分別將linux系統的主機名重命名,重命名主機名的方法:
$ vim /etc/hostname通過修改hostname文件即可,這4個點結均要修改,以示區分:
以下是我對4個結點的ubuntu系統主機分別命名為:master, node1, node2, node3
安裝過程主要有以下幾個步驟:
(1) 配置hosts文件
(2) 建立hadoop運行帳號
(3) 配置ssh免密碼連入
(4) 下載并解壓hadoop安裝包
(5) 配置namenode,修改site文件
(6) 配置hadoop-env.sh文件
(7) 配置masters和slaves文件
(8) 向各節點復制hadoop
(9) 格式化namenode
(10) 啟動hadoop
(11) 用jps檢驗各后臺進程是否成功啟動
(12) 通過網站查看集群情況
下面我們對以上過程,各個擊破吧!~~
?
(1) 配置hosts文件 ( /etc/hosts )
先簡單說明下配置hosts文件的作用,它主要用于確定每個結點的IP地址,方便后續master結點能快速查到并訪問各個結點。在上述4個(虛擬機)結點上均需要配置此文件。由于需要確定每個結點的IP地址,所以在配置hosts文件之前需要先查看當前虛機結點的IP地址是多少,可以通過ifconfig命令進行查看,( 假設所有主機都在192.168.1.X 網段內 )如實驗中,master結點的IP地址為:192.168.1.100, node1結點的IP地址為:192.168.1.101,?node2結點的IP地址為:192.168.1.102,?node3結點的IP地址為:192.168.1.103.?
如果IP地址不對,可以通過ifconfig命令更改結點的物理IP地址,示例如下:
hadoop@master:~$ sudo ifconfig eth0 192.168.1.100 通過上面命令可以將IP改為192.168.1.100。如果覺得這樣做麻煩,可以固定IP. 將每個結點的IP地址設置完成后,就可以配置hosts文件了,hosts文件路徑為 /etc/hosts,我的hosts文件配置如下,大家可以參考自己的IP地址以及相應的主機名完成配置, 每臺機器都一樣,這里以master主機為例:
(2) 建立hadoop運行帳號
即為hadoop集群專門設置一個用戶組及用戶,這部分比較簡單,參考示例如下:
$ sudo groupadd hadoop //設置hadoop用戶組 $ sudo useradd –s /bin/bash –d /home/hadoop –m hadoop –g hadoop –G admin //添加一個hadoop用戶,此用戶屬于hadoop用戶組,且具有admin權限。 $ sudo passwd hadoop //設置用戶hadoop登錄密碼 $ su hadoop //切換到hadoop用戶中上述4個虛機結點均需要進行以上步驟來完成hadoop運行帳號的建立。
(3) 配置ssh免密碼連入
這一環節最為重要,而且也最為關鍵,因為本人在這一步驟裁了不少跟頭,走了不少彎路,如果這一步走成功了,后面環節進行的也會比較順利。 SSH主要通過RSA算法來產生公鑰與私鑰,在數據傳輸過程中對數據進行加密來保障數據的安全性和可靠性,公鑰部分是公共部分,網絡上任一結點均可以訪問,私鑰主要用于對數據進行加密,以防他人盜取數據。總而言之,這是一種非對稱算法,想要破解還是非常有難度的。Hadoop集群的各個結點之間需要進行數據的訪問,被訪問的結點對于訪問用戶結點的可靠性必須進行驗證, hadoop采用的是ssh的方法通過密鑰驗證及數據加解密的方式進行遠程安全登錄操作,當然,如果hadoop對每個結點的訪問均需要進行驗證,其效率將會大大降低,所以才需要配置SSH免密碼的方法直接遠程連入被訪問結點,這樣將大大提高訪問效率。
OK,廢話就不說了,下面看看如何配置SSH免密碼登錄吧!~~
參見 ssh 免密碼登錄? , ssh 免密碼登錄1 , ssh 免密碼登錄2? ,其中在第一個鏈接 ssh 免密碼登錄 中, 缺少 修改SSH配置文件? su root? -->登陸root用戶修改配置文件? vim /etc/ssh/sshd_config -->去掉下圖中三行的注釋
下面是我的配置:?
(1) 生成公鑰和私鑰?
在每臺機器上
$ ssh-keygen // 等同于ssh-keygen -t rsa運行上面的命令后,系統會出現一系列提示,可以一路回車,例如:
$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/glowd/.ssh/id_rsa): Enter // 特別說明,要不要對私鑰設置口令(passphrase),如果擔心私鑰的安全,可以設置一個。沒有特殊需求直接Enter,為空 運行結束以后, 默認在 ~/.ssh目錄生成兩個文件:
id_rsa :私鑰
id_rsa.pub :公鑰
(2) 導入公鑰到認證文件,更改權限
導入本機
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys導入本機后就可以無密碼登錄localhost
$ ssh localhost導入要免密碼登錄的服務器, 我們以 master (192.168.1.100 ) 和 node1(192.168.1.101 ) 為例, 這之前已經設置/etc/hosts ,讓主機名和IP對應, 這樣主機名既是IP, 否則下面的主機名要用IP 代替.?
要想 node1 免密碼登錄 master, 首先將 node1 的公鑰復制到遠端服務器 master,用戶為hadoop . 把node1機下的id_rsa.pub復制到master機下,在master機的.ssh/authorized_keys文件里,我用scp復制。
$ scp ~/.ssh/id_rsa.pub hadoop@master:~由于還沒有免密碼登錄的,所以要輸入密碼。
在服務器上master上, master 機把從 node1 機復制的id_rsa.pub添加到.ssh/authorzied_keys文件里。
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys $ rm ~/id_rsa.pub -->保險起見,刪除傳過來的公鑰在服務器master上更改權限(必須),?authorized_keys的權限要是600。
$ chmod 755 ~ $ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys以上執行之后,有些機器應該可以直接訪問了,可以測試一下. node1 機登錄 master 機。 ( 用戶名相同的話, 可以直接用IP, 否則要用?ssh hadoop@master )
ssh 192.168.1.100 #ssh master 第一次登錄是時要你輸入yes。
現在 node1 機可以無密碼登錄 master 機了。
同理, 要想 master 也免密碼登錄 node1 , 只需要執行相同的操作,
要想 master 免密碼登錄 node1, 首先將 master 的公鑰復制到遠端服務器 node1,用戶為hadoop . 把master機下的id_rsa.pub復制到node1 機下,在node1機的.ssh/authorized_keys文件里,我用scp復制。
$ scp ~/.ssh/id_rsa.pub hadoop@node1:~由于還沒有免密碼登錄的,所以要輸入密碼。
在服務器上node1上, node1 機把從 master 機復制的id_rsa.pub添加到.ssh/authorzied_keys文件里。
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys $ rm ~/id_rsa.pub -->保險起見,刪除傳過來的公鑰在服務器node1上更改權限(必須),?authorized_keys的權限要是600。
$ chmod 755 ~ $ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys以上執行之后,有些機器應該可以直接訪問了,可以測試一下. master 機登錄 node1 機。 ( 用戶名相同的話, 可以直接用IP, 否則要用?ssh hadoop@node1 )
ssh 192.168.1.101 # ssh node1 第一次登錄是時要你輸入yes。
現在 master 機可以無密碼登錄 node1 機了。
這樣, 這兩臺機器就可以相互免密碼登錄了.
(3) 常見問題及解決方案
生成密鑰并上傳至遠程主機后,任然不可用.
這時打開服務器的 /etc/ssh/sshd_config 這個文件,取消注釋。
重啟服務器的ssh服務。
#RHEL/CentOS系統 $ service sshd restart #ubuntu系統 $ service ssh restart #debian系統 $ /etc/init.d/ssh restart執行ssh-copy-id 命令
$ ssh-copy-id glowd@{remote ip}#`如果不是默認端口22,是9001` $ ssh-copy-id -p 9001 glowd@{remote ip}.....
? 還有就是你的host key has just been changed,即主機碼變了,比如node1的變了,那么node2鏈接node1就會出問題,這時候就需要把node2中的node1的碼刪除再重新添加。刪除方法如下:
ssh-keygen -f "/home/hadoop/.ssh/known_hosts" -R node1(4) 前面搞定了免密碼登錄,想想也是很激動了。但是,還要寫ip,還要寫用戶名,是不是又有點不爽啦。搞定用戶名和端口號
找到 ~/.ssh/config 文件,如果木有的話就自個兒建一個吧,內容如下:
Host {remote ip} User {username} Port {port}現在連接就很簡單了
$ ssh {remote ip}(4) 下載并解壓hadoop安裝包
前面已經下好了
(5) 配置? namenode,修改site文件
先完成JDK配置, 在設置JDK 以及 Hadoop 的全局環境變量. 到目前為止,準備工作已經完成,下面開始修改hadoop的配置文件了,即各種site文件,文件存放在/hadoop/etc/hadoop下,主要配置core-site.xml、hdfs-site.xml、mapred-site.xml 以及 yarn-site.xml 這四個文件。
core-site.xml文件配置
<configuration><property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> <property> <name>fs.default.name</name> <value>hdfs://master:9000</value> </property> </configuration>hdfs-site.xml文件配置
<configuration><property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property><property>
??????? <name>dfs.namenode.http-address</name>
??????? <value>Master:50070</value>
??? </property> </configuration>
mapred-site.xml文件配置
<configuration><property> <name>mapreduce.framework.name</name> <value>yarn</value> </property><property>
??????? <name>mapreduce.jobhistory.address</name>
??????? <value>Master:10020</value>
??? </property>
??? <property>
??????? <name>mapreduce.jobhistory.webapp.address</name>
??????? <value>Master:19888</value>
??? </property> </configuration>
yarn-site.xml文件配置
<configuration><property>
??????? <name>yarn.resourcemanager.hostname</name>
??????? <value>master</value>
??? </property><property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
<property>
??????? <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
??????? <value>org.apache.hadoop.mapred.ShuffleHandler</value>
??? </property>
??? <property> ?
??????? <name>yarn.log-aggregation-enable</name> ?
??????? <value>true</value> ?
??????? <description>Configuration to enable or disable log aggregation</description>?? ?
??? </property> </configuration>
(6) 配置hadoop-env.sh文件
更改/usr/local/hadoop/etc/hadoop下的 hadoop-env.sh 文件。(我的jdk也是安裝在/usr/lib/jvm下的), 還可以修改 mapred-env.sh 以及 yarn-env.sh 文件
#The java implementation to use. #export JAVA_HOME=${JAVA_HOME} export JAVA_HOME=/usr/lib/jvm/java
(7) 配置slaves文件 (在 /usr/local/hadoop/etc/hadoop 下)
slaves文件里默認有localhost , 修改成如下:
# localhost master #可有可無, 有的話 master 既是主節點也作從節點,存儲HDFS數據塊. 沒有的話,master只是主節點, 不進行數據塊存儲. node1 node2 node3?
(8) 向各節點復制hadoop ( 假設以上的hadoop 配置文件都是在 master 上配置)
這時向 node1, node2 以及 node3 節點復制hadoop: ( 以 node1 為例 )
然后進入 node1 , 把 hadoop 移動到 相應的位置, 在退出
$ ssh node1 $ sudo mv hadoop /usr/local/hadoop $ exit然后 node2 以及 node3 同樣.
這樣,結點 node1 和結點 node2 以及 node3 也安裝了配置好的hadoop軟件了。
(9) 格式化namenode
一定要在主節點 master 上進行格式化, 而且只能進行一次, 否則會出錯. 我們已經配置hadoop為全局變量.
$ hadoop namenode -format #如果沒有設置全局變量,在 /usr/local/hadoop 目錄下輸入 ./bin/hadoop namenode -format注意:成功的話,會看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若為 “Exitting with status 1” 則是出錯。
如果在這一步時提示 Error: JAVA_HOME is not set and could not be found. 的錯誤,則說明之前設置 JAVA_HOME 環境變量那邊就沒設置好,請按教程先設置好 JAVA_HOME 變量,否則后面的過程都是進行不下去的。
(10) 啟動hadoop
這一步也在主結點master上進行操作:
$ start-all.sh #如果沒有設置全局變量,在 /usr/local/hadoop 目錄下輸入 ./sbin/start-all.sh
(11) 用jps檢驗各后臺進程是否成功啟動
在主結點master上查看namenode,resourcemanager,secondarynamenode進程是否啟動。
$ jps如果出現以上進程則表示正確。
在 node1 和 node2 以及 node3 結點了查看nodemanager和datanode進程是否啟動。 ( 以node1 為例 )
$ jps如果出現以上進程則表示正確。 node2 和 node3 也是 .
進程都啟動成功了。恭喜~~~
?
(12) 通過網站查看集群情況
在瀏覽器中輸入:http://192.168.1.100:50030,網址為master結點所對應的IP: ( http://master:50030 ,這兩個等同)
?
在瀏覽器中輸入:http://192.168.1.100:50070,網址為master結點所對應的IP:
?
在瀏覽器中輸入:http://192.168.1.100:8088,網址為master結點所對應的IP:
?
至此,hadoop的完全分布式集群安裝已經全部完成,
?
?
?
轉載于:https://www.cnblogs.com/zhangchao0515/p/7097463.html
總結
以上是生活随笔為你收集整理的hadoop2 Ubuntu 下安装部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 矩阵式键盘
- 下一篇: pcb设计单点接地示意图_答案:关于PC