行業(yè)都使用Hadoop廣泛地分析他們的數(shù)據(jù)集。其原因在于Hadoop框架是基于簡單的編程模型(MapReduce的),并且它使計算的解決方案,是可擴展的,柔性的,容錯和成本效益。在這里,主要關(guān)心的是在查詢之間的等待時間和等待時間來運行計劃的條款處理大型數(shù)據(jù)集,以保持速度。
火花是由Apache軟件基金會推出了加快的Hadoop計算計算軟件的過程。
作為對一個共同的信念,Spark是Hadoop的不是一個修改版本 ,不,真的,依賴于Hadoop的,因為它有自己的集群管理。 Hadoop是只是實施星火的方式之一。
星火采用Hadoop的方式有兩種-一種是存儲和第二個是處理 。由于星火都有自己的集群管理計算,它使用了Hadoop的只有存儲的目的。
Apache的Spark是一個閃電般快速的集群計算技術(shù),專為快速計算。它是基于在Hadoop MapReduce和它擴展了MapReduce的模型,以有效地將其用于多種類型的計算,其包括交互式查詢和流處理。火花的主要特征是其內(nèi)存集群計算 ,增加的應(yīng)用程序的處理速度。
星火旨在涵蓋廣泛的工作負載,如批量應(yīng)用,迭代算法,互動查詢和流媒體。除了支持所有這些工作負載在各自的系統(tǒng),它減少了維護單獨的工具的管理負擔(dān)。
Spark是Hadoop的2009年在加州大學(xué)伯克利分校的AMPLab由馬太·扎哈里亞開發(fā)的子項目之一。它是開源的,2010年在BSD許可下。它被捐贈給Apache Software Foundation的2013年,現(xiàn)在的Apache星火已經(jīng)成為從二月2014年一個頂級Apache項目。
阿帕奇星火具有以下特點。
速度 -在磁盤上運行時,星火有助于運行Hadoop集群的應(yīng)用程序,高達100倍的速度在內(nèi)存中,快10倍。這通過減少讀/寫操作的次數(shù),以磁盤是可能的。它存儲在內(nèi)存中的中間處理數(shù)據(jù)。
支持多國語言 -星火提供了在Java中,斯卡拉,或Python內(nèi)置的API。因此,你可以寫在不同的語言的應(yīng)用程序。星火配備了80個高層次的經(jīng)營者進行互動查詢。
高級分析 -星火不僅支持'地圖'和'減少'。它也支持SQL查詢,流數(shù)據(jù),機器學(xué)習(xí)(ML),和圖形的算法。
下圖顯示了如何星火可以用Hadoop組件內(nèi)置三種方式。
有火花部署三種方式如下面所解釋。
單機版-星火獨立部署意味著星火上占據(jù)HDFS(Hadoop分布式文件系統(tǒng))和空間頂部的地方分配給HDFS,明確。在這里,星火和MapReduce將并排覆蓋在集群中的所有火花的工作。
Hadoop的紗線 - Hadoop的部署紗手段,簡單地說,火花對成紗運行而無需任何預(yù)先安裝或root訪問權(quán)限。它有助于星火融入的Hadoop生態(tài)系統(tǒng)或Hadoop的堆棧。它允許其它組件上疊層的頂部上運行。
在MapReduce的火花(SIMR) -在MapReduce的火花來,除了獨立部署開展火花的工作。隨著SIMR,用戶可以啟動Spark和使用它的外殼沒有任何管理權(quán)限。
下圖說明了星火的不同組件。
星火Core是,所有其他的功能是建立在這個基礎(chǔ)平臺火花底層一般執(zhí)行引擎。它提供了內(nèi)存計算和外部存儲系統(tǒng)引用的數(shù)據(jù)集。
星火SQL是星火核心之上的組件,它引入了一種名為SchemaRDD一個新的數(shù)據(jù)抽象,它提供了結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)的支持。
星火流利用星火核心的快速調(diào)度能力,執(zhí)行流分析的。它在小批量攝取數(shù)據(jù)和數(shù)據(jù)的那些小批量進行RDD(彈性分布式數(shù)據(jù)集)的轉(zhuǎn)換。
MLlib是一個分布式的機器學(xué)習(xí)框架以上星火因為分布式基于內(nèi)存的Spark架構(gòu)的。據(jù),根據(jù)基準,通過對交替最小二乘(ALS)實現(xiàn)的MLlib開發(fā)完成的。星火MLlib是九次快的Apache Mahout中的基于磁盤的Hadoop版本(前亨利馬烏獲得了星火接口)。
GraphX是在火花的頂部上的分布式圖形處理框架。它提供了用于表達可以通過使用預(yù)凝膠抽象API建模用戶定義圖表圖形計算的API。它也提供了這種抽象的優(yōu)化運行時。
彈性分布式數(shù)據(jù)集(RDD)是星火的基本數(shù)據(jù)結(jié)構(gòu)。它是對象的不可變的分布式集合。在RDD每個數(shù)據(jù)集被劃分成邏輯分區(qū),這可能在集群的不同節(jié)點上進行計算。 RDDS可以包含任何類型的Python,Java的,或者Scala的對象,包括用戶定義的類。
形式上,一個RDD是一個只讀分區(qū)記錄的集合。 RDDS可通過確定性行動上穩(wěn)定存儲或其他RDDS無論是數(shù)據(jù)被創(chuàng)建。 RDD是可以并行操作的元件的容錯集合。
有兩種方法可以創(chuàng)建RDDS -在你的驅(qū)動程序并行現(xiàn)有的集合,或引用在外部存儲系統(tǒng), 數(shù)據(jù)集如共享文件系統(tǒng),HDFS,HBase的,或任何數(shù)據(jù)源提供Hadoop的輸入格式。
火花利用RDD的概念實現(xiàn)更快和有效的MapReduce操作。讓我們先討論如何MapReduce的操作發(fā)生,為什么不那么有效。
MapReduce的被廣泛用于處理和并行產(chǎn)生大型數(shù)據(jù)集采用,在集群上的分布式算法。它允許用戶編寫并行計算,使用一組高層次的運營商,而不必擔(dān)心工作分配和容錯能力。
遺憾的是,目前大多數(shù)的框架,只有這樣,才能重新使用計算(例:二MapReduce任務(wù)之間)的數(shù)據(jù)是將其寫入外部穩(wěn)定的存儲系統(tǒng)(例如:HDFS)。雖然這個框架提供了訪問群集的計算資源眾多抽象,用戶還是想要更多。
這兩個迭代和交互式應(yīng)用需要跨并行作業(yè)更快速的數(shù)據(jù)共享。數(shù)據(jù)共享是緩慢的MapReduce由于復(fù)制 , 序列化和磁盤IO。關(guān)于存儲系統(tǒng),大部分的Hadoop應(yīng)用,他們花費的時間的90%以上做HDFS讀 - 寫操作。
重用多級的應(yīng)用程序在多個計算中間結(jié)果。下圖說明了目前的框架是如何工作的,同時做MapReduce的迭代操作。這招致由于數(shù)據(jù)復(fù)制,磁盤I / O和系列化,使系統(tǒng)緩慢實質(zhì)性開銷。
用戶運行即席查詢對相同的數(shù)據(jù)子集。每個查詢會做的穩(wěn)定存儲,它可以主宰應(yīng)用程序執(zhí)行時間的磁盤I / O。
下圖說明了目前的框架,同時做交互查詢MapReduce的工作方式。
數(shù)據(jù)共享是緩慢的MapReduce由于復(fù)制 , 序列化和磁盤IO。最Hadoop的應(yīng)用,他們花費的時間的90%以上做HDFS讀 - 寫操作。
認識到這個問題,研究人員開發(fā)了一種稱為Apache的星火專門框架?;鸹ǖ年P(guān)鍵思想為R esilienteistributedeatasets(RDD);它支持在內(nèi)存中處理的計算。這意味著,它存儲的存儲器狀態(tài)橫跨的作業(yè)的對象和對象是那些作業(yè)之間共享。在存儲器數(shù)據(jù)共享比網(wǎng)絡(luò)和磁盤快10到100倍。
現(xiàn)在讓我們嘗試找出迭代和交互操作如何發(fā)生Spark中RDD。
下面給出的圖顯示星火RDD迭代操作。它將存儲在分布式存儲器代替穩(wěn)定存儲(磁盤)中間結(jié)果,使系統(tǒng)更快。
注 -如果分布式內(nèi)存(RAM),足以存儲中間結(jié)果(作業(yè)狀態(tài)),那么將這些結(jié)果存儲在磁盤上
此圖顯示星火RDD交互式操作。如果不同的查詢在同一組數(shù)據(jù)的反復(fù)運行,該特定數(shù)據(jù)可被保存在內(nèi)存中獲得更好的執(zhí)行時間。
默認情況下,每個變換RDD可在每次運行在其上的動作時間重新計算。然而,你也可能會持續(xù)一個RDD在內(nèi)存中,在這種情況下,星火將保持元件周圍的群集上更快地訪問,查詢它的下一次。此外,還為在磁盤上持續(xù)RDDS支持,或跨多個節(jié)點的復(fù)制。
Spark是Hadoop的子項目。因此,最好是火花安裝到基于Linux系統(tǒng)。下列步驟顯示了如何安裝Apache的火花。
安裝Java是在安裝星火強制性的事情之一。試試下面的命令來驗證Java版本。
$java -version
如果Java已經(jīng),安裝在系統(tǒng)上,你能看到以下響應(yīng) -
java version "1.7.0_71" Java(TM) SE Runtime Environment (build 1.7.0_71-b13) Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)
如果你沒有在系統(tǒng)上安裝了Java,那么在進行下一步之前,安裝Java。
你應(yīng)該Scala語言來實現(xiàn)的火花。因此,讓我們用下面的命令驗證斯卡拉安裝。
$scala -version
如果Scala是已經(jīng)安裝在系統(tǒng)中,你能看到以下響應(yīng) -
Scala code runner version 2.11.6 -- Copyright 2002-2013, LAMP/EPFL
如果你沒有在系統(tǒng)上安裝斯卡拉,然后進行斯卡拉安裝下一個步驟。
通過訪問下載最新版本的斯卡拉下面的鏈接下載斯卡拉 。在本教程中,我們將使用Scala-2.11.6版本。下載后,您會發(fā)現(xiàn)在下載文件夾斯卡拉tar文件。
按照安裝斯卡拉下面給出的步驟。
用于提取斯卡拉tar文件鍵入以下命令。
$ tar xvf scala-2.11.6.tgz
使用以下命令為斯卡拉軟件文件,移動到相應(yīng)目錄(在/ usr /本地/斯卡拉)。
$ su – Password: # cd /home/Hadoop/Downloads/ # mv scala-2.11.6 /usr/local/scala # exit
為斯卡拉設(shè)置PATH使用下面的命令。
$ export PATH = $PATH:/usr/local/scala/bin
安裝完畢后,最好是進行驗證。驗證斯卡拉安裝使用下面的命令。
$scala -version
如果Scala是已經(jīng)安裝在系統(tǒng)中,你能看到以下響應(yīng) -
Scala code runner version 2.11.6 -- Copyright 2002-2013, LAMP/EPFL
通過訪問以下鏈接下載最新版本的星火下載星火 。在本教程中,我們使用的是火花1.3.1彬hadoop2.6版本。下載后,你會發(fā)現(xiàn)在下載文件夾星火tar文件。
按照安裝星火下面給出的步驟。
提取火花tar文件下面的命令。
$ tar xvf spark-1.3.1-bin-hadoop2.6.tgz
對于Spark軟件文件移動到相應(yīng)目錄(在/ usr /本地/火花)以下命令。
$ su – Password: # cd /home/Hadoop/Downloads/ # mv spark-1.3.1-bin-hadoop2.6 /usr/local/spark # exit
以下行添加到?/.bashrc文件。這意味著添加的位置,那里的火花軟件文件的位置到PATH變量。
export PATH = $PATH:/usr/local/spark/bin
對采購的?/ .bashrc文件使用以下命令。
$ source ~/.bashrc
寫打開外殼星火以下命令。
$spark-shell
如果火花塞安裝成功,那么你會發(fā)現(xiàn)下面的輸出。
Spark assembly has been built with Hive, including Datanucleus jars on classpath Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties 15/06/04 15:25:22 INFO SecurityManager: Changing view acls to: hadoop 15/06/04 15:25:22 INFO SecurityManager: Changing modify acls to: hadoop disabled; ui acls disabled; users with view permissions: Set(hadoop); users with modify permissions: Set(hadoop) 15/06/04 15:25:22 INFO HttpServer: Starting HTTP Server 15/06/04 15:25:23 INFO Utils: Successfully started service 'HTTP class server' on port 43292. Welcome to ____ __ / __/__ ___ _____/ /__ _ / _ / _ `/ __/ '_/ /___/ .__/\_,_/_/ /_/\_ version 1.4.0 /_/ Using Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_71) Type in expressions to have them evaluated. Spark context available as sc scala>
星火推出名為星火SQL結(jié)構(gòu)化數(shù)據(jù)處理的編程模塊。它提供了一個編程抽象稱為數(shù)據(jù)框中,可以作為分布式SQL查詢引擎作用。
以下是星火SQL的功能 -
集成 -無縫星火計劃混合使用SQL查詢。星火SQL可以讓你查詢的結(jié)構(gòu)化數(shù)據(jù)為星火分布式數(shù)據(jù)集(RDD),使用Python,Scala和Java集成的API。這種緊密集成可以很容易地同時運行復(fù)雜的分析算法SQL查詢。
統(tǒng)一的數(shù)據(jù)訪問 -從各種來源加載和查詢數(shù)據(jù)。架構(gòu)RDDS提供與結(jié)構(gòu)化數(shù)據(jù),包括Apache蜂巢桌,實木復(fù)合地板的文件和文件JSON工作效率的單一接口。
蜂巢兼容性 -在現(xiàn)有的倉庫運行未經(jīng)修改的蜂巢查詢。星火SQL重用蜂房前端和MetaStore,讓您與現(xiàn)有的數(shù)據(jù)蜂房,查詢和UDF完全兼容。只要沿著蜂巢安裝。
標準連接 -連接通過JDBC或ODBC。星火SQL包括與行業(yè)標準的JDBC和ODBC連接的服務(wù)器模式。
可擴展性 -使用相同的引擎,交互和長查詢。星火SQL取RDD模式,支持中端查詢?nèi)蒎e的優(yōu)勢,讓它擴展到大型工作過。不要擔(dān)心使用不同引擎的歷史數(shù)據(jù)。
下圖說明了星火SQL的架構(gòu) -
該架構(gòu)包含三個層次,即語言的API,架構(gòu)RDD,和數(shù)據(jù)源。
語言API - Spark是用不同的語言和SQL星火兼容。同時,這也是這些書寫的API(蟒蛇,斯卡拉,JAVA,HiveQL)的支持。
架構(gòu)RDD -星火核心設(shè)計了名為RDD特殊的數(shù)據(jù)結(jié)構(gòu)。一般地,火花SQL工作在模式,表和記錄。因此,我們可以使用架構(gòu)作為RDD臨時表。我們可以把這種架構(gòu)作為RDD數(shù)據(jù)幀。
數(shù)據(jù)源 -一般的數(shù)據(jù)源火花核心是一個文本文件,阿夫羅文件等,但是,對于火花SQL數(shù)據(jù)源是不同的。這些都是平面文件,JSON文檔,HIVE表和卡桑德拉數(shù)據(jù)庫。
我們將討論更多關(guān)于這些在后面的章節(jié)。
一個數(shù)據(jù)幀是數(shù)據(jù),這些數(shù)據(jù)被組織到一個名為列的分布式的集合。從概念上講,它是等效于具有良好優(yōu)化技術(shù)關(guān)系表。
一個數(shù)據(jù)框可以從不同的來源,如蜂房的表,結(jié)構(gòu)化的數(shù)據(jù)文件,外部數(shù)據(jù)庫,或現(xiàn)有RDDS數(shù)組構(gòu)造。這個API被設(shè)計為 在Python - [R編程和大熊貓取靈感來自于現(xiàn)代數(shù)據(jù)框大數(shù)據(jù)和數(shù)據(jù)的科學(xué)應(yīng)用。
下面是一組數(shù)據(jù)幀的一些特征 -
能夠處理單個節(jié)點群集到大集群以KB為單位的大小來拍字節(jié)的數(shù)據(jù)。
支持不同的數(shù)據(jù)格式(Avro的,CSV,彈性搜索和卡桑德拉)和存儲系統(tǒng)(HDFS,HIVE表,MySQL等)。
通過星火SQL優(yōu)化催化劑(樹轉(zhuǎn)換框架)技術(shù)優(yōu)化和代碼生成狀態(tài)。
可通過星火核與所有大數(shù)據(jù)工具和框架輕松集成。
提供API的Python,Java中,斯卡拉和R編程。
SQLContext是一類,并用于初始化火花的SQL的功能。 SparkContext類對象(SC)所需的初始化SQLContext類對象。
下面的命令用于通過火花殼初始化SparkContext。
$ spark-shell
默認情況下,SparkContext對象與名稱SC火花-殼啟動時初始化。
使用下面的命令來創(chuàng)建SQLContext。
scala> val sqlcontext = new org.apache.spark.sql.SQLContext(sc)
讓我們在一個名為employee.json一個JSON文件考慮員工記錄的例子。使用下面的命令來創(chuàng)建一個數(shù)據(jù)幀(DF)和讀取命名employee.json具有下列內(nèi)容的JSON文件。
employee.json -將這個文件在當(dāng)前斯卡拉>指針所在的目錄。
{ {"id" : "1201", "name" : "satish", "age" : "25"} {"id" : "1202", "name" : "krishna", "age" : "28"} {"id" : "1203", "name" : "amith", "age" : "39"} {"id" : "1204", "name" : "javed", "age" : "23"} {"id" : "1205", "name" : "prudvi", "age" : "23"} }
數(shù)據(jù)框提供了結(jié)構(gòu)化數(shù)據(jù)處理領(lǐng)域特定語言。在這里,我們包括使用DataFrames結(jié)構(gòu)化數(shù)據(jù)處理的一些基本例子。
按照下面給出的數(shù)據(jù)框進行操作的步驟 -
首先,我們要讀的JSON文件。在此基礎(chǔ)上,產(chǎn)生一個命名為(DFS)數(shù)據(jù)幀。
使用下面的命令來讀取名為employee.json的JSON文件。的數(shù)據(jù)被示出為與字段的表 - 編號,姓名和年齡。
scala> val dfs = sqlContext.read.json("employee.json")
輸出 -字段名得自employee.json自動拍攝照片。
dfs: org.apache.spark.sql.DataFrame = [age: string, id: string, name: string]
如果你想看到的數(shù)據(jù)框的數(shù)據(jù),然后使用以下命令。
scala> dfs.show()
輸出 -你可以看到以表格格式員工數(shù)據(jù)。
<console>:22, took 0.052610 s +----+------+--------+ |age | id | name | +----+------+--------+ | 25 | 1201 | satish | | 28 | 1202 | krishna| | 39 | 1203 | amith | | 23 | 1204 | javed | | 23 | 1205 | prudvi | +----+------+--------+
如果你想看到的數(shù)據(jù)框的結(jié)構(gòu)(架構(gòu)),然后使用下面的命令。
scala> dfs.printSchema()
產(chǎn)量
root |-- age: string (nullable = true) |-- id: string (nullable = true) |-- name: string (nullable = true)
使用下面的命令從數(shù)據(jù)框的三列中取的名字 -column。
scala> dfs.select("name").show()
輸出 -你可以看到名字列的值。
<console>:22, took 0.044023 s +--------+ | name | +--------+ | satish | | krishna| | amith | | javed | | prudvi | +--------+
尋找那些年齡超過23(年齡> 23)越大,員工使用下面的命令。
scala> dfs.filter(dfs("age") > 23).show()
產(chǎn)量
<console>:22, took 0.078670 s +----+------+--------+ |age | id | name | +----+------+--------+ | 25 | 1201 | satish | | 28 | 1202 | krishna| | 39 | 1203 | amith | +----+------+--------+
用于計算員工誰是同年齡的號碼使用下列命令。
scala> dfs.groupBy("age").count().show()
輸出 -這兩個雇員有23歲。
<console>:22, took 5.196091 s +----+-----+ |age |count| +----+-----+ | 23 | 2 | | 25 | 1 | | 28 | 1 | | 39 | 1 | +----+-----+
一個SQLContext使應(yīng)用程序能夠運行編程在運行SQL函數(shù)的SQL查詢并返回結(jié)果作為一個數(shù)據(jù)幀。
通常,在后臺,SparkSQL支持用于轉(zhuǎn)換現(xiàn)有RDDS成DataFrames兩種不同的方法 -
不老 | 方法和說明 |
---|---|
1 | 推斷使用反射架構(gòu) 這種方法使用反射來生成包含特定類型的對象的RDD的模式。 |
2 | 編程指定模式 創(chuàng)建數(shù)據(jù)幀的第二種方法是通過編程接口,使您可以構(gòu)建一個架構(gòu),然后將其應(yīng)用到現(xiàn)有的RDD。 |
一個數(shù)據(jù)幀的接口允許不同的數(shù)據(jù)源對SQL星火工作。它是一個臨時表,并且可以作為一個正常的RDD操作。注冊一個數(shù)據(jù)幀作為一個表,您可以在其數(shù)據(jù)上運行SQL查詢。
在本章中,我們將介紹使用不同的數(shù)據(jù)源星火加載和保存數(shù)據(jù)的一般方法。此后,我們將詳細討論可用于內(nèi)置數(shù)據(jù)源的特定選項。
有在SparkSQL可用不同類型的數(shù)據(jù)源,其中的一些列舉如下 -
不老 | 數(shù)據(jù)源 |
---|---|
1 | JSON數(shù)據(jù)集 星火SQL可以自動捕捉一個JSON數(shù)據(jù)集的架構(gòu)并加載它作為一個數(shù)據(jù)幀。 |
2 | 蜂巢表 蜂巢捆綁了星火庫HiveContext,從SQLContext繼承。 |
3 | 實木復(fù)合地板的文件 實木復(fù)合地板是一個柱狀的格式,許多數(shù)據(jù)處理系統(tǒng)的支持。 |
更多建議: