劉 萍
隨著2008年9月4日《自然》(Nature)雜志刊登了一個(gè)名為“Big Data”的專輯,大數(shù)據(jù)時(shí)代正式宣告到來.現(xiàn)如今,各行各業(yè)為了充分利用大數(shù)據(jù),需構(gòu)建分布式大數(shù)據(jù)處理平臺(tái),通過大數(shù)據(jù)分析結(jié)果,驅(qū)動(dòng)決策,給數(shù)據(jù)密集型企業(yè)帶來豐厚的利潤[1-6].因此構(gòu)建一個(gè)高效的分布式大數(shù)據(jù)處理平臺(tái)是大數(shù)據(jù)研究的基礎(chǔ).下文將結(jié)合大數(shù)據(jù)領(lǐng)域最流行的Hadoop框架和Spark框架來構(gòu)建高效的大數(shù)據(jù)處理平臺(tái).
目前大數(shù)據(jù)領(lǐng)域最流行的處理平臺(tái)是Hadoop,它是一個(gè)集分布式計(jì)算、存儲(chǔ)和管理于一體的生態(tài)系統(tǒng),它為大規(guī)模并行數(shù)據(jù)處理算法提供運(yùn)行環(huán)境.Hadoop生態(tài)系統(tǒng)的核心是分布式文件系統(tǒng)(Hadoop Distributed File System,簡稱 HDFS)和MapReduce框架,HDFS為海量數(shù)據(jù)提供存儲(chǔ),MapReduce框架為海量數(shù)據(jù)提供并行計(jì)算.Ha?doop工作原理為:將作業(yè)分解成更小的任務(wù),將數(shù)據(jù)進(jìn)行分區(qū),每一個(gè)任務(wù)實(shí)例處理一個(gè)不同的分區(qū),任務(wù)實(shí)例并行執(zhí)行[7].
Hadoop的MapReduce框架有一些局限性,它僅支持Map和Reduce兩種操作,處理效率低.Map中間結(jié)果寫入磁盤,Reduce寫入HDFS,多個(gè)MapReduce之間通過HDFS交換數(shù)據(jù),任務(wù)調(diào)度和啟動(dòng)開銷大,無法充分利用內(nèi)存.并且Map端和Reduce端均需排序,不適合迭代計(jì)算(如機(jī)器學(xué)習(xí)、圖計(jì)算等)、交互式處理(如數(shù)據(jù)挖掘)和流式處理(如點(diǎn)擊日志分析).
目前流行的Spark[8]是輕量的、基于內(nèi)存計(jì)算的開源集群計(jì)算框架.Spark采用了與MapRe?duce類似的編程模型,并且支持Java、Scala、Python等多種編程語言.在Spark中,數(shù)據(jù)被高度抽象且存儲(chǔ)在彈性分布式數(shù)據(jù)集(Resilient Distributed Dataset,簡稱RDD)中.RDD支持粗粒度寫操作,對于讀操作,RDD可以精確到每一條記錄,這使得RDD可用作分布式索引.在Spark中,所有的操作被稱為算子.Spark不僅實(shí)現(xiàn)了MapReduce的類Map函數(shù)算子和類Reduce函數(shù)算子,還提供了更多豐富的算子,如Filter、Join、Groupby等.
Spark是高效、靈活的框架,可同時(shí)進(jìn)行批處理、流式計(jì)算、交互式計(jì)算,比MapReduce快10~100倍.Spark RDD可以緩存到內(nèi)存中,每次RDD數(shù)據(jù)集的操作結(jié)果都可以保存至內(nèi)存,下一個(gè)操作可以直接從內(nèi)存中讀取數(shù)據(jù),省去了MapRe?duce中大量的磁盤I/O操作,明顯提升了迭代算法中常見的機(jī)器學(xué)習(xí)和交互式數(shù)據(jù)挖掘算法的性能.Spark還提供豐富的API,代碼量比MapReduce少2~5倍,對編程人員來說易于使用.但Spark本身并沒有提供分布式文件系統(tǒng),因此Spark的分析大多依賴于Hadoop的分布式文件系統(tǒng)HDFS;并且對于外部資源調(diào)度,Spark需要使用Hadoop生態(tài)系統(tǒng)中的Yarn進(jìn)行集群資源管理.將基于內(nèi)存計(jì)算的Spark與Hadoop相互結(jié)合可提高算法運(yùn)行效率和處理規(guī)模.下文將創(chuàng)建Hadoop集群和Spark集群,來完成大數(shù)據(jù)處理平臺(tái)的構(gòu)建.
(1)準(zhǔn)備Linux操作系統(tǒng)機(jī)器若干.可選用Redhat、Ubuntu、CentOS等.如果只有裝有Windows的PC機(jī)可使用Virtual Box或者VMWare搭建Linux虛擬機(jī).下文將用CentOS 6.5搭建三節(jié)點(diǎn)的Hadoop集群,在VMWare上安裝三臺(tái)虛擬機(jī),先裝完一臺(tái),然后在該虛擬機(jī)的基礎(chǔ)上克隆出另外兩臺(tái).若是克隆出來的機(jī)器,需要進(jìn)行網(wǎng)絡(luò)配置,因?yàn)榭寺〉腖inux虛擬機(jī)網(wǎng)卡可能無法上網(wǎng).
(2)同步時(shí)間.ping www.baidu.com,若能ping通,運(yùn)行以下命令,同步時(shí)間:
配置時(shí)間自動(dòng)同步,每小時(shí)自動(dòng)去時(shí)間服務(wù)器上同步時(shí)間.如果ping不通,需要修改網(wǎng)絡(luò)相關(guān)配置或暫時(shí)使用下面這種方式:在三個(gè)節(jié)點(diǎn)上分別運(yùn)行date命令,查看時(shí)間是否同步,若還不同步,則在三臺(tái)虛擬機(jī)上運(yùn)行:date-s‘2017-12-12 09:30:00’,直接指定時(shí)間為某個(gè)固定值,比如此處是‘2017-12-12 09:30:00’.
(3)配置各虛擬機(jī)的主機(jī)名.使用命令vi/etc/sysconfig/network,分別設(shè)置主master結(jié)點(diǎn),另外兩節(jié)點(diǎn)為slave01、slave02.然后修改主機(jī)名和IP的映射關(guān)系.使用ifconfig命令,查看自己的虛擬機(jī)的IP是多少,用自己的IP配置與主機(jī)名的對應(yīng)關(guān)系,并且三臺(tái)虛擬機(jī)都要配置.
(4)配置集群Hosts.使用命令vi/etc/hosts可以看到本文的master節(jié)點(diǎn)的配置,如圖1所示.然后通過命令:scp/etc/hosts slave01:/etc/和 scp/etc/hosts slave02:/etc/,讓三臺(tái)虛擬機(jī)的 hosts文件保持一致.
圖1 master節(jié)點(diǎn)的配置
(5)設(shè)置SSH免密碼登錄.設(shè)置的目的是:啟動(dòng)Hadoop集群方便,只需設(shè)置Master節(jié)點(diǎn)到各個(gè)Slave節(jié)點(diǎn)的免密碼登錄.在Master節(jié)點(diǎn)上,執(zhí)行命令ssh-keygen-t rsa結(jié)束后,生成兩個(gè)文件id_rsa(私鑰)和id_rsa.pub(公鑰),將公鑰用命令“ssh-copy-id{其他機(jī)器的hostname}”拷貝到要免密登錄的目標(biāo)機(jī)器上.本文使用以下命令完成免 密 登 錄 :ssh-copy-id master;ssh-copy-idslave01;ssh-copy-id slave02.
(6)關(guān)閉服務(wù)器的防火墻.使用命令service iptables status查看防火墻狀態(tài).若防火墻沒有關(guān)閉,運(yùn)行命令service iptables stop關(guān)閉防火墻,接著運(yùn)行命令chkconfig iptables off使得防火墻開機(jī)不自動(dòng)啟動(dòng).最后,再查看一下防火墻狀態(tài),應(yīng)該是:iptables:Firewall is not running.
(7)安裝JDK,配置環(huán)境變量等.在所有虛擬機(jī)上都要安裝,因?yàn)镠adoop是用Java開發(fā)的,Hadoop的編譯需要使用JDK.
使用命令mkdir/usr/java創(chuàng)建文件夾,然后將jdk安裝包上傳至該文件夾中,使用命令tar-xzvf jdk1.7.0_71-C/usr/java解壓縮jdk安裝包到/usr/java,然后配置環(huán)境變量.
Hadoop安裝方式主要包括以下三種:
(1)自動(dòng)安裝部署.開源的主要有Apache Ambari,它支持Apache Hadoop集群的管理和監(jiān)控.以及小米的Minos,Minos使用Python語言開發(fā),用于Hadoop集群的部署和監(jiān)控.開發(fā)用來管理小米公司的Hadoop、HBase、ZooKeeper集群等.而不開源的有:Cloudera Manager、微軟的Autopi?lot、谷歌的Borg、騰訊公司的Torca等.
(2)使用RPM包安裝部署.該方式Apache Hadoop原始版本不提供,而基于原始版實(shí)現(xiàn)的發(fā)行版HDP和CDH提供.HDP是Hortonworks公司的發(fā)行版;CDH是Cloudera公司的Hadoop發(fā)行版,在生產(chǎn)環(huán)境使用商用公司的開源發(fā)行版(HDP或CDH)比較方便,因?yàn)樗鼈儗adoop生態(tài)系統(tǒng)中所有軟件打包在了一起,用戶不會(huì)面臨版本選擇問題,并且擁有完善的文檔,有些地方還進(jìn)行了獨(dú)特的優(yōu)化.
(3)使用JAR包安裝部署,各版本均提供.使用此方式安裝部署比較靈活,對安裝部署者要求也比較高,需要很多的配置,適合大數(shù)據(jù)研究階段.下文采用Apache Hadoop 2.6.1 JAR包安裝部署,如果采用HDP和CDH版本,可仿照操作,安裝部署方式一模一樣.
因root用戶權(quán)限過大,誤操作容易造成很大損失,Hadoop某些功能不允許在root用戶下操作.因此使用非root用戶安裝Hadoop.下面將詳細(xì)介紹三節(jié)點(diǎn)Hadoop集群如何搭建[9].
(1)將Hadoop安裝包上傳至虛擬機(jī)用戶根目錄.
(2)進(jìn)入根目錄,使用命令tar-xzvf ha?doop-2.6.1.tar.gz解壓縮Hadoop安裝包.
(3)配置環(huán)境變量,使用命令vi~/.bash_pro?file,然后在該文件中增加export HADOOP_HOME=/home/zkpk/hadoop-2.6.1,export PATH=$HADOOP_HOME/bin: $HADOOP_HOME/sbin:$PATH,使用命令source~/.bash_profile使配置的環(huán)境變量生效.運(yùn)行Hadoop version命令,顯示版本是:Hadoop 2.6.1,證明變量已生效.
(4)修改Hadoop配置文件.配置文件存放在/home/zkpk/hadoop-2.6.1/etc/hadoop路徑下,需配置此路徑下的六個(gè)文件,分別是hadoop-env.sh、core-site.xml、 hdfs-site.xml、 mapred-site.xml、yarn-site.xml和slaves.下面對各配置文件的具體配置作詳細(xì)介紹.
配置文件hadoop-env.sh.主要是對JA?VA_HOME變量進(jìn)行設(shè)置,具體設(shè)置如下:export JAVA_HOME=/usr/java/jdk1.7.0_71/.
配置文件core-site.xml,下面的master指的
是主節(jié)點(diǎn)的主機(jī)名.
配置文件hdfs-site.xml,因當(dāng)前有兩個(gè)slave節(jié)點(diǎn),所以,副本數(shù)配置成了2.配置文件mapred-site.xml,具體如下所示:
配置文件yarn-site.xml,具體如下所示:
配置slaves,slaves文件里面記錄的是集群里所有DataNode的主機(jī)名.使用vi slaves命令,具體配置內(nèi)容為:slave01 slave02.
(5)將master上已經(jīng)配置完的Hadoop文件夾拷貝到slave01、slave02的用戶根目錄上.拷貝時(shí),本文的master、slave01、slave02都有用戶,叫zkpk,那么,從master拷貝到slave01和slave02時(shí),使用命令:scp-r~/hadoop-2.6.1/slave01:~和scp-r~/hadoop-2.6.1/slave02:~. 若 master 和slave01、slave02的用戶名不同,則使用命令:scp-r~/hadoop-2.6.1/zkpk@slave01:~和scp-r~/hadoop-2.6.1/zkpk@slave02:~指定拷貝到zkpk用戶,此zkpk是登錄slave01、slave02的用戶名.
(6)使 用 命 令 :scp ~/.bash_profile zk?pk@slave01: ~ 和 scp ~/.bash_profile zk?pk@slave02:~將master上的~/.bash_profile文件拷貝到其他兩個(gè)虛擬機(jī)上.使用命令source~/.bash_profile分別在slave01、slave02上使得環(huán)境變量生效.
(7)分別在master、slave01、slave02上執(zhí)行命令mkdir-p/home/zkpk/hadoopdata創(chuàng)建目錄.
(8)格式化namenode,在master節(jié)點(diǎn)上運(yùn)行hdfs namenode–format.
(9)啟動(dòng) Hadoop集群,在 master上運(yùn)行start-all.sh.
驗(yàn)證Hadoop集群是否搭建成功,可通過以下三種方式:
master上執(zhí)行:jps命令,會(huì)有進(jìn)程:nameno?de、secondarynamenode 和 resourcemanager.slave01,02上執(zhí)行:jps命令,有進(jìn)程:datanode和nodemanager,表示Hadoop集群啟動(dòng)成功.
可用瀏覽器訪問master:18088和master:50070檢查Yarn和HDFS是否正常,若出現(xiàn)正常界面.說明Hadoop集群啟動(dòng)成功.
執(zhí)行安裝包里的示例程序:
cd hadoop-2.6.1/share/hadoop/mapreduce/hadoop jar hadoop-ma?preduce-examples-2.6.1.jar pi 10 10,最后輸出:Estimated value of Pi is 3.20000000000000000000
如果以上的3個(gè)驗(yàn)證步驟都沒有問題,說明集群正常啟動(dòng).
(1)上傳Spark-1.6.1-bin-hadoop2.6.tgz后解壓安裝包到Linux上,使用命令tar-zxvf spark-1.6.1-bin-hadoop2.6.tgz-C/home/zkpk解壓安裝包到指定位置.
(2)使用命令進(jìn)入Spark安裝目錄進(jìn)行配置,用命令cd conf/進(jìn)入conf目錄,使用命令:mv spark-env.sh.template spark-env.sh進(jìn)行重命名,然后修改文件,用命令:vi spark-env.sh打開配置文件,在該配置文件中添加如下配置,其中master是主節(jié)點(diǎn)的主機(jī)名.
然后保存退出.接下來重命名并修改slaves.template文件,操作命令如下:
在該文件中添加子節(jié)點(diǎn)worker節(jié)點(diǎn)所在的位置,本文兩個(gè)從節(jié)點(diǎn)的主機(jī)名分別是slave01、slave02,具體配置如下:
衛(wèi)管專業(yè)是建立在專科教育與成人衛(wèi)生管理教育的基礎(chǔ)之上發(fā)展起來的新興的學(xué)科,具有蓬勃的生命力。衛(wèi)管的本科教育在整個(gè)江西省衛(wèi)生管理教育體系中都是居于主體地位和重要地位的。江西省各醫(yī)藥院??膳c衛(wèi)生行政單位、醫(yī)藥相關(guān)單位、醫(yī)藥企業(yè)等雙向合作乃至多平臺(tái)合作建設(shè)“實(shí)習(xí)基地”。同時(shí)衛(wèi)管專業(yè)畢業(yè)生也應(yīng)充分發(fā)揮主觀能動(dòng)性,樹立良好就業(yè)心態(tài),積極投身衛(wèi)生事業(yè),為國家新醫(yī)改做出應(yīng)有的貢獻(xiàn)。
slave01
slave02
保存退出.最后將配置好的Spark拷貝到其他節(jié)點(diǎn)上,命令如下所示:
scp-r spark-1.6.1-bin-hadoop2.6/zkpk@slave01:~
scp-r spark-1.6.1-bin-hadoop2.6/zkpk@slave02:~
(3)啟動(dòng)Spark集群.
進(jìn)入/home/zkpk/spark-1.6.1-bin-hadoop2.6/sbin目錄,運(yùn)行:./start-all.sh
分別在三臺(tái)節(jié)點(diǎn)運(yùn)行jps,分別有進(jìn)程master,worker,worker.
圖2 Spark運(yùn)行界面
Word Count是大數(shù)據(jù)編程的入門程序,實(shí)現(xiàn)對輸入文件中每個(gè)單詞出現(xiàn)次數(shù)的統(tǒng)計(jì),可應(yīng)用于海量文本的詞頻檢索.實(shí)現(xiàn)單詞詞頻統(tǒng)計(jì)的Word Count算法[10]是一種典型分組聚集算法.該算法首先將文本分詞,形成鍵值對的中間值,鍵為單詞本身,值為1.然后對數(shù)據(jù)進(jìn)行聚集,將具有相同鍵的值進(jìn)行加和,輸出結(jié)果.本文使用Word Count來驗(yàn)證搭建的Hadoop集群和Spark集群是否成功.該算法的數(shù)據(jù)集節(jié)選于網(wǎng)絡(luò)小說,Spark需要將HDFS上的數(shù)據(jù)初始化為Spark RDD,然后對RDD中字符串分詞,生成新的RDD,將新生成的RDD轉(zhuǎn)化為Key Value RDD進(jìn)行并行計(jì)算,將新生成的Key Value RDD進(jìn)行規(guī)約,然后得出結(jié)果.采用Scala語言在Eclipse上實(shí)現(xiàn)的具體代碼如下:
將該代碼打包,在集群上運(yùn)行.運(yùn)行過程如下:
①上傳本地文件到HDFS目錄下,在HDFS上創(chuàng)建輸入文件夾.$hadoop fs-mkdir-p word?count/input.
②上傳本地文件到集群的input目錄下,$ha?doop fs-put~/file*wordcount/input,查看集群文件目錄$hadoop fs-ls wordcount/input.
③Word Count程序打包成后綴名為jar的壓縮文件WordCount.jar,進(jìn)入到壓縮文件所在文件夾,這里以一個(gè)file輸入文件和一個(gè)output輸出文件夾為例說明.
Spark程序運(yùn)行如下命令執(zhí)行.
$spark-submit--master yanr-client--class WordCount~/spark/WordCount.jar,hdfs://master:9000/wordcount/input/file,hdfs://master:9000/wordcount/spark/output
使用如下命令查看運(yùn)行結(jié)果,$hadoop fs-ls wordcount/spark/output.部分結(jié)果如圖3所示.
圖3 部分運(yùn)行結(jié)果
Hadoop的MapReduce與Spark都是分布式計(jì)算框架,Spark框架在批處理、流式計(jì)算、交互式計(jì)算等方面相比于Hadoop MapReduce具有優(yōu)越性,但Spark框架本身并沒有提供分布式文件系統(tǒng),因此Spark的分析依賴于Hadoop中的分布式文件系統(tǒng)HDFS,并且Spark還需要Hadoop生態(tài)系統(tǒng)中的Yarn進(jìn)行資源管理.所以將Hadoop和Spark相結(jié)合可以構(gòu)建高效的大數(shù)據(jù)處理平臺(tái).本文搭建了Hadoop集群和Spark集群,完成了大數(shù)據(jù)處理平臺(tái)的構(gòu)建.最后通過在集群上運(yùn)行實(shí)現(xiàn)單詞詞頻統(tǒng)計(jì)的Word Count程序,驗(yàn)證了大數(shù)據(jù)處理平臺(tái)搭建的成功.目前高校都在陸續(xù)開設(shè)大數(shù)據(jù)專業(yè),本文對初建大數(shù)據(jù)分析專業(yè)具有一定的參考意義,未來將研究大數(shù)據(jù)分析算法,并在搭建的大數(shù)據(jù)處理平臺(tái)上應(yīng)用相關(guān)算法解決實(shí)際問題.
:
[1]何清,李寧,羅文娟.大數(shù)據(jù)下的機(jī)器學(xué)習(xí)算法綜述[J].模式識(shí)別與人工智能,2014,27(4):327-336.
[2]梁吉業(yè).大數(shù)據(jù)挖掘面臨的挑戰(zhàn)與思考[J].計(jì)算機(jī)科學(xué),2016,43(7):1-2.
[3]米允龍,米春橋,劉文奇.海量數(shù)據(jù)挖掘過程相關(guān)技術(shù)研究進(jìn)展[J].計(jì)算機(jī)科學(xué)與探索,2015,9(6):641-659.
[4]黃宜華.大數(shù)據(jù)機(jī)器學(xué)習(xí)系統(tǒng)研究進(jìn)展[J].大數(shù)據(jù),2015,1(1):28-47.
[5]Landset S,Khoshgoftaar T M,Richter A N.A sur?vey of open source tools for machine learning with big data in the Hadoop ecosystem[J].Journal of Big Data,2015,2(1):24.
[6]Shan S.Big data classification:problems and chal?lenges in network intrusion prediction with machine learning[J].ACM Sigmetrics Performance Evaluation Review,2014,41(4):70-73.
[7]宋杰,孫宗哲,毛克明,等.MapReduce大數(shù)據(jù)處理平臺(tái)與算法研究進(jìn)展[J].軟件學(xué)報(bào),2017,28(3):514-543.
[8]Zaharia M,Chowdhury M,F(xiàn)ranklin MJ,etal.Spark:Cluster computing with working sets[C]//Usenix Confer?ence on Hot Topics in Cloud Computing.US ENIX Associa?tion,2010.
[9]安建瑞.基于MapReduce的用戶移動(dòng)軌跡序列模式挖掘算法研究[D].山東:山東理工大學(xué),2016.
[10]Issa JA.Performance evaluation and estimation model using regression method for hadoop Word Count[J].IEEE Access,2015,3:2784-2793.