一、初識(shí)Spark和Hadoop
10年的蘭考網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營銷的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整蘭考建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“蘭考網(wǎng)站設(shè)計(jì)”,“蘭考網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。Apache Spark 是一個(gè)新興的大數(shù)據(jù)處理通用引擎,提供了分布式的內(nèi)存抽象。Spark 正如其名,大的特點(diǎn)就是快(Lightning-fast),可比 Hadoop MapReduce 的處理速度快 100 倍。
Hadoop實(shí)質(zhì)上更多是一個(gè)分布式數(shù)據(jù)基礎(chǔ)設(shè)施: 它將巨大的數(shù)據(jù)集分派到一個(gè)由普通計(jì)算機(jī)組成的集群中的多個(gè)節(jié)點(diǎn)進(jìn)行存儲(chǔ),意味著你不需要購買和維護(hù)昂貴的服務(wù)器硬件。
同時(shí),Hadoop還會(huì)索引和跟蹤這些數(shù)據(jù),讓大數(shù)據(jù)處理和分析效率達(dá)到前所未有的高度。Spark則是一個(gè)專門用來對(duì)那些分布式存儲(chǔ)的大數(shù)據(jù)進(jìn)行處理的工具,它并不會(huì)進(jìn)行分布式數(shù)據(jù)的存儲(chǔ)。
Hadoop除了提供為大家所共識(shí)的HDFS分布式數(shù)據(jù)存儲(chǔ)功能之外,還提供了叫做MapReduce的數(shù)據(jù)處理功能。所以我們完全可以拋開Spark,使用Hadoop自身的MapReduce來完成數(shù)據(jù)的處理。
當(dāng)然,Spark也不是非要依附在Hadoop身上才能生存。但它沒有提供文件管理系統(tǒng),所以,它必須和其他的分布式文件系統(tǒng)進(jìn)行集成才能運(yùn)作。我們可以選擇Hadoop的HDFS,也可以選擇其他的基于云的數(shù)據(jù)系統(tǒng)平臺(tái)。但Spark默認(rèn)來說還是被用在Hadoop上面的,畢竟大家都認(rèn)為它們的結(jié)合是最好的。
二、安裝Spark
以下都是在Ubuntu 16.04 系統(tǒng)上的操作
1.安裝Java JDK并配置好環(huán)境變量(這部分就不詳細(xì)說了)
2.安裝Hadoop
2.1 創(chuàng)建Hadoop用戶:
打開終端,輸入命令:
sudo useradd -m hadoop -s /bin/bash
添加hadoop用戶,并設(shè)置/bin/bash作為shell
2.2 設(shè)置Hadoop用戶的登錄密碼:
sudo passwd hadoop
然后根據(jù)系統(tǒng)提示輸入兩次自己的密碼,再給hadoop用戶添加管理員權(quán)限:
sudo adduser hadoop sudo
2.3 將當(dāng)前的用戶切換到剛剛創(chuàng)建的hadoop用戶(屏幕右上角有個(gè)齒輪,點(diǎn)進(jìn)去就看到)
2.4 更新系統(tǒng)的apt。打開終端,輸入命令:
sudo apt-get update
2.5 安裝ssh、配置ssh無密碼登錄
集群、單節(jié)點(diǎn)模式都需要遇到SSH登錄。Ubuntu默認(rèn)安裝了SSH Client,但需要自己安裝SSH Server:
sudo apt-get install openssh-server
安裝后,直接登錄本機(jī)
ssh localhost
SSH首次登錄需要確認(rèn),根據(jù)提示輸入:yes,然后再按提示輸入剛剛設(shè)置的hadoop的密碼,就登錄了。
2.6 下載Hadoop
下載地址:http://mirror.bit.edu.cn/apache/hadoop/common/
選擇“stable”文件夾,點(diǎn)擊下載“hadoop-2.x.y.tar.gz”文件。默認(rèn)會(huì)下載到“下載”目錄中,
在該文件夾下打開終端,將該文件解壓到/usr/local文件中,執(zhí)行命令:
sudo tar -zxf ~/hadoop-2.9.0.tar.gz cd /usr/local/ sudo mv ./hadoop-2.9.0/ ./hadoop #將文件名修改為hadoop sudo chown -R hadoop ./hadoop #修改文件權(quán)限
Hadoop的文件夾解壓之后就可以直接使用,檢查一下Hadoop是否可以正常使用,如果正常則顯示Hadoop的版本信息
cd /usr/local/hadoop ./bin/hadoop version
這里就初步完成了Hadoop的安裝,還有很多配置什么的用到的時(shí)候在寫,比如偽分布式系統(tǒng)配置。
3.安裝Spark
3.1 下載Spark:http://spark.apache.org/downloads.html
第一項(xiàng)我選擇的版本是最新當(dāng)前的最新版本:2.3.1,第二項(xiàng)選擇“Pre-build with user-provided Apache Hadoop”,然后點(diǎn)擊第三項(xiàng)后面的下載“spark-2.3.1-bin-without-hadoop-tgz”。
3.2 解壓文件
這一步與Hadoop的解壓是一樣的,我們都把它解壓到/usr/local路徑下:
$ sudo tar -zxf ~/下載/spark-2.3.1-bin-without-hadoop.tgz -C /usr/local/ $ cd /usr/local $ sudo mv ./spark-2.3.1-bin-without-hadoop/ ./spark $ sudo chown -R hadoop:hadoop ./spark
3.3 設(shè)置環(huán)境變量
執(zhí)行如下命令拷貝一個(gè)配置文件:
$ cd /usr/local/spark $ ./conf/spark-env.sh.template ./conf/spark-env.sh
然后編輯spark-env.sh:
$ vim ./conf/spark-env.sh
打開之后在這個(gè)文件的最后一行加上下面的內(nèi)容:
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)
然后保存退出Vim,就可以使用Spark了。
三、Spark入門示例
在文件路徑“/usr/local/spark/examples/src/main”中,我們可以找到spark自帶的一些實(shí)例,如下圖可以看到Spark支持Scala、Python、Java、R語言等。
1.Spark最簡單的方式就是使用交互式命令行提示符。打開PySpark終端,在命令行中打出pyspark:
~$ pyspark
2.PySpark將會(huì)自動(dòng)使用本地Spark配置創(chuàng)建一個(gè)SparkContext。我們可以通過sc變量來訪問它,來創(chuàng)建第一個(gè)RDD:
>>>text=sc.textFile(“file\\\usr\local\spark\exp\test1.txt") >>>print text
3.轉(zhuǎn)換一下這個(gè)RDD,來進(jìn)行分布式計(jì)算的“hello world”:“字?jǐn)?shù)統(tǒng)計(jì)”
首先導(dǎo)入了add操作符,它是個(gè)命名函數(shù),可以作為加法的閉包來使用。我們稍后再使用這個(gè)函數(shù)。首先我們要做的是把文本拆分為單詞。我們創(chuàng)建了一個(gè)tokenize函數(shù),參數(shù)是文本片段,返回根據(jù)空格拆分的單詞列表。然后我們通過給flatMap操作符傳遞tokenize閉包對(duì)textRDD進(jìn)行變換創(chuàng)建了一個(gè)wordsRDD。你會(huì)發(fā)現(xiàn),words是個(gè)PythonRDD,但是執(zhí)行本應(yīng)該立即進(jìn)行。顯然,我們還沒有把整個(gè)數(shù)據(jù)集拆分為單詞列表。
4.將每個(gè)單詞映射到一個(gè)鍵值對(duì),其中鍵是單詞,值是1,然后使用reducer計(jì)算每個(gè)鍵的1總數(shù)
>>> wc = words.map(lambda x: (x,1)) >>> print wc.toDebugString()
我使用了一個(gè)匿名函數(shù)(用了Python中的lambda關(guān)鍵字)而不是命名函數(shù)。這行代碼將會(huì)把lambda映射到每個(gè)單詞。因此,每個(gè)x都是一個(gè)單詞,每個(gè)單詞都會(huì)被匿名閉包轉(zhuǎn)換為元組(word, 1)。為了查看轉(zhuǎn)換關(guān)系,我們使用toDebugString方法來查看PipelinedRDD是怎么被轉(zhuǎn)換的??梢允褂胷educeByKey動(dòng)作進(jìn)行字?jǐn)?shù)統(tǒng)計(jì),然后把統(tǒng)計(jì)結(jié)果寫到磁盤。
5.使用reduceByKey動(dòng)作進(jìn)行字?jǐn)?shù)統(tǒng)計(jì),然后把統(tǒng)計(jì)結(jié)果寫到磁盤
>>> counts = wc.reduceByKey(add) >>> counts.saveAsTextFile("wc")
一旦我們最終調(diào)用了saveAsTextFile動(dòng)作,這個(gè)分布式作業(yè)就開始執(zhí)行了,在作業(yè)“跨集群地”(或者你本機(jī)的很多進(jìn)程)運(yùn)行時(shí),你應(yīng)該可以看到很多INFO語句。如果退出解釋器,你可以看到當(dāng)前工作目錄下有個(gè)“wc”目錄。每個(gè)part文件都代表你本機(jī)上的進(jìn)程計(jì)算得到的被保持到磁盤上的最終RDD。
四、Spark數(shù)據(jù)形式
4.1 彈性分布式數(shù)據(jù)集(RDD)
Spark 的主要抽象是分布式的元素集合(distributed collection of items),稱為RDD(Resilient Distributed Dataset,彈性分布式數(shù)據(jù)集),它可被分發(fā)到集群各個(gè)節(jié)點(diǎn)上,進(jìn)行并行操作。RDDs 可以通過 Hadoop InputFormats 創(chuàng)建(如 HDFS),或者從其他 RDDs 轉(zhuǎn)化而來。
獲得RDD的三種方式:
Parallelize:將一個(gè)存在的集合,變成一個(gè)RDD,這種方式試用于學(xué)習(xí)spark和做一些spark的測(cè)試
>>>sc.parallelize(['cat','apple','bat’])
MakeRDD:只有scala版本才有此函數(shù),用法與parallelize類似
textFile:從外部存儲(chǔ)中讀取數(shù)據(jù)來創(chuàng)建 RDD
>>>sc.textFile(“file\\\usr\local\spark\README.md”)
RDD的兩個(gè)特性:不可變;分布式。
RDD支持兩種操作;Transformation(轉(zhuǎn)化操作:返回值還是RDD)如map(),filter()等。這種操作是lazy(惰性)的,即從一個(gè)RDD轉(zhuǎn)換生成另一個(gè)RDD的操作不是馬上執(zhí)行,只是記錄下來,只有等到有Action操作是才會(huì)真正啟動(dòng)計(jì)算,將生成的新RDD寫到內(nèi)存或hdfs里,不會(huì)對(duì)原有的RDD的值進(jìn)行改變;Action(行動(dòng)操作:返回值不是RDD)會(huì)實(shí)際觸發(fā)Spark計(jì)算,對(duì)RDD計(jì)算出一個(gè)結(jié)果,并把結(jié)果返回到內(nèi)存或hdfs中,如count(),first()等。
4.2 RDD的緩存策略
Spark最為強(qiáng)大的功能之一便是能夠把數(shù)據(jù)緩存在集群的內(nèi)存里。這通過調(diào)用RDD的cache函數(shù)來實(shí)現(xiàn):rddFromTextFile.cache,
調(diào)用一個(gè)RDD的cache函數(shù)將會(huì)告訴Spark將這個(gè)RDD緩存在內(nèi)存中。在RDD首次調(diào)用一個(gè)執(zhí)行操作時(shí),這個(gè)操作對(duì)應(yīng)的計(jì)算會(huì)立即執(zhí)行,數(shù)據(jù)會(huì)從數(shù)據(jù)源里讀出并保存到內(nèi)存。因此,首次調(diào)用cache函數(shù)所需要的時(shí)間會(huì)部分取決于Spark從輸入源讀取數(shù)據(jù)所需要的時(shí)間。但是,當(dāng)下一次訪問該數(shù)據(jù)集的時(shí)候,數(shù)據(jù)可以直接從內(nèi)存中讀出從而減少低效的I/O操作,加快計(jì)算。多數(shù)情況下,這會(huì)取得數(shù)倍的速度提升。
Spark的另一個(gè)核心功能是能創(chuàng)建兩種特殊類型的變量:廣播變量和累加器。廣播變量(broadcast variable)為只讀變量,它由運(yùn)行SparkContext的驅(qū)動(dòng)程序創(chuàng)建后發(fā)送給會(huì)參與計(jì)算的節(jié)點(diǎn)。對(duì)那些需要讓各工作節(jié)點(diǎn)高效地訪問相同數(shù)據(jù)的應(yīng)用場景,比如機(jī)器學(xué)習(xí),這非常有用。Spark下創(chuàng)建廣播變量只需在SparkContext上調(diào)用一個(gè)方法即可:
>>> broadcastAList = sc.broadcast(list(["a", "b", "c", "d", "e"]))
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。