林皓月 段華瓊
摘要:隨著云計算的興起,大數(shù)據(jù)受到越來越多的關注。為了將數(shù)據(jù)信息進行專業(yè)化處理,引進了Hadoop和Spark等大數(shù)據(jù)框架。其中Hadoop是最流行的處理平臺,它主要解決了數(shù)據(jù)存儲和分布式計算的問題,而Spark是基于Hadoop中的分布式文件系統(tǒng)和Hadoop Yarn進行計算。Hadoop和Spark的結(jié)合可以更好地提高計算速率和數(shù)據(jù)性能。該文首先介紹了Hadoop和Spark的特點,然后對分布式集群的搭建進行研究并實現(xiàn),給出了搭建步驟并完成了對集群的驗證。
關鍵詞:Hadoop;Spark;分布式
中圖分類號:TP311? ? ? ? 文獻標識碼:A
文章編號:1009-3044(2020)23-0207-02
在網(wǎng)絡技術不斷發(fā)展的背景下,互聯(lián)網(wǎng)公司為了應對大規(guī)模的信息與高吞吐的數(shù)據(jù)量,提出了Hadoop和Spark等大數(shù)據(jù)處理平臺。它們應用范圍廣,給很多企業(yè),諸如騰訊、淘寶、Yahoo和優(yōu)酷等,帶來了豐厚的利潤。因此,構建一個高效的分布式大數(shù)據(jù)處理平臺是大數(shù)據(jù)研究的基礎。本文在Linux平臺下,將最流行的Hadoop框架和Spark框架結(jié)合起來,構建了一個高效的大數(shù)據(jù)處理平臺。
1 Hadoop和Spark的簡介
1.1 Hadoop的特點及MR的運行過程
1) Hadoop的特點
Hadoop作為對大量數(shù)據(jù)分布式處理的基礎架構,其設計是為了用便宜的機器組成高可用的集群。它經(jīng)過多年的發(fā)展在大數(shù)據(jù)平臺上有一定地位,而且由于代碼開源,很多大數(shù)據(jù)開發(fā)人員還是會選擇基于Hadoop框架搭建項目。Hadoop工程包括HBase、Hive、Spark、Zookeeper等模塊,大多運行在Linux系統(tǒng)上,其主要的特點是文件系統(tǒng)HDFS的分布式存儲和MapReduce的高性能計算。
2)MapReduce的運行過程
MapReduce是面向大數(shù)據(jù)并行處理的計算模型、框架和平臺,其運行過程可以分為以下五點。
(1)將文件信息輸入,經(jīng)過split分割成數(shù)據(jù)塊和程序,并將這些塊和作業(yè)提交給一系列節(jié)點。Master節(jié)點負責調(diào)度,Map和Reduce負責執(zhí)行。
(2)Master節(jié)點接收到程序后,將數(shù)據(jù)提交給合適的Map節(jié)點和Reduce節(jié)點。
(3)Map節(jié)點啟動執(zhí)行程序,讀取本地的數(shù)據(jù)塊,將數(shù)據(jù)進行整理放在本地計算,同時告知Master節(jié)點Map已完成以及中間結(jié)果的存儲位置。
(4)Map輸出的鍵值對經(jīng)過shuffle混洗后,相同key的行會被直接輸送到企業(yè)同一個Reducer中,然后sort鍵,排好序后的值被放入其中一個信息列表中。
(5)Master節(jié)點等待Map節(jié)點完成,接著Reduce節(jié)點啟動,通過已知的存儲位置讀取數(shù)據(jù),并將數(shù)據(jù)處理后輸出結(jié)果。
1.2 Spark的特點及RDD的運行過程
1)Spark的特點
Spark是基于MapReduce的第二代計算引擎,它通過優(yōu)化傳統(tǒng)的MapReduce模型來滿足之前HDFS以及MapReduce無法解決的問題,大大提高了效率,為處理流式數(shù)據(jù)以及其他需求提供了捷徑。它主要的特點是計算效率高,支持多種運行模式,有高效的DAG引擎。雖然Saprk兼容性強,但也不支持所有語言開發(fā)。因此,Hadoop和Spark等多個框架的結(jié)合可以更好地滿足用戶需求,提高產(chǎn)品效率。
2) RDD的運行過程
RDD的運行過程總結(jié)為以下三點。
(1)首先創(chuàng)建RDD,讀取文件。RDD可以從分布式文件系統(tǒng)、parallelize或本地文件系統(tǒng)創(chuàng)建。本研究中,Spark采用textFile方法從分布式文件系統(tǒng)中加載數(shù)據(jù)創(chuàng)建RDD。
(2)RDD的一系列轉(zhuǎn)換操作。RDD的Map():將每個元素傳遞到函數(shù)func中,并將研究結(jié)果返回為一個新的數(shù)據(jù)集;RDD的flatMap():與Map()相似,不同點在于每個輸入元素都可以映射到0或多個輸出結(jié)果;RDD的reduceByKey():應用于map好的鍵值對(k,v),通過把每個key傳到函數(shù)中聚合后的結(jié)果,返回新的鍵值對,它與groupByKey()的區(qū)別在于前者是使用函數(shù)合并相同鍵的值,可以自定義函數(shù),后者則是把同鍵的值分組,不能自定義函數(shù)。
(3)RDD進行完以上操作后,經(jīng)行動操作,把結(jié)果輸出。
2 Hadoop和Spark集群的搭建
2.1 配置Linux (切換到root用戶)
(1)準備虛擬機。安裝三臺CentOS 7系統(tǒng)的虛擬機,設置主機名為master,slave1,slave2。
(2)設置網(wǎng)絡和ip地址。在設置中點Wired Setting于ON,將三臺VM虛擬機的ip分別設置為192.168.100.100、192.168.100.101、192.168.100.102。
(3)配置時鐘同步。如果自動配置則用命令 crontab -e 進入編輯模式,輸入i插入“0 1 * * * /usr/sbin/ntpdate cn.pool.ntp.org”;如果手動配置,則直接運行命令 /user/sbin/ntpdate cn.pool.ntp.org。
(4)關閉防火墻。命令systemctl status firewalld.service可以查看防火墻狀態(tài);如果狀態(tài)處于running,則systemctl stop firewalld.service關閉防火墻;systemctl disable firewalld.service,可永久禁止防火墻服務,下次重啟也不會開啟。
(5)配置host列表。在每臺虛擬機上執(zhí)行命令 vi /etc/hosts添加三行192.168.100.100 master 192.168.100.101 slave1 192.168.100.102 slave2保存。使用ping命令檢查是否互通。
(6)安裝JDK。首先移除系統(tǒng)自帶的jdk,將JDK安裝包解壓放至提前創(chuàng)建的/opt/SoftWare/Jdk下,然后配置環(huán)境變量JAVA_HOME和PATH,最后source文件后使用java -version測試JDK是否安裝。
(7)免密碼登錄。在master節(jié)點上執(zhí)行ssh-keygen -t rsa,然后復制公鑰文件cat~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys,接著將authorized_keys復制到slave1和slave2,同樣Slave節(jié)點也生成密鑰,將 authorized_keys 文件移動到.ssh 目錄,最后驗證免密鑰登錄。
2.2 Hadoop集群的搭建
(1)解壓安裝包。將安裝包解壓到提前創(chuàng)建的/opt/SoftWare/Hadoop下,使用命令vi /etc/profile 配置 Hadoop 的系統(tǒng)環(huán)境變量HADOOP_HOME和PATH。
(2)配置文件hadoop-env.sh和yarn-env.sh。將export JAVA_HOME=xxx這行代碼修改為下面的代碼 export JAVA_HOME=/opt/SoftWare/Jdk/jdk1.8.0_131/。
(3)配置核心組件core-site.xml和hdfs-site.xml,配置文件系統(tǒng)yarn-site.xml,配置計算框架 mapred-site.xml。其中hdfs-site.xml的核心代碼是
dfs.replication
(4)配置slaves文件,加入從節(jié)點主機名。將已經(jīng)配置完成的Hadoop復制到從節(jié)點.使用scp -r ... @savel1....命令。需要注意的是,因為之前已經(jīng)配置了SSH,這里可以無密碼地登錄。
(5)格式化namenode啟動Hadoop集群。使用 start-all.sh啟動 Hadoop集群,然后啟動jps可驗證。在瀏覽器地址欄中輸入http://master:50070/檢查 namenode 和 datanode 是否正常。
2.3 Spark集群的搭建
(1)解壓Scala安裝包。將安裝包解壓在提前創(chuàng)建的/opt/SoftWare/Scala下,配置環(huán)境變量SCALA_HOME,PATH,保存退出,source /etc/profile后執(zhí)行Scala -version測試Scala是否安裝成功,注意Scala安裝版本和Spark版本要對應。
(2)解壓Spark安裝包。將安裝包解壓到提前創(chuàng)建的/opt/SoftWare/Spark下,配置 Hadoop 啟動的系統(tǒng)環(huán)境變量HADOOP_CONF_DIR,HDFS_CONF_DIR,YARN_CONF_DIR。
(3)修改配置文件spark-env.sh,配置JAVA_HOME,SPARK_MASTER_IP,SPARK_MASTER_PORT,SCALA_HOME,HADOOP_HOME,SPARK_HOME。
(4)修改slaves. template文件,添加主機名,刪掉主機名,插入從節(jié)點名字slave1 slave2。
(5)將配置好的 Spark 拷貝到其他節(jié)點上。使用scp -r ... @savel1....命令。
(6)啟動Spark集群。進入sbin目錄,運行./start-all.sh,運行jps,分別有進程master,worker,worker。在瀏覽器中查看master:8080可知Spark安裝配置成功。
3 平臺的驗證
單詞計數(shù)作為大數(shù)據(jù)學習的入門程序,相當于C語言中的Hello World,它是用來統(tǒng)計信息經(jīng)分割后得到相同字段的次數(shù),即將原本文字轉(zhuǎn)換成
3.1 在Hadoop集群中的驗證
在Hadoop集群下MapReduce起到主要作用,它主要經(jīng)過了split的數(shù)據(jù)切片、Mapper的數(shù)據(jù)映射、Shuffle的數(shù)據(jù)混洗和Reduce的數(shù)據(jù)歸約這四個步驟。對于Driver是負責運行Saprk應用的組件,運行流程分別是FileInputFormat、Mapper、Combine、Reduce、Partitioner、FileOutputFormat,其中最重要的是Mapper、Reduce和Driver函數(shù)的代碼,其運行步驟如下:
(1)打開idea,新建MR工程,加入jar包導入。
(2)主要寫Mapper、Reducer和Driver函數(shù),在此展示Mapper函數(shù)的主要代碼:
Public void map(Object key, Text value, Context context )throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);}
}。
(3)使用工具選擇主函數(shù)打包成jar包,將jar傳至虛擬機并運行hadoop jar命令。
(4)可通過Hadoop fs -cat在終端查看,也可用web網(wǎng)頁查看HDFS輸出信息。
3.2 在Spark集群中的驗證
在Spark運行單詞計數(shù)時需要RDD的幫助,RDD是為了解決數(shù)據(jù)復制和防止在不同計算階段之間重用中間結(jié)果的數(shù)據(jù)結(jié)構,它可以有多個分區(qū),從而保證在集群中的不同節(jié)點上進行并行計算。RDD在Spark中的工作流程如下:首先創(chuàng)建RDD對象;通過RDD的轉(zhuǎn)換和動作操作構建DAG;然后主要由DAGScheduler負責將DAG拆分為多個stage;最后TaskScheduler負責通過集群管理器加載任務,派發(fā)給worker。同時這個程序還將用到Hadoop的HDFS系統(tǒng),兩者結(jié)合,凸顯出Hadoop和Spark組合的魅力。運行步驟如下:
(1)打開idea,新建工程,加入Spark包,其程序主要代碼如下:
val sc=new SparkContext(sparkconf)
val line=sc.textFile(args(0))
val words=line.flatMap(_.split(“ “))
val wordToOne=words.map((_,1))
val wordToCount=wordToOne.reduceByKey(_+_)
wordToCount.saveAsTextFile(args(1))
(2)構建之后把代碼打jar包,然后將被測文件傳到HDFS目錄下。
(3)執(zhí)行spark -submit,最后用Hadoop fs -cat查看結(jié)果。
4 總結(jié)
Hadoop和Spark各有各的特點,Spark雖然沒有像Hadoop一樣的文件管理系統(tǒng),但是在計算領域還是比MapReduce速率快。Hadoop 的本質(zhì)在于分布式系統(tǒng),而Spark對應上Hadoop中的MapReduce,提出了RDD的思想。盡管Spark功能也比Hadoop多,但很多企業(yè)基于Hadoop搭建了整個系統(tǒng),要全部遷移到Spark還是要很長時間,因此初學者可根據(jù)需求選擇適當框架。本文介紹了兩個框架的特點,如何搭建集群以及驗證單詞詞頻統(tǒng)計的Word Count程序。
如今大數(shù)據(jù)是現(xiàn)代產(chǎn)業(yè)極具價值的重要資產(chǎn),采用Hadoop/Spark大數(shù)據(jù)構架可提供一致的應用服務,它能較好地克服集中式計算架構的缺陷,表現(xiàn)出良好的應用效果。也許在未來,大數(shù)據(jù)領域最熱門的組合就是Hadoop/Spark。
參考文獻:
[1] 張海濤.基于Hadoop的大數(shù)據(jù)計算之研究[J]電子測試,2019,(4).
[2] 林海,王強,李英震.基于大數(shù)據(jù)下的Spark快速大數(shù)據(jù)分析[J].現(xiàn)代工業(yè)經(jīng)濟和信息化,2019,9(10).
[3] 楊秋鴻,潘曉衡,趙鐵柱, 等.面向大數(shù)據(jù)應用的分布式服務平臺設計與實現(xiàn)[J].東莞理工學院學報,2020,27(1):34-38.
【通聯(lián)編輯:朱寶貴】