
文/胡晨川
我是Linux外行,hadoop外行,java更外行,Scala聽(tīng)也沒(méi)聽(tīng)過(guò),在我腦海中,Spark一直只是我的英文名。但是,作為一名數(shù)據(jù)分析師,我怎么可以完全不了解大數(shù)據(jù)的應(yīng)用呢?于是,完全是外行的我,不僅打算開(kāi)始學(xué)習(xí)spark,還要將hive、pig、Hbase等都嘗一嘗。
第一步,從hadoop開(kāi)始!經(jīng)過(guò)幾天的嘗試,配置好了虛擬機(jī)中的完全分布式hadoop,寫(xiě)成以下冗長(zhǎng)的筆記。
首先,是在自己的電腦上安裝3個(gè)Linux系統(tǒng)的虛擬機(jī)
我是Mac,裝了vmware fusion。在另一臺(tái)pc機(jī)上,裝了vmware workstation。
Linux我選擇了ubuntu14。具體怎么把Linux裝起來(lái)的不多說(shuō)了,傻瓜式操作。
配置Linux
這部分分為三個(gè)部分:一是獲得Linux的root權(quán)限;二是安裝java;三是設(shè)置ssh設(shè)置。由于我是Linux文盲,所以將一些命令標(biāo)注會(huì)擇機(jī)寫(xiě)出來(lái),便于我以后記憶。
我配置的三臺(tái)Linux機(jī)子分別命名為:master、slave1、slave2。未來(lái)hadoop中,master就是主節(jié)點(diǎn),兩臺(tái)slave就是從節(jié)點(diǎn)。
獲取Linux中的root權(quán)限
在ubuntu中打開(kāi)命令終端窗口:control+alt+T
自動(dòng)補(bǔ)全命令:tab
看幫助內(nèi)容:--help
先安裝vim:sudo apt-get install vim
然后輸入:sudo vim /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf(vim需安裝)
在彈出的編輯框里輸入:greeter-show-manual-login=true 保存關(guān)閉。
為了給root設(shè)置密碼,在終端中輸入:sudo passwd root。
關(guān)機(jī)重啟在多出的登錄框里輸入root 和設(shè)置的密碼!
在剛修改完root權(quán)限自動(dòng)登錄后,發(fā)現(xiàn)開(kāi)機(jī)出現(xiàn)以下提示:
Error found when loading /root/.profile
stdin:is not a tty
…………
解決方法:在終端中用命令gedit /root/.profile,打開(kāi)文件后找到“mesg n”,
將其更改為“tty -s && mesg n”。
sudo:超級(jí)用戶(hù)權(quán)限命令=root權(quán)限
apt-get install:安裝軟件
vim:vim是一個(gè)編輯器和gedit功能一樣
安裝java
創(chuàng)建安裝java的文件夾:mkdir /usr/lib/java
然后把下載好的java安裝包放到這個(gè)目錄里
操作區(qū)域定位到j(luò)ava文件夾:cd /usr/lib/java
解壓安裝包:tar -xvf jdk-8u73-linux-x64.gz
修改環(huán)境變量:vim ~/.bashrc
在bashrc文件中添加內(nèi)容:
export JAVA_HOME=/usr/lib/java/jdk1.8.0_73
export JRE_HOME=${JAVA_HOME}/jre
export CLASS_PATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
執(zhí)行生效命令:source ~/.bashrc
查看java版本:java -version
mkdir:創(chuàng)建文件夾命令
cd:工作目錄定位命令,經(jīng)常與文件查看命令ls一起用
tar -xvf:解壓縮命令
SSH設(shè)置
安裝ssh:apt-get install ssh
安裝rsync: apt-get install rsync
創(chuàng)建ssh-key: ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
將dsa.pub文件當(dāng)中的內(nèi)容追加到公鑰中:cat ~/.ssh/id_dsa.pub >> /.ssh/authorized_keys
authorized_keys得放在.ssh文件夾當(dāng)中,并將id_dsa.pub里面的內(nèi)容復(fù)制給authorized_keys
啟動(dòng)ssh服務(wù):ssh start
驗(yàn)證服務(wù)是否正常啟動(dòng):ps -e |grep ssh
在slave機(jī)器下也要?jiǎng)?chuàng)建ssh-key: ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
該命令執(zhí)行后,會(huì)在root文件夾下出現(xiàn).ssh文件夾,里面有key
cat ~/.ssh/id_dsa.pub >> authorized_keys 這行代碼至關(guān)重要,當(dāng)輸入ssh localhost 不需要密碼時(shí),說(shuō)明免密碼登錄設(shè)置完成。
完成master與slave之間的通信
首先,要固定好master和slave的IP地址,千萬(wàn)不要選擇動(dòng)態(tài)匹配,你會(huì)奔潰的。
接著,修改集群中的host配置文件
打開(kāi)命令:到文件夾中手動(dòng)打開(kāi)host文件或者輸入:
vim /etc/hosts
添加:
192.168.236.135 master
192.168.236.134 slave1
192.168.236.130 slave2
關(guān)閉ubuntu的防火墻,使得ssh通訊能夠進(jìn)行:ufw allow ssh
要使得master和slave之間實(shí)現(xiàn)免密碼通信,還要把master機(jī)器中的id_dsa.pub 文件復(fù)制到slave機(jī)器的.ssh文件夾中,并命名為authorized_keys。我把slave的id_dsa.pub也互相加到了各自的authorized_keys當(dāng)中。這樣,在任何機(jī)器終端輸入 ssh 機(jī)器名稱(chēng),就能進(jìn)入那臺(tái)機(jī)器進(jìn)行操作,比如:ssh slave1
scp ~/.ssh/id_dsa.pub slave1@192.168.236.134:~/.ssh/authorized_keys
scp ~/.ssh/id_dsa.pub slave2@192.168.236.130:~/.ssh/authorized_keys
查看隱藏的文件,即以點(diǎn)開(kāi)頭的文件或文件夾:control+h
scp:通過(guò)ssh進(jìn)行跨機(jī)器間的復(fù)制命令
cp:本地文件復(fù)制
如何結(jié)束ping命令?control+c
查看ip連接的屬性:ifconfig或者nm-tool
安裝Hadoop
提醒各位,不要去下載最新的hadoop-2.7.2等版本的進(jìn)行安裝,因?yàn)樽钚掳姹镜闹形膮⒖嘉墨I(xiàn)不多,而且hadoop-2.x以后的版本和hadoop-1.x有很大不同。我開(kāi)始安裝了2.7.2版本,但是手頭的資料都是機(jī)遇hadoop-1.2.1的,所以對(duì)于我這個(gè)菜鳥(niǎo)來(lái)說(shuō),配置單機(jī)版和偽分布式還勉強(qiáng)可以,但是完全分布式怎么都不成功,最后刪了重新配置了1.2.1版本的。
cd usr
mkdir hadoop #在usr文件夾下創(chuàng)建Hadoop文件夾
tar xzf hadoop-1.2.1.tar.gz #解壓縮Hadoop安裝文件
cd /usr/hadoop/hadoop-1.2.1/conf
vim hadoop-env.sh #將java的路徑添加到Hadoop的配置文件當(dāng)中
文件中添加:export JAVA_HOME=/usr/lib/java/jdk1.8.0_73
source hadoop-env.sh #使得文件修改生效
vim ~/.bashrc #設(shè)置用戶(hù)環(huán)境參數(shù),使得Hadoop的命令和java命令能夠在根目錄下使用
在文件中添加:
export JAVA_HOME=/usr/lib/java/jdk1.8.0_73
export JRE_HOME=${JAVA_HOME}/jre
export CLASS_PATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:/usr/hadoop/hadoop-1.2.1/bin:$PATH
source ~/.bashrc #使修改生效
hadoop version #查看hadoop的版本
若能正確顯示版本,則恭喜單機(jī)安裝成功了!
單機(jī)模式運(yùn)行wordcount例子
cp LICENSE.txt input #把license.txt復(fù)制到input文件夾當(dāng)中
cd .. ?;氐缴弦患?jí)目錄
hadoop jar hadoop-examples-1.2.1.jar wordcount input output #運(yùn)行wordcount例子,結(jié)果放到output文件夾當(dāng)中
cat output/* #結(jié)果呈現(xiàn)
單機(jī)模式的wordcount成功運(yùn)行,第一個(gè)里程碑達(dá)成!~
偽分布式Hadoop安裝
我們更進(jìn)一步,來(lái)偽分布式架構(gòu)。
現(xiàn)在hadoop-1.2.1文件夾下創(chuàng)建一些文件夾:
root@master:/usr/hadoop/hadoop-1.2.1# mkdir tmp
root@master:/usr/hadoop/hadoop-1.2.1# mkdir hdfs
root@master:/usr/hadoop/hadoop-1.2.1# mkdir hdfs/data
root@master:/usr/hadoop/hadoop-1.2.1# mkdir hdfs/name
root@master:/usr/hadoop/hadoop-1.2.1# ls
對(duì)于偽分布式和完全分布式,都需要修改以下配置文件
core-site.xml 主要是配置hdfs的地址和端口
hdfs-site.xml 主要配置replication,理解為數(shù)據(jù)的備份
mapred-site.xml 修改Hadoop的mapreduce的配置文件,主要是配置jobtracker的地址和端口
cd conf #定位到conf文件夾下
vim core-site.xml #進(jìn)入編輯
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop/hadoop-1.2.1/tmp</value>
</property>
</configuration>
vim hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/usr/hadoop/hadoop-1.2.1/hdfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/usr/hadoop/hadoop-1.2.1/hdfs/data</value>
</property>
</configuration>
vim mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
通過(guò)以上配置完成了最簡(jiǎn)單的偽分布式配置。
接下來(lái)做Hadoop的namenode格式化:
root@master:/usr/hadoop/hadoop-1.2.1/conf# cd ~
root@master:~# hadoop namenode -format
啟動(dòng)Hadoop
start-all.sh
使用java自帶的命令查詢(xún)出所有的守護(hù)進(jìn)程
jps
接下來(lái)使用Hadoop中的監(jiān)控集群的web 頁(yè)面查看運(yùn)行情況:
http://localhost:50030/jobtracker.jsp
http://localhost:50060/tasktracker.jsp
http://localhost:50070/dfshealth.jsp
偽分布式平臺(tái)下的wordcount例子
在dfs中創(chuàng)建input文件夾
root@master:~# hadoop dfs -mkdir input
在http://localhost:50070/dfshealth.jsp中點(diǎn)擊browse the filesystem可以查看文件夾
把文件復(fù)制到input中
root@master:~# hadoop dfs -copyFromLocal /usr/hadoop/hadoop-1.2.1/LICENSE.txt input
root@master:~# cd /usr/hadoop/hadoop-1.2.1
root@master:/usr/hadoop/hadoop-1.2.1# ls
運(yùn)行word count
root@master:/usr/hadoop/hadoop-1.2.1# hadoop jar hadoop-examples-1.2.1.jar wordcount input output
查看下運(yùn)行結(jié)果
hadoop dfs -cat output/*
查看Hadoop dfs中的文件列表
hadoop dfs -ls
hadoop有自己的一套命令規(guī)則,開(kāi)頭為hadoop dfs xx,詳情:http://my.oschina.net/kevin701/blog/228684
關(guān)閉hadoop服務(wù)
stop-all.ssh
好!第二個(gè)里程碑達(dá)成了!
完全分布式hadoop搭建
將hadoop復(fù)制到兩臺(tái)slave機(jī)器的/usr/hadoop/hadoop-1.2.1文件夾當(dāng)中。先在master當(dāng)中壓縮hadoop-1.2.1文件夾下的內(nèi)容,打包成tar.gz文件,然后復(fù)制過(guò)去。
壓縮包
root@master:/usr/hadoop# tar zcvf hadoop.tar.gz hadoop-1.2.1
復(fù)制hadoop.tar.gz到slave中
scp -r hadoop.tar.gz root@slave1:/usr/
解壓縮要先進(jìn)入slave
ssh slave1
cd /usr
mkdir hadoop
cp hadoop.tar.gz hadoop #將壓縮包放到hadoop文件夾當(dāng)中,最好是先在slave當(dāng)中建好hadoop文件夾,然后把hadoop.tar.gz復(fù)制過(guò)去。
tar xzf hadoop.tar.gz
slave1 和slave2的操作方式相同。
都復(fù)制過(guò)去后,要在slave當(dāng)中設(shè)置環(huán)境變量,設(shè)置方式與之前相同。
然后啟動(dòng)hadoop測(cè)試。
查看localhost:50030/jobtracker.jsp測(cè)試成功后,開(kāi)始配置完全分布式系統(tǒng)。
修改master的core.site.xml配置文件
root@master:/usr/hadoop/hadoop-1.2.1/conf# ls
vim core-site.xml
將里面的localhost替換為master,且在兩臺(tái)slave當(dāng)中也做同樣的修改。
其次修改master和slave當(dāng)中的mapred-site.xml文件,把域名localhost修改為master
最后修改master、slave1、slave2上的hdfs-site.xml文件,將dfs.replication的value值改為3,這樣我們的數(shù)據(jù)就會(huì)有3個(gè)副本。
修改兩臺(tái)機(jī)器中hadoop配置文件的masters和slaves文件
root@master:/usr/hadoop/hadoop-1.2.1/conf# vim masters
將里面的localhost改為master
root@master:/usr/hadoop/hadoop-1.2.1/conf# vim slaves
將里面改為:
master
slave1
slave2
這樣,master同時(shí)作為了數(shù)據(jù)節(jié)點(diǎn)和主節(jié)點(diǎn)。
在兩臺(tái)slave上也要做相應(yīng)的修改。
測(cè)試hadoop分布式集群環(huán)境
首先需要清除在hadoop-1.2.1文件夾中的tmp文件夾及其子目錄下的內(nèi)容清空,還要清除根目錄下tmp文件夾中hadoop相關(guān)的內(nèi)容。最后要把自定義的hdfs文件夾中的data和name文件夾中的內(nèi)容清空。
root@master:/usr/hadoop/hadoop-1.2.1# rm -rf tmp/*
首先要清理在根目錄下的tmp文件夾中,以hadoop相關(guān)的所有文件都刪除掉
root@master:rm /tmp/hadoop*
然后需要清空hadoop-1.2.1文件夾中的tmp文件夾和hdfs文件夾下的內(nèi)容。但不能盲目的將所有子目錄都刪除掉。我采用了手動(dòng)進(jìn)入每個(gè)文件夾,將里面的內(nèi)容刪除掉。
之前用rm命令刪除了文件夾下的所有內(nèi)容,導(dǎo)致啟動(dòng)時(shí)沒(méi)有namenode任務(wù)。而且在web觀察上,live node只有1,理論上應(yīng)該有3。但并不知道具體原因。后來(lái)回復(fù)了文件后,手動(dòng)進(jìn)入各個(gè)文件夾清楚里面的內(nèi)容。
在slave當(dāng)中也要做相同的清空操作。
在master節(jié)點(diǎn)格式化集群的文件系統(tǒng)
hadoop namenode -format
格式化后啟動(dòng)
start-all.sh
終于成功啟動(dòng)。輸入jps查看進(jìn)程:
master上,顯示:
root@master:~# jps
3200 TaskTracker
2645 NameNode
2793 DataNode
3050 JobTracker
2957 SecondaryNameNode
3455 Jps
在slave上顯示:
root@slave1:~# jps
2658 DataNode
2786 TaskTracker
2918 Jps
到此為止,完全分布式的hadoop就配置好了。接下去就要開(kāi)始安裝spark啦!另外,有了hadoop的基礎(chǔ),hive、pig、hbase等hadoop架構(gòu)下的工具都可以開(kāi)始安裝部署。大數(shù)據(jù)之路由此打開(kāi)!~
最后,關(guān)機(jī)睡覺(jué)
shutdown -h now