① 如何搭建hadoop集群 橋接
本文通過在vmware workstation上建立三台虛擬機來搭建hadoop集群環境,其中一台作為namenode,兩台作為datanode。
一、安裝vmware workstation(10.0.0)(一路下一步即可)
二、創建3個虛擬機
每個虛擬機安裝Ubuntu 桌面版(我用的11.10,但是有點老了,建議用12.04或更高版本)
namenode建議多給寫內存,我的是namenode 1G內存,20G硬碟,datanode 800M內存,20G硬碟(我電腦內存8G,若內存不夠可以少分點,但是可能有些卡)上網上式可設置為橋接方式:直接連接物理網路。
三、安裝vmware tools(便於主機和虛擬機直接可以直接拖拽,復制粘貼)
點擊vmware 上 虛擬機-》安裝VMware tools,自動打開一個包含vmware安裝包的位置,可以拷貝到你有許可權的地方,例如/usr/src下用 sudo tar zxvf 軟體包名稱 解壓,之後進入解壓後的文件夾,執行
sudo ./vmware-install.sh來安裝,過程中遇見yes或no一律enter鍵,安裝後重啟生效。
四、配置共享目錄(讓主機和虛擬機直接方便實時共享)
對每個虛擬機,點擊vmware上虛擬機-》設置-》選項,選擇共享文件夾,永久共享,添加一個本機的目錄所為共享目錄,並為這個共享起一個名字,例如叫share。這樣在虛擬機上的 /mnt/hgfs下會自動生成share文件夾保持與主機上的目錄實時一致。重啟生效,有時生效較慢,多重啟幾次就行了,不知何故。
五,安裝ssh,為了一會的免密碼登陸
對每台虛擬機運行:sudo apt-get install openssh-server
若不成功,你可能需要更新一下資源列表了:sudo apt-get update
六、配置ssh無密碼登錄,方便namenode給datanode分配任務和匯總信息
說明:以下生成的秘鑰默認保存在用戶名空間,所以建議三台虛擬機建立同樣的用戶名,例如hadoop,也可以都用root用戶。
在name node,和datanode都運行:
ssh-keygen –t dsa -P '' –f ~/.ssh/id_dsa (建議手打此命令,復制有時候不行,注意都是英文字元,-P的P是大寫)
下面將三台虛擬機的公鑰拷貝到共享目錄中並重命名以供彼此配置使用
在name node:
scp ~/.ssh/id_dsa.pub /mnt/hgfs/share/ id_dsa0.pub
在data node 1:
scp ~/.ssh/id_dsa.pub /mnt/hgfs/share/ id_dsa1.pub
在data node 2:
scp ~/.ssh/id_dsa.pub /mnt/hgfs/share/ id_dsa2.pub
將共享目錄中公鑰分別添加到三台虛擬機的授權下,分別在name node,data node 1和data node 2執行:
cat /mnt/hgfs/share/id_dsa0.pub >> ~/.ssh/authorized_keys
cat /mnt/hgfs/share/id_dsa1.pub >> ~/.ssh/authorized_keys
cat /mnt/hgfs/share/id_dsa2.pub >> ~/.ssh/authorized_keys
測試:
ssh localhost
ssh 目標機器地址
七,安裝jdk
對每個虛擬機:
下載jdk(jdk1.6.0)並解壓,假定目錄為/usr/src/jdk1.6.0(如果你的不是,也可以改成是,這樣下面的命令直接復制就行了)
設置環境變數。
#vi /etc/profile
在最後面加入
#set java environment
export JAVA_HOME=/usr/src/jdk1.6.0
export CLASSPATH=.:$JAVA_HOME/lib.tools.jar
export PATH=$JAVA_HOME/bin:$PATH
保存退出。
要使JDK在所有的用戶中使用,可以這樣:
vi /etc/profile.d/java.sh
在新的java.sh中輸入以下內容:
#set java environment
export JAVA_HOME=/usr/src/jdk1.6.0
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
保存退出,然後給java.sh分配許可權:chmod 755 /etc/profile.d/java.sh
重啟虛擬機
八、安裝hadoop
在usr/src目錄解壓: tar zxvf hadoop-0.20.2.tar.gz
把hadoop的安裝路徑添加到/etc/profile中:
export HADOOP_HOME=/usr/src/hadoop-0.20.2
export PATH=$HADOOP_HOME/bin:$PATH
九、配置hadoop
在hadoop-0.20.1/conf目錄:
(1)對3個虛擬機,在conf/hadoop-env.sh中配置java環境
vi hadoop-env.sh
在hadoop-env.sh文件中添加
export JAVA_HOME=/usr/src/jdk1.6.0
(2) 用ifconfig命令查看ip地址,假定name node內部地址為192.168.204.157,data node 1和data node 2分別為192.168.204.162,192.168.204.173
對name node配置conf/masters和conf/slaves:
masters : 192.168.204.157
slaves : 192.168.204.162
192.168.204.173
(3)對name node, data node 1和data node2,配置conf/core-site.xml, conf/hdfs-site.xml及conf/mapred-site.xml,配置文件內的IP地址均配置為name node的IP地址(比如name node IP地址為192.168.204.157。
說明:因為三台上面這三個配置一樣,所以配置一份,然後復制粘貼即可。
(又說明:下面之所以上圖片是因為,新浪會把字元按html重新編譯,無法正常顯示,無奈啊)
十、運行hadoop
先把三台虛擬機的防火牆關了: sudo ufw disable
對name node:
進入hadoop-0.20.2/bin,首先格式化文件系統: hadoop namenode –format
對data node1 和data node 2:
進入hadoop-0.20.2/bin,執行: hadoop datanode –format
對name node:,在bin目錄下執行:
start-all.sh
hadoop dfsadmin –safemode leave
hadoop dfsadmin –report, 查看節點情況,看到類似界面顯示available的Datanodes 。
用jps命令查看進程,NameNode上的結果為:
26745 JobTracker
29398 jps
27664 NameNode
Data Node 1 的結果:
6718 TaskTracker
6042 DataNode
6750 jps
Data Node 2 的結果:
12173 TaskTracker
10760 DataNode
12700 jps
至此,安裝成功。
② 怎麼搭建兩個hadoop集群的測試環境
環境配置:
虛擬機:
vmware workstation 12
系統:
ubuntu 16.04 LTS(推薦使用原版,不要用kylin)
節點: 192.168.159.132 master 192.168.159.134 node1 192.168.159.137 node2
jdk-8u101-Linux-x64.gz (Java)hadoop-2.7.3.tar.gz (Hadoop 包)
安裝步驟:
1、安裝虛擬機系統,並進行准備工作(可安裝一個然後克隆)
2.修改各個虛擬機的hostname和host
3.創建用戶組和用戶
4、配置虛擬機網路,使虛擬機系統之間以及和host主機之間可以通過相互ping通。
5.安裝jdk和配置環境變數,檢查是否配置成功
6、配置ssh,實現節點間的無密碼登錄 ssh node1/2指令驗證時候成功
7、master配置hadoop,並將hadoop文件傳輸到node節點
8、配置環境變數,並啟動hadoop,檢查是否安裝成功,執行wordcount檢查是否成功。
1.安裝虛擬機
在VM上安裝下載好的Ubuntu的系統,具體過程自行網路。可以安裝完一個以後克隆,但是本人安裝過程中遇到很多問題,經常需要刪除虛擬機,重新安裝,而被克隆的虛擬機不能刪除,所以本人就用了很長時候,一個一個安裝。
一共3台虛擬機:分配情況和IP地址如下:
(註:查看ip地址的指令 ifconfig)
安裝虛擬機時可以設置靜態IP,因為過程中常常遇到網路連接問題,ifconfig找不到IPV4地址。當然,也可以不設,默認分配。
192.168.159.132 master 192.168.159.134 node1 192.168.159.137 node2
2.修改虛擬機的hostname和hosts文件
以master上機器為例,打開終端,執行如下的操作,把hostname修改成master,hosts修改成如下所示的樣子:
#修改hostname的指令:sudo gedit /etc/hostname
#修改hosts指令:sudo gedit /etc/hosts
#將以下內容添加到hosts中192.168.159.132 master192.168.159.134 node1192.168.159.137 node2
如下圖所示:
自此,hadoop集群搭建成功!
③ 如何使用vagrant在虛擬機安裝hadoop集群
vagrant 是一個非常好用的工具,可以用它來在單台物理機器編程管理多個虛擬機(vms)。其支持原生VirtualBox,並同時提供了對VMware Fusion、Amazon EC2虛擬機集群的插件支持。
vagrant提供了極易使用、基於Ruby的內部DSL,允許用戶使用它們的配置參數定義一個或多個虛擬機。另外,對於自動部署,vagrant支持多種機制:可以使用puppet,chef或者用於在vagrant配置文件中定義的所有虛擬機上自動安裝軟體程序和配置的shell腳本等。
所以,使用vagrant可以在運行著多台vm的系統上定義復雜的虛擬框架,是不是很酷?
vagrant的典型使用案例是以簡單並且一致的方式構建工作或者開發環境。在Eligotech(原作者公司)公司里,開發人員正在開發一個產品,目標是讓用戶簡單的使用Apache Hadoop、CDH(Cloudera的開源版本)。開發人員經常是為了測試需要在機器上安裝hadoop環境。他們發現vagrant在這方面是一個非常便利的工具。
一個vagrant配置文件的例子,你們可以自行測試。你需要下載並安裝vagrant(幫助地址http://docs.vagrantup.com/v2/installation/index.html)和virtualBox。所有東西都安裝完畢後即可復制粘貼下面的文本保存為Vagrantfile,並將其放到一個目錄下,比如VagrantHadoop.這個配置文件假定你機器內存至少32G,如果不適合可以自行編輯該文件。
#-*-mode:ruby-*-
#vi:setft=ruby:
$master_script=<<SCRIPT
#!/bin/bash
cat>/etc/hosts<<EOF
127.0.0.1localhost
#
::1ip6-localhostip6-loopback
fe00::0ip6-localnet
ff00::0ip6-mcastprefix
ff02::1ip6-allnodes
ff02::2ip6-allrouters
10.211.55.100vm-cluster-node1
10.211.55.101vm-cluster-node2
10.211.55.102vm-cluster-node3
10.211.55.103vm-cluster-node4
10.211.55.104vm-cluster-node5
10.211.55.105vm-cluster-client
EOF
apt-getinstallcurl-y
REPOCM=${REPOCM:-cm4}
CM_REPO_HOST=${CM_REPO_HOST:-archive.cloudera.com}
CM_MAJOR_VERSION=$(echo$REPOCM|sed-e's/cm\([0-9]\).*/\1/')
CM_VERSION=$(echo$REPOCM|sed-e's/cm\([0-9][0-9]*\)/\1/')
OS_CODENAME=$(lsb_release-sc)
OS_DISTID=$(lsb_release-si|tr'[A-Z]''[a-z]')
if[$CM_MAJOR_VERSION-ge4];then
cat>/etc/apt/sources.list.d/cloudera-$REPOCM.list<<EOF
deb[arch=amd64]http://$CM_REPO_HOST/cm$CM_MAJOR_VERSION/$OS_DISTID/$OS_CODENAME/amd64/cm$OS_CODENAME-$REPOCMcontrib
deb-srchttp://$CM_REPO_HOST/cm$CM_MAJOR_VERSION/$OS_DISTID/$OS_CODENAME/amd64/cm$OS_CODENAME-$REPOCMcontrib
EOF
curl-shttp://$CM_REPO_HOST/cm$CM_MAJOR_VERSION/$OS_DISTID/$OS_CODENAME/amd64/cm/archive.key>key
apt-keyaddkey
rmkey
fi
apt-getupdate
exportDEBIAN_FRONTEND=noninteractive
apt-get-q-y--force-yesinstallOracle-j2sdk1.6cloudera-manager-server-dbcloudera-manager-servercloudera-manager-daemons
servicecloudera-scm-server-dbinitdb
servicecloudera-scm-server-dbstart
servicecloudera-scm-serverstart
SCRIPT
$slave_script=<<SCRIPT
cat>/etc/hosts<<EOF
127.0.0.1localhost
#
::1ip6-localhostip6-loopback
fe00::0ip6-localnet
ff00::0ip6-mcastprefix
ff02::1ip6-allnodes
ff02::2ip6-allrouters
10.211.55.100vm-cluster-node1
10.211.55.101vm-cluster-node2
10.211.55.102vm-cluster-node3
10.211.55.103vm-cluster-node4
10.211.55.104vm-cluster-node5
10.211.55.105vm-cluster-client
EOF
SCRIPT
$client_script=<<SCRIPT
cat>/etc/hosts<<EOF
127.0.0.1localhost
#
::1ip6-localhostip6-loopback
fe00::0ip6-localnet
ff00::0ip6-mcastprefix
ff02::1ip6-allnodes
ff02::2ip6-allrouters
10.211.55.100vm-cluster-node1
10.211.55.101vm-cluster-node2
10.211.55.102vm-cluster-node3
10.211.55.103vm-cluster-node4
10.211.55.104vm-cluster-node5
10.211.55.105vm-cluster-client
EOF
SCRIPT
Vagrant.configure("2")do|config|
config.vm.define:masterdo|master|
master.vm.box="precise64"
master.vm.provider"vmware_fusion"do|v|
v.vmx["memsize"]="4096"
end
master.vm.provider:virtualboxdo|v|
v.name="vm-cluster-node1"
v.customize["modifyvm",:id,"--memory","4096"]
end
master.vm.network:private_network,ip:"10.211.55.100"
master.vm.hostname="vm-cluster-node1"
master.vm.provision:shell,:inline=>$master_script
end
config.vm.define:slave1do|slave1|
slave1.vm.box="precise64"
slave1.vm.provider"vmware_fusion"do|v|
v.vmx["memsize"]="5120"
end
slave1.vm.provider:virtualboxdo|v|
v.name="vm-cluster-node2"
v.customize["modifyvm",:id,"--memory","5120"]
end
slave1.vm.network:private_network,ip:"10.211.55.101"
slave1.vm.hostname="vm-cluster-node2"
slave1.vm.provision:shell,:inline=>$slave_script
end
config.vm.define:slave2do|slave2|
slave2.vm.box="precise64"
slave2.vm.provider"vmware_fusion"do|v|
v.vmx["memsize"]="5120"
end
slave2.vm.provider:virtualboxdo|v|
v.name="vm-cluster-node3"
v.customize["modifyvm",:id,"--memory","5120"]
end
slave2.vm.network:private_network,ip:"10.211.55.102"
slave2.vm.hostname="vm-cluster-node3"
slave2.vm.provision:shell,:inline=>$slave_script
end
config.vm.define:slave3do|slave3|
slave3.vm.box="precise64"
slave3.vm.provider"vmware_fusion"do|v|
v.vmx["memsize"]="5120"
end
slave3.vm.provider:virtualboxdo|v|
v.name="vm-cluster-node4"
v.customize["modifyvm",:id,"--memory","5120"]
end
slave3.vm.network:private_network,ip:"10.211.55.103"
slave3.vm.hostname="vm-cluster-node4"
slave3.vm.provision:shell,:inline=>$slave_script
end
config.vm.define:slave4do|slave4|
slave4.vm.box="precise64"
slave4.vm.provider"vmware_fusion"do|v|
v.vmx["memsize"]="5120"
end
slave4.vm.provider:virtualboxdo|v|
v.name="vm-cluster-node5"
v.customize["modifyvm",:id,"--memory","5120"]
end
slave4.vm.network:private_network,ip:"10.211.55.104"
slave4.vm.hostname="vm-cluster-node5"
slave4.vm.provision:shell,:inline=>$slave_script
end
config.vm.define:clientdo|client|
client.vm.box="precise64"
client.vm.provider"vmware_fusion"do|v|
v.vmx["memsize"]="4096"
end
client.vm.provider:virtualboxdo|v|
v.name="vm-cluster-client"
v.customize["modifyvm",:id,"--memory","4096"]
end
client.vm.network:private_network,ip:"10.211.55.105"
client.vm.hostname="vm-cluster-client"
client.vm.provision:shell,:inline=>$client_script
end
end