大數(shù)據(jù)“復(fù)活”記
628
2025-03-31
什么是Apache Spark
原文:https://medium.com/@ashish1512/what-is-apache-spark-e41700980615
大多數(shù)人都會(huì)聽說(shuō)過Apache Spark和世界各地使用的其他大數(shù)據(jù)技術(shù)(Hadoop,Hive,Cassandra)。但是什么是Spark讓它在現(xiàn)場(chǎng)爆炸?
資料來(lái)源:EasyLearning
在其網(wǎng)站上,Apache Spark被解釋為“用于大規(guī)模數(shù)據(jù)處理的快速通用引擎”。但這甚至沒有開始說(shuō)明它在大數(shù)據(jù)領(lǐng)域成為如此重要的參與者的原因。大數(shù)據(jù)公司的采用率一直在以驚人的速度增長(zhǎng)。了解Spark崛起背后的原因有助于預(yù)測(cè)即將推出的大數(shù)據(jù)解決方案的發(fā)展軌跡。
是一種用于實(shí)時(shí)處理的快速通用集群計(jì)算系統(tǒng)。它于2009年在加州大學(xué)伯克利分校的AMPLab開發(fā),后來(lái)由Apache捐贈(zèng)并開源。它擁有蓬勃發(fā)展的開源社區(qū),是目前最活躍的Apache項(xiàng)目。
開發(fā)人員提出的一個(gè)常見問題是,Spark是否只是另一種與Hadoop競(jìng)爭(zhēng)的技術(shù)(旨在取代Hadoop),或者他們是否能夠保留現(xiàn)有代碼庫(kù)并在其上使用Spark來(lái)利用它的功能。
嗯,是的,不。它是在考慮Hadoop的基礎(chǔ)上構(gòu)建的。它是Hadoop MapReduce的潛在替代品,但它也擴(kuò)展了MapReduce模型,以便與YARN和HDFS一起使用。Spark可以在HDFS之上運(yùn)行,以利用分布式復(fù)制存儲(chǔ)。
大數(shù)據(jù)技術(shù)堆棧
速度:內(nèi)存處理
隨著信息的大量增長(zhǎng),計(jì)算效率對(duì)于幫助解決高時(shí)間和空間復(fù)雜性變得非常關(guān)鍵。Spark能夠一次處理數(shù)PB的數(shù)據(jù),分布在數(shù)千個(gè)物理或虛擬服務(wù)器的集群中。它通過內(nèi)存處理實(shí)現(xiàn)這一點(diǎn),這使得它能夠以閃電般的速度提供實(shí)時(shí)分析(比Hadoop快100倍)。
支持:開發(fā)人員友好的API
Spark提供了許多比MapReduce提供的更高抽象級(jí)別的指令。它不僅支持Java,還支持Python和Scala,它是一種較新的語(yǔ)言,包含一些用于處理數(shù)據(jù)的有吸引力的屬性。它具有開發(fā)人員友好的API,并且通常與Hadoop的數(shù)據(jù)存儲(chǔ)模塊 -?HDFS一起使用???- 但它可以與其他流行的數(shù)據(jù)存儲(chǔ)子系統(tǒng)(如HBase,Cassandra,MongoDB和Amazon的S3)同樣良好地集成。
簡(jiǎn)單:懶惰評(píng)估
Apache Spark延遲評(píng)估,直到絕對(duì)必要。這是促進(jìn)其速度的關(guān)鍵因素之一。它聽你要求它做什么,寫下一些速記,所以它不會(huì)忘記,然后絕對(duì)沒有。它會(huì)繼續(xù)無(wú)所作為,直到你問它最后的答案。對(duì)于轉(zhuǎn)換,Spark將它們添加到計(jì)算的DAG(有向無(wú)環(huán)圖)中,并且僅當(dāng)驅(qū)動(dòng)程序請(qǐng)求某些數(shù)據(jù)時(shí),才會(huì)實(shí)際執(zhí)行此DAG。
Apache Spark的核心是彈性分布式數(shù)據(jù)集(RDD)的概念。它是一種編程抽象,表示可以在計(jì)算集群中拆分的不可變對(duì)象集合。這就是Spark如何輕松實(shí)現(xiàn)快速,可擴(kuò)展的并行處理。
Spark Core主要包含以下4個(gè)庫(kù)。
Spark核心組件
Spark SQL對(duì)Apache Spark項(xiàng)目變得越來(lái)越重要。它是當(dāng)今開發(fā)人員在創(chuàng)建應(yīng)用程序時(shí)最常用的界面。Spark SQL專注于結(jié)構(gòu)化數(shù)據(jù)的處理,使用從R和Python(在Pandas中)借用的數(shù)據(jù)幀方法。
從數(shù)據(jù)框中選擇一些列就像這一行一樣簡(jiǎn)單:
將數(shù)據(jù)幀注冊(cè)為臨時(shí)表后,我們可以使用SQL來(lái)查詢它。
如今,我們看到的大多數(shù)數(shù)據(jù)都是從各種來(lái)源的“流”中生成的。雖然將這些數(shù)據(jù)流存儲(chǔ)在磁盤上并在以后批量分析它們當(dāng)然是可行的,但有時(shí)在數(shù)據(jù)實(shí)時(shí)到達(dá)時(shí)處理和處理數(shù)據(jù)是明智或重要的。
早些時(shí)候,Hadoop中的流處理必須以繁瑣的方式完成。開發(fā)人員將使用MapReduce進(jìn)行批處理,然后必須使用Apache Storm進(jìn)行實(shí)時(shí)處理。這導(dǎo)致了現(xiàn)在的問題,開發(fā)人員必須管理在不同框架上運(yùn)行的代碼庫(kù),并且需要彼此保持同步。
Spark通過將流分解為一系列連續(xù)的微批次,將批量處理的概念引入流式傳輸,然后可以使用Apache Spark API進(jìn)行操作。這減少了開銷,因?yàn)楝F(xiàn)在批處理和流操作共享大部分代碼并在同一框架上運(yùn)行。
資料來(lái)源:Datanami
Spark MLLib包含一個(gè)框架,用于直接從任何數(shù)據(jù)集的預(yù)處理,特征提取,選擇和轉(zhuǎn)換創(chuàng)建機(jī)器學(xué)習(xí)模型。Spark能夠?qū)?shù)據(jù)存儲(chǔ)在內(nèi)存中并快速運(yùn)行重復(fù)查詢,這使其成為培訓(xùn)機(jī)器學(xué)習(xí)算法和縮短培訓(xùn)時(shí)間的理想選擇。模型可以由Apache Spark中的數(shù)據(jù)科學(xué)家使用R或Python進(jìn)行訓(xùn)練,使用MLLib保存,然后導(dǎo)入基于Java或基于Scala的管道。
該庫(kù)包括用于處理圖結(jié)構(gòu)的各種分布式算法。這些算法使用Spark Core的RDD方法來(lái)建模數(shù)據(jù);?在GraphFrames包可以讓你做dataframes圖操作,包括圖形查詢?nèi)〈呋瘎﹥?yōu)化的優(yōu)勢(shì)。
Databricks(由Apache Spark的創(chuàng)建者創(chuàng)建的公司)列出了Spark的以下用例:
數(shù)據(jù)集成和ETL
高性能批量計(jì)算
機(jī)器學(xué)習(xí)分析
實(shí)時(shí)流處理
這些應(yīng)用程序根本不是新的。但是他們?cè)赟park上要快得多。
謝謝閱讀!
如果您有興趣,請(qǐng)查看我的文章如何開始使用Apache Spark!
原文:https://towardsdatascience.com/apache-spark-101-3f961c89b8c5
Apache Spark的n00bs指南
我編寫本指南是為了幫助我自己理解Spark的基本底層功能,它適用于Hadoop生態(tài)系統(tǒng)以及它如何在Java和Scala中工作。我希望它對(duì)你有所幫助。
什么是Spark?
Spark是內(nèi)存框架中的通用計(jì)算引擎。它允許您以各種語(yǔ)言的腳本方式執(zhí)行實(shí)時(shí)和批處理工作,具有強(qiáng)大的容錯(cuò)能力。你為什么要關(guān)心Spark是什么?說(shuō)白了,它解決了Hadoop MapReduce的許多缺點(diǎn),比Hadoop MapReduce大約快10到100倍。Spark在數(shù)據(jù)科學(xué)方面是一個(gè)大問題;?一些使用Spark的著名組織是;?亞馬遜,NASA噴氣推進(jìn)實(shí)驗(yàn)室,IBM和日立。本文的目的是讓您快速了解Spark提供的功能,基本的內(nèi)部工作以及讓您了解Spark的精彩程度。
大數(shù)據(jù)環(huán)境中的Sparks上下文
Spark旨在與外部集群管理器或其自己的獨(dú)立管理器一起使用。Spark還依賴于分布式存儲(chǔ)系統(tǒng)來(lái)運(yùn)行,它可以從中調(diào)用它要使用的數(shù)據(jù)。支持以下系統(tǒng):
Spark Standalone Manager
Hadoop YARN
Apache Mesos
Hadoop分布式文件系統(tǒng)(HDFS)
MapR文件系統(tǒng)(MapR-FS)
卡桑德拉
OpenStack Swift
亞馬遜S3
庫(kù)杜
出于安全考慮,我將只關(guān)注Hadoop生態(tài)系統(tǒng)中的Spark。
Spark Core提供了一個(gè)平臺(tái),解決了Hadoop MapReduce的許多缺點(diǎn),因?yàn)樗试S我們從必須將任務(wù)分解為小型原子作業(yè),以及不得不在分布式系統(tǒng)開發(fā)中構(gòu)建解決方案的復(fù)雜性。
賽門鐵克注意:術(shù)語(yǔ)?Hadoop可互換使用,指?Hadoop生態(tài)系統(tǒng)或?Hadoop MapReduce或?Hadoop HDFS。在線閱讀“Spark取代Hadoop”或“Spark是新的Hadoop”,然后傾向于相信他們意味著Spark正在取代所有Hadoop服務(wù),這是很常見的但是!他們真正的意思是Spark在許多用例中扮演Hadoop MapReduce功能的角色。
Spark Core功能多樣,專為Hadoop生態(tài)系統(tǒng)而設(shè)計(jì);?它可以與MapReduce一起工作,或者為PIG,HIVE和SEARCH提供備用平臺(tái)。見圖1
Spark Streaming:管理來(lái)自各種來(lái)源的數(shù)據(jù)的實(shí)時(shí)微博。它允許通過在實(shí)時(shí)流上實(shí)現(xiàn)ML Lib和Graphx來(lái)計(jì)算實(shí)時(shí)結(jié)果。
GraphX:一個(gè)非常強(qiáng)大的庫(kù)來(lái)處理圖并行計(jì)算。不要將此與“Power Point圖”混淆,這個(gè)庫(kù)是關(guān)于數(shù)學(xué)中的一個(gè)領(lǐng)域,稱為圖論和建模對(duì)象之間的成對(duì)關(guān)系。
ML Lib:用于在本機(jī)分布式環(huán)境中對(duì)大型數(shù)據(jù)集運(yùn)行機(jī)器學(xué)習(xí)算法的庫(kù)。與在Python或Matlab中找到的更強(qiáng)大的機(jī)器學(xué)習(xí)庫(kù)相比,該庫(kù)仍處于起步階段。
Spark SQL:允許使用SQL采石場(chǎng)來(lái)采集非關(guān)系分布式數(shù)據(jù)庫(kù)。
Spark Steaming,GraphX,MLLib和Spark SQL都會(huì)在適當(dāng)?shù)臅r(shí)候收到他們自己的文章,但與此同時(shí)請(qǐng)不要猶豫查找官方文檔[1]?[2]?[3]?[4]。
是什么讓Spark,Spark?
在最高級(jí)別的抽象中,Spark包含三個(gè)組件,使其成為唯一的Spark;?Driver,Executer和DAG。
司機(jī)和執(zhí)行者
Spark使用主從架構(gòu)。驅(qū)動(dòng)程序協(xié)調(diào)許多分布式工作程序,以便以分布式方式執(zhí)行任務(wù),同時(shí)資源管理器處理資源分配以完成任務(wù)。
把它想象成“Orchestrator”。驅(qū)動(dòng)程序是主方法運(yùn)行的地方。它將程序轉(zhuǎn)換為任務(wù),然后將任務(wù)計(jì)劃到執(zhí)行程序。司機(jī)可以使用3種不同的方式與執(zhí)行者溝通;?Broadcast,Take,DAG - 這些將在短期內(nèi)詳細(xì)闡述。
執(zhí)行程序在JVM實(shí)例中從驅(qū)動(dòng)程序執(zhí)行委派任務(wù)。執(zhí)行程序在Spark應(yīng)用程序的開頭啟動(dòng),通常在應(yīng)用程序的整個(gè)生命周期內(nèi)運(yùn)行。此方法允許數(shù)據(jù)在內(nèi)存中持久存在,而不同的任務(wù)在整個(gè)應(yīng)用程序的生命周期中加載進(jìn)出執(zhí)行。
驅(qū)動(dòng)程序可以與執(zhí)行程序通信的方法有多種。作為開發(fā)人員或數(shù)據(jù)科學(xué)家,了解不同類型的通信及其用例非常重要。
廣播操作:驅(qū)動(dòng)程序?qū)⒈匾臄?shù)據(jù)傳輸給每個(gè)執(zhí)行程序。對(duì)于數(shù)百萬(wàn)條記錄,+ - 1gb數(shù)據(jù)的數(shù)據(jù)集,此操作是最佳的。此操作可能會(huì)成為一項(xiàng)非常昂貴的任務(wù)。
采取行動(dòng):驅(qū)動(dòng)程序從所有執(zhí)行程序獲取數(shù)據(jù)。此操作可能是非常昂貴且危險(xiǎn)的操作,因?yàn)轵?qū)動(dòng)程序可能會(huì)耗盡內(nèi)存并且網(wǎng)絡(luò)可能會(huì)變得不堪重負(fù)。
DAG行動(dòng):這是三者中最便宜的行動(dòng)。它將控制流邏輯從驅(qū)動(dòng)程序傳輸?shù)綀?zhí)行程序。
Spark比Hadoop MapReduce具有相當(dāng)大的性能提升,但它在內(nèi)存中運(yùn)行時(shí)也具有更高的運(yùn)營(yíng)成本,并且需要高帶寬網(wǎng)絡(luò)環(huán)境(建議+ 10Gb / s)。建議Spark群集中的內(nèi)存應(yīng)至少與您需要處理的數(shù)據(jù)量一樣大。如果沒有足夠的內(nèi)存用于作業(yè),Spark有幾種方法可以將數(shù)據(jù)溢出到磁盤上。有關(guān)硬件要求和建議的更多信息。
發(fā)展議程集團(tuán)
DAG是一個(gè)有向無(wú)環(huán)圖,概述了從A點(diǎn)到B點(diǎn)所需的一系列步驟。與大多數(shù)其他計(jì)算引擎一樣,Hadoop MapReduce獨(dú)立于DAG工作。這些DAG獨(dú)立計(jì)算引擎依賴于諸如HIVE或PIG之類的腳本平臺(tái)來(lái)將作業(yè)鏈接在一起以實(shí)現(xiàn)期望的結(jié)果。讓Spark在比較中如此強(qiáng)大的原因在于它是DAG的認(rèn)知并積極管理DAG。這允許Spark優(yōu)化作業(yè)流以獲得最佳性能,并允許回滾和作業(yè)冗余功能。
請(qǐng)看圖3.我將通過討論其組件來(lái)詳細(xì)說(shuō)明DAG及其運(yùn)行方式。
源可以是Spark支持的任何數(shù)據(jù)源。其中一些是:HDFS,關(guān)系數(shù)據(jù)庫(kù),CSV文件等。稍后您將看到我們?cè)诃h(huán)境上下文設(shè)置中定義它。
彈性分布式數(shù)據(jù)集本質(zhì)上是無(wú)法更改的數(shù)據(jù)集。這些實(shí)體存在于內(nèi)存中,并且它們本質(zhì)上是不可變的。由于這種不變性;?在對(duì)現(xiàn)有RDD執(zhí)行的每個(gè)轉(zhuǎn)換之后創(chuàng)建新的RDD。這種設(shè)計(jì)的結(jié)果是冗余;?如果在DAG執(zhí)行中的任何時(shí)刻出現(xiàn)故障,則可以回滾到正常運(yùn)行狀態(tài)并重新嘗試失敗的操作/轉(zhuǎn)換。
原始形式的RDD沒有附加到它們的模式,但可以使用稱為DataFrames的東西進(jìn)行擴(kuò)展。DataFrames為其中包含的數(shù)據(jù)集添加模式功能;?這在處理關(guān)系數(shù)據(jù)集時(shí)非常有用。
轉(zhuǎn)換將RDD轉(zhuǎn)換為另一個(gè)RDD。一些示例轉(zhuǎn)換是:
地圖
reduceByKey
GroupByKey
JoinByKey
SparkSQL
操作是檢索數(shù)據(jù)以回答問題的任何操作。一些例子是;?數(shù)數(shù),拿,每個(gè)。
執(zhí)行DAG
Spark做了一個(gè)叫懶惰評(píng)估的事情。DAG本身是由轉(zhuǎn)換構(gòu)造的,但在調(diào)用Action之前沒有任何反應(yīng)。執(zhí)行操作時(shí),Spark將查看DAG,然后在需要執(zhí)行的作業(yè)的上下文中對(duì)其進(jìn)行優(yōu)化,以達(dá)到要求執(zhí)行的操作步驟。最終執(zhí)行DAG時(shí),驅(qū)動(dòng)程序會(huì)將轉(zhuǎn)換命令發(fā)送給集群上的執(zhí)行程序。
APACHE FLUME API
Apache Flume的開發(fā)理念是允許開發(fā)人員使用與非分布式編程相同的代碼創(chuàng)建可在分布式系統(tǒng)上運(yùn)行的程序。換句話說(shuō),Apache Flume允許我們編寫可以在單個(gè)線程和多個(gè)線程機(jī)器上運(yùn)行而沒有問題的代碼。Apache Flume的含義是我們現(xiàn)在可以在本地計(jì)算機(jī)上運(yùn)行代碼并對(duì)其進(jìn)行調(diào)試,同時(shí)確保它可以在我們的Spark Hadoop集群上運(yùn)行。進(jìn)一步的影響是,您可以從群集中提取數(shù)據(jù)并在本地計(jì)算機(jī)上運(yùn)行它以進(jìn)行測(cè)試和開發(fā)。
支持以下語(yǔ)言:
斯卡拉
Java的
蟒蛇
[R
為了演示Spark的一些內(nèi)部工作原理,我將在ScalaFlume和JavaFlume中運(yùn)行一個(gè)字?jǐn)?shù)計(jì)算示例。
第1行到第2行初始化我們的Spark Context并定義我們的源代碼。在第3行中,我們定義了初始RDD。在第4到第6行中,我們定義了RDD的轉(zhuǎn)換并定義了一些新的RDDS。注意第7行,沒有執(zhí)行任何代碼;?只有我們的DAG已經(jīng)建成。在第7行,我們最終有一個(gè)動(dòng)作然后執(zhí)行轉(zhuǎn)換。重要的是要注意,在集群中分配的唯一工作是藍(lán)色的,因?yàn)槟切﹍ambda表達(dá)式是由執(zhí)行者運(yùn)行的轉(zhuǎn)換!其他所有內(nèi)容都在驅(qū)動(dòng)程序上執(zhí)行。
斯卡拉宣傳方注:Scala是一種構(gòu)建在JVM編譯器之上的令人驚嘆的語(yǔ)言。它為具有OOP背景的開發(fā)人員提供了一個(gè)環(huán)境,可以輕松實(shí)現(xiàn)最適合分布式計(jì)算編程的函數(shù)式編程思維模式。Scala通過同時(shí)為OO和函數(shù)式編程范例提供支持來(lái)實(shí)現(xiàn)這一點(diǎn)。你為什么要關(guān)心?Spark是使用Scala構(gòu)建的,因此Spark中的最新功能將始終首先在Scala中實(shí)現(xiàn)。在處理大型數(shù)據(jù)集時(shí),Scala與其他語(yǔ)言相比也提供了最佳性能 - 例如:根據(jù)用例,Scala比Python大約快10到225倍。Scala也被數(shù)據(jù)科學(xué)和分布式計(jì)算領(lǐng)域的一些知名人士,亞馬遜和谷歌等人使用。
以藍(lán)色突出顯示的代碼是轉(zhuǎn)換并構(gòu)建DAG。更重要的是,請(qǐng)注意,基本上每個(gè)轉(zhuǎn)換都是一個(gè)對(duì)象,然后發(fā)送給所有分布式執(zhí)行程序。這也發(fā)生在Scala示例中,但lambda表達(dá)式隱藏了您的這一層交互。轉(zhuǎn)換對(duì)象不會(huì)由集群中的執(zhí)行程序執(zhí)行,直到驅(qū)動(dòng)程序執(zhí)行第27行中的操作代碼(以紅色突出顯示)。
結(jié)論
總之,我希望本文能幫助您掌握使Spark成為數(shù)據(jù)科學(xué)和數(shù)據(jù)工程的有趣且強(qiáng)大的平臺(tái)的基礎(chǔ)知識(shí)。
本文的內(nèi)容應(yīng)該是:
Spark Core與Hadoop MapReduce并行或取代。
與其他計(jì)算引擎相比,Spark更快!火花的速度來(lái)自于DAG的認(rèn)知并可以優(yōu)化它;?它通過保持JVM狀態(tài)為整個(gè)作業(yè)保持?jǐn)?shù)據(jù)在內(nèi)存中的最終目標(biāo)是最小化I / O到磁盤。
Spark擁有一些用于機(jī)器學(xué)習(xí),圖形理論,數(shù)據(jù)流和SQL的優(yōu)秀數(shù)據(jù)科學(xué)和數(shù)據(jù)工程API。
Spark中認(rèn)知的主要組件是驅(qū)動(dòng)程序和執(zhí)行程序。這兩個(gè)組件通過稱為DAG的東西運(yùn)行,由Spark直接管理。有一種稱為轉(zhuǎn)換的東西,它構(gòu)建DAG并從現(xiàn)有RDD生成新的RDD。RDD是一個(gè)不可變的數(shù)據(jù)實(shí)體,提供;?借助DAG實(shí)現(xiàn)冗余和回滾功能。只有在執(zhí)行了一個(gè)動(dòng)作后才會(huì)執(zhí)行DAG。
Apache Flume允許您在本地計(jì)算機(jī)上使用一些完善的編程語(yǔ)言編寫程序,以進(jìn)行開發(fā)和調(diào)試。然后,可以在不需要更改的分布式系統(tǒng)中部署相同的Apache Flume代碼。Scala太棒了。
參考書目
針對(duì)Java和Scala開發(fā)人員的Apache Spark簡(jiǎn)介 - Ted Malaska(Cloudera)
什么是Apache Spark?
官方文件
原文:https://www.toptal.com/spark/introduction-to-apache-spark
使用示例和用例介紹Apache Spark
我在2013年末第一次聽說(shuō)Spark,當(dāng)時(shí)我開始對(duì)Scala這種語(yǔ)言感興趣。一段時(shí)間后,我做了一個(gè)有趣的數(shù)據(jù)科學(xué)項(xiàng)目,試圖預(yù)測(cè)泰坦尼克號(hào)的生存。這被證明是進(jìn)一步介紹Spark概念和編程的好方法。我強(qiáng)烈建議任何有抱負(fù)的Spark開發(fā)人員尋找一個(gè)開始的地方。
今天,Spark被亞馬遜,eBay和雅虎等主要廠商采用。許多組織在具有數(shù)千個(gè)節(jié)點(diǎn)的集群上運(yùn)行Spark。根據(jù)Spark FAQ,已知最大的集群有超過8000個(gè)節(jié)點(diǎn)。確實(shí),Spark是值得注意和學(xué)習(xí)的技術(shù)。
本文介紹Spark,包括用例和示例。它包含來(lái)自Apache Spark網(wǎng)站的信息以及Learning Spark - Lightning-Fast Big Data Analysis一書。
什么是Apache Spark?一個(gè)介紹
Spark是一個(gè)宣傳為“閃電般快速集群計(jì)算”的Apache項(xiàng)目。它擁有蓬勃發(fā)展的開源社區(qū),是目前最活躍的Apache項(xiàng)目。
Spark提供了更快,更通用的數(shù)據(jù)處理平臺(tái)。與Hadoop相比,Spark使您可以在內(nèi)存中運(yùn)行速度提高100倍,在磁盤上運(yùn)行速度提高10倍。去年,Spark通過完成100 TB TB Daytona GraySort比賽,以十分之一的速度完成了Hadoop,并且成為了分類PB級(jí)的最快的開源引擎。
Spark還可以更快地編寫代碼,因?yàn)槟梢允褂?0多個(gè)高級(jí)操作員。為了演示這一點(diǎn),讓我們看一下BigData的“Hello World!”:Word Count示例。用Java編寫的MapReduce有大約50行代碼,而在Spark(和Scala)中你可以像這樣簡(jiǎn)單地執(zhí)行:
sparkContext.textFile("hdfs://...") ????????????.flatMap(line?=>?line.split("?")) ????????????.map(word?=>?(word,?1)).reduceByKey(_?+?_) ????????????.saveAsTextFile("hdfs://...")
學(xué)習(xí)如何使用Apache Spark的另一個(gè)重要方面是交互式shell(REPL),它提供了開箱即用的功能。使用REPL,可以測(cè)試每行代碼的結(jié)果,而無(wú)需首先編寫代碼并執(zhí)行整個(gè)作業(yè)。因此,工作代碼的路徑要短得多,并且可以進(jìn)行臨時(shí)數(shù)據(jù)分析。
Spark的其他主要功能包括:
目前提供Scala,Java和Python API,并在途中支持其他語(yǔ)言(如R)
與Hadoop生態(tài)系統(tǒng)和數(shù)據(jù)源(HDFS,Amazon S3,Hive,HBase,Cassandra等)完美集成
可以在由Hadoop YARN或Apache Mesos管理的集群上運(yùn)行,也可以獨(dú)立運(yùn)行
Spark核心由一組功能強(qiáng)大的高級(jí)庫(kù)補(bǔ)充,可以在同一個(gè)應(yīng)用程序中無(wú)縫使用。這些庫(kù)目前包括SparkSQL,Spark Streaming,MLlib(用于機(jī)器學(xué)習(xí))和GraphX,本文將進(jìn)一步詳細(xì)介紹每個(gè)庫(kù)。目前正在開發(fā)其他Spark庫(kù)和擴(kuò)展。
Spark Core
Spark Core是大規(guī)模并行和分布式數(shù)據(jù)處理的基礎(chǔ)引擎。它負(fù)責(zé):
內(nèi)存管理和故障恢復(fù)
在集群上調(diào)度,分發(fā)和監(jiān)視作業(yè)
與存儲(chǔ)系統(tǒng)交互
Spark引入了RDD(彈性分布式數(shù)據(jù)集)的概念,這是一種不可變的容錯(cuò),分布式對(duì)象集合,可以并行操作。RDD可以包含任何類型的對(duì)象,并通過加載外部數(shù)據(jù)集或從驅(qū)動(dòng)程序分發(fā)集合來(lái)創(chuàng)建。
RDD支持兩種類型的操作:
轉(zhuǎn)換是在RDD上執(zhí)行并產(chǎn)生包含結(jié)果的新RDD的操作(例如map,filter,join,union等)。
操作是在RDD上運(yùn)行計(jì)算后返回值的操作(例如reduce,count,first等)。
Spark中的轉(zhuǎn)換是“懶惰的”,這意味著它們不會(huì)立即計(jì)算結(jié)果。相反,它們只是“記住”要執(zhí)行的操作以及要對(duì)其執(zhí)行操作的數(shù)據(jù)集(例如,文件)。只有在調(diào)用操作并將結(jié)果返回給驅(qū)動(dòng)程序時(shí),才會(huì)實(shí)際計(jì)算轉(zhuǎn)換。這種設(shè)計(jì)使Spark能夠更有效地運(yùn)行。例如,如果一個(gè)大文件以各種方式轉(zhuǎn)換并傳遞給第一個(gè)動(dòng)作,Spark只會(huì)處理并返回第一行的結(jié)果,而不是為整個(gè)文件執(zhí)行工作。
默認(rèn)情況下,每次對(duì)其執(zhí)行操作時(shí),都可以重新計(jì)算每個(gè)轉(zhuǎn)換后的RDD。但是,您也可以使用persist或cache方法在內(nèi)存中保留RDD,在這種情況下,Spark會(huì)在群集上保留元素,以便在下次查詢時(shí)更快地訪問。
SparkSQL
SparkSQL是一個(gè)Spark組件,支持通過SQL或Hive查詢語(yǔ)言查詢數(shù)據(jù)。它起源于運(yùn)行在Spark(代替MapReduce)之上的Apache Hive端口,現(xiàn)在與Spark堆棧集成。除了為各種數(shù)據(jù)源提供支持外,還可以使用代碼轉(zhuǎn)換編寫SQL查詢,從而生成一個(gè)非常強(qiáng)大的工具。下面是Hive兼容查詢的示例:
//?sc?is?an?existing?SparkContext.val?sqlContext?=?new?org.apache.spark.sql.hive.HiveContext(sc)sqlContext.sql("CREATE?TABLE?IF?NOT?EXISTS?src?(key?INT,?value?STRING)")sqlContext.sql("LOAD?DATA?LOCAL?INPATH?'examples/src/main/resources/kv1.txt'?INTO?TABLE?src")//?Queries?are?expressed?in?HiveQLsqlContext.sql("FROM?src?SELECT?key,?value").collect().foreach(println)
Spark Streaming
Spark Streaming支持實(shí)時(shí)處理流數(shù)據(jù),例如生產(chǎn)Web服務(wù)器日志文件(例如Apache Flume和HDFS / S3),Twitter等社交媒體以及Kafka等各種消息隊(duì)列。在引擎蓋下,Spark Streaming接收輸入數(shù)據(jù)流并將數(shù)據(jù)分成批次。接下來(lái),它們由Spark引擎處理并分批生成最終結(jié)果流,如下所示。
Spark Streaming API與Spark Core的API緊密匹配,使程序員可以輕松地在批處理和流數(shù)據(jù)的世界中工作。
MLlib
MLlib是一個(gè)機(jī)器學(xué)習(xí)庫(kù),提供各種算法,旨在擴(kuò)展到集群上進(jìn)行分類,回歸,聚類,協(xié)同過濾等等(查看Toptal關(guān)于機(jī)器學(xué)習(xí)的文章,了解有關(guān)該主題的更多信息)。其中一些算法也適用于流數(shù)據(jù),例如使用普通最小二乘法或k均值聚類的線性回歸(以及更多的方法)。Apache?Mahout(Hadoop的機(jī)器學(xué)習(xí)庫(kù))已經(jīng)脫離了MapReduce,并加入了Spark MLlib。
GraphX
GraphX是一個(gè)用于操作圖形和執(zhí)行圖形并行操作的庫(kù)。它為ETL,探索性分析和迭代圖計(jì)算提供了統(tǒng)一的工具。除了圖形操作的內(nèi)置操作外,它還提供了一個(gè)常用圖算法庫(kù),如PageRank。
如何使用Apache Spark:事件檢測(cè)用例
現(xiàn)在我們已經(jīng)回答了“什么是Apache Spark?”的問題,讓我們想一想最有效地使用哪些問題或挑戰(zhàn)。
我最近發(fā)現(xiàn)了一篇關(guān)于通過分析Twitter流來(lái)檢測(cè)地震的實(shí)驗(yàn)。有趣的是,據(jù)證明,這種技術(shù)很可能比日本氣象廳更快地通知你日本的地震。即使他們?cè)谖恼轮惺褂昧瞬煌募夹g(shù),我認(rèn)為這是一個(gè)很好的例子,看看我們?nèi)绾螌park用于簡(jiǎn)化的代碼片段并且沒有膠水代碼。
首先,我們必須過濾看似相關(guān)的推文,如“地震”或“搖晃”。我們可以很容易地將Spark Streaming用于此目的,如下所示:
TwitterUtils.createStream(...) ????????????.filter(_.getText.contains("earthquake")?||?_.getText.contains("shaking"))
//?We?would?prepare?some?earthquake?tweet?data?and?load?it?in?LIBSVM?format.val?data?=?MLUtils.loadLibSVMFile(sc,?"sample_earthquate_tweets.txt")//?Split?data?into?training?(60%)?and?test?(40%).val?splits?=?data.randomSplit(Array(0.6,?0.4),?seed?=?11L)val?training?=?splits(0).cache()val?test?=?splits(1)//?Run?training?algorithm?to?build?the?modelval?numIterations?=?100val?model?=?SVMWithSGD.train(training,?numIterations)//?Clear?the?default?threshold.model.clearThreshold()//?Compute?raw?scores?on?the?test?set.?val?scoreAndLabels?=?test.map?{?point?=> ??val?score?=?model.predict(point.features) ??(score,?point.label)}//?Get?evaluation?metrics.val?metrics?=?new?BinaryClassificationMetrics(scoreAndLabels)val?auROC?=?metrics.areaUnderROC()println("Area?under?ROC?=?"?+?auROC)
如果我們對(duì)模型的預(yù)測(cè)率感到滿意,我們可以進(jìn)入下一階段并在發(fā)現(xiàn)地震時(shí)做出反應(yīng)。為了檢測(cè)一個(gè),我們?cè)诙x的時(shí)間窗口中需要一定數(shù)量(即密度)的正推文(如文章中所述)。請(qǐng)注意,對(duì)于啟用了Twitter位置服務(wù)的推文,我們還會(huì)提取地震的位置。有了這些知識(shí),我們可以使用SparkSQL并查詢現(xiàn)有的Hive表(存儲(chǔ)有興趣接收地震通知的用戶)來(lái)檢索他們的電子郵件地址并向他們發(fā)送個(gè)性化的警告電子郵件,如下所示:
//?sc?is?an?existing?SparkContext.val?sqlContext?=?new?org.apache.spark.sql.hive.HiveContext(sc)//?sendEmail?is?a?custom?functionsqlContext.sql("FROM?earthquake_warning_users?SELECT?firstName,?lastName,?city,?email") ??????????.collect().foreach(sendEmail)
其他Apache Spark用例
Spark的潛在用例當(dāng)然遠(yuǎn)遠(yuǎn)超出了地震的檢測(cè)范圍。
這是一個(gè)快速(但肯定無(wú)法詳盡!)的其他用例的抽樣,需要處理大數(shù)據(jù)的速度,種類和數(shù)量,Spark非常適合:
在游戲行業(yè)中,處理和發(fā)現(xiàn)實(shí)時(shí)游戲內(nèi)事件的潛在消息并能夠立即響應(yīng)它們的模式是一種可以產(chǎn)生利潤(rùn)豐厚的業(yè)務(wù)的能力,用于諸如玩家保留,目標(biāo)廣告,汽車等目的 - 復(fù)雜程度的調(diào)整,等等。
在電子商務(wù)行業(yè)中,實(shí)時(shí)交易信息可以傳遞給流式聚類算法,如k-means或協(xié)同過濾,如ALS。結(jié)果甚至可以與其他非結(jié)構(gòu)化數(shù)據(jù)源(例如客戶評(píng)論或產(chǎn)品評(píng)論)結(jié)合使用,并用于隨著時(shí)間的推移不斷改進(jìn)和調(diào)整建議的新趨勢(shì)。
在金融或安全行業(yè)中,Spark堆棧可以應(yīng)用于欺詐或入侵檢測(cè)系統(tǒng)或基于風(fēng)險(xiǎn)的身份驗(yàn)證。通過收集大量存檔日志,將其與外部數(shù)據(jù)源(如有關(guān)數(shù)據(jù)泄露和受損帳戶的信息(例如,請(qǐng)參閱https://haveibeenpwned.com/)和來(lái)自連接的信息/)相結(jié)合,可以獲得一流的結(jié)果。IP地理定位或時(shí)間等請(qǐng)求。
結(jié)論
總而言之,Spark有助于簡(jiǎn)化處理大量實(shí)時(shí)或歸檔數(shù)據(jù)(包括結(jié)構(gòu)化和非結(jié)構(gòu)化)的挑戰(zhàn)性和計(jì)算密集型任務(wù),無(wú)縫集成相關(guān)的復(fù)雜功能,如機(jī)器學(xué)習(xí)和圖形算法。Spark為大眾帶來(lái)了大數(shù)據(jù)處理。看看這個(gè)!
原文:https://medium.com/plumbersofdatascience/apache-spark-101-971aaf5d4334
Apache Spark 101
Apache Spark?是用于大規(guī)模數(shù)據(jù)處理的統(tǒng)一分析引擎。它最初于2009年在加州大學(xué)伯克利分校的AMPLab中開發(fā),并于2010年作為Apache項(xiàng)目開源。它是用Scala編寫的,但API可用于Scala,Python,Java和R.您還可以在Spark SQL中像Hive查詢一樣運(yùn)行SQL。我將使用Spark 2.4和Scala進(jìn)行此介紹。現(xiàn)在Spark擁有超過1300名貢獻(xiàn)者和非常好的社區(qū)支持。
Spark的歷史:加州大學(xué)伯克利分校的團(tuán)隊(duì)正在構(gòu)建Mesos,這是一個(gè)集群管理框架,他們希望展示在Mesos中從頭開始構(gòu)建框架是多么容易。這就是Spark誕生的方式!關(guān)于Spark的起源故事,在這部關(guān)于Ion Stoica的Oreilly?播客中有更多細(xì)節(jié)。
為何選擇Spark?
它是針對(duì)不同種類的大數(shù)據(jù)問題的一站式解決方案,是批量,實(shí)時(shí)(幾乎),機(jī)器學(xué)習(xí),深度學(xué)習(xí)和圖形的統(tǒng)一平臺(tái)。
您可以使用Yarn或Kubernetes或Mesos在現(xiàn)有Hadoop集群上運(yùn)行spark。
適合所有人,Digaset適用于Scala粉絲,Spark SQL適用于過去10年在Oracle工作過的人,Teradata(遺留系統(tǒng)),數(shù)據(jù)框架python pandas粉絲。
顯然,速度是由眾多基準(zhǔn),圖表和所有好東西支持的。
建筑
Spark有Master和Slave架構(gòu),我更喜歡稱它為Master-Worker架構(gòu)(不是奴隸這個(gè)詞的忠實(shí)粉絲)。Master是托管驅(qū)動(dòng)程序的實(shí)例,Worker是托管執(zhí)行程序的實(shí)例。這些可以托管在同一節(jié)點(diǎn)(在您的Mac上)或不同的節(jié)點(diǎn)(具有多個(gè)EC2實(shí)例的EMR集群)上。基本上,有一個(gè)驅(qū)動(dòng)程序,一個(gè)worker,一個(gè)執(zhí)行程序和Cluster Manager。
驅(qū)動(dòng)程序:Spark上下文對(duì)象主程序是驅(qū)動(dòng)程序。它是一個(gè)JVM進(jìn)程,負(fù)責(zé)執(zhí)行任務(wù)。
Worker:Worker是執(zhí)行程序在集群中執(zhí)行用戶編寫的應(yīng)用程序代碼的實(shí)例。
集群管理器:它負(fù)責(zé)在spark應(yīng)用程序中分配資源。除了Spark的獨(dú)立集群管理器之外,Spark上下文還能夠連接到幾種類型的集群管理器,如Mesos,Yarn或Kubernetes。
執(zhí)行程序:它是為工作節(jié)點(diǎn)上的應(yīng)用程序啟動(dòng)的JVM進(jìn)程,它運(yùn)行任務(wù)并將數(shù)據(jù)保存在內(nèi)存或磁盤存儲(chǔ)中。每個(gè)應(yīng)用程序都有自己的執(zhí)行程序。
PS:一些假設(shè):你熟悉Scala和Sbt。
首先是在你的build.sbt。中添加Spark依賴項(xiàng)。
name := "spark-examples"
version := "0.1"
scalaVersion := "2.12.8"
val sparkVersion = "2.4.0"
resolvers += "Spark Packages Repo" at "http://dl.bintray.com/spark-packages/maven"libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % sparkVersion,
"org.apache.spark" %% "spark-sql" % sparkVersion,
"org.apache.spark" %% "spark-sql-kafka-0-10" % sparkVersion,
"org.postgresql" % "postgresql" % "42.2.5",
// ?"com.holdenkarau" %% "spark-testing-base" % "2.2.0_0.8.0" % "test"
//tests
"MrPowers" % "spark-fast-tests" % "0.17.1-s_2.12"
)
您可以通過創(chuàng)建Spark Context開始,
import org.apache.spark.sql.SparkSession
object Runner {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder.appName("SparkSessionExample")
.master("local[4]") // To runn locally; use 4 cores
.config("spark.sql.warehouse.dir", "target/spark-warehouse")
.getOrCreate
}
}
Spark API
Apache Spark中有3個(gè)主要抽象:
1)RDD:這是Spark中最基本的數(shù)據(jù)抽象,是彈性分布式數(shù)據(jù)集的縮寫。它是一個(gè)容錯(cuò)的容錯(cuò)集合,可以并行操作.RDD是一個(gè)不可變的分布式數(shù)據(jù)元素集合,在集群中的節(jié)點(diǎn)之間進(jìn)行分區(qū),可以與提供轉(zhuǎn)換的低級(jí)API并行運(yùn)行和行動(dòng)。創(chuàng)建RDD有兩種方法,可以通過并行化驅(qū)動(dòng)程序中的現(xiàn)有集合,也可以通過從外部存儲(chǔ)系統(tǒng)讀取數(shù)據(jù),例如共享文件系統(tǒng),HDFS,HBase或任何提供Hadoop InputFormat的數(shù)據(jù)源。
要?jiǎng)?chuàng)建RDD,
val sc = spark.sparkContext
val myRdd:RDD [(String,Int)] = sc.parallelize(
Seq(
(“Jon”,1),
(“Tyrion”,2),
(“Bronn”,3)
)
)
SparkContext是一個(gè)Scala實(shí)現(xiàn)入口點(diǎn)。SparkContext表示與Spark群集的連接,可用于在該群集上創(chuàng)建RDD,累加器和廣播變量。
注意:RDD現(xiàn)在更像是一個(gè)低級(jí)代碼,因?yàn)閟park已經(jīng)演變?yōu)楦叩某橄螅瑥亩峁└玫男阅堋H绻覀儽仨氁誀奚恍﹥?yōu)化和性能優(yōu)勢(shì)為代價(jià)來(lái)處理非結(jié)構(gòu)化數(shù)據(jù),那么它仍然是一個(gè)不錯(cuò)的選擇。
2)Dataframe:它是組織成命名列的分布式數(shù)據(jù)集合。它在概念上等同于關(guān)系數(shù)據(jù)庫(kù)或數(shù)據(jù)框架中的表,但引擎蓋下的內(nèi)容更多。DataFrame允許開發(fā)人員將結(jié)構(gòu)強(qiáng)加到分布式數(shù)據(jù)集合上,從而允許更高級(jí)別的抽象。從2.0開始,Dataframe API與Dataset合并。現(xiàn)在,DataFrame是一個(gè)組織成命名列的數(shù)據(jù)集。
type?DataFrame?=?Dataset[Row]
可以從RDD創(chuàng)建數(shù)據(jù)幀。
val
注意:import?spark.implicits._使用$stringto a?column類型將常見Scala對(duì)象轉(zhuǎn)換為Dataset所需的導(dǎo)入。
可以從各種數(shù)據(jù)源讀取數(shù)據(jù)幀,例如csv,jdbc,json,parquet,s3等等。
spark.read.csv("users.txt")
可以推斷出數(shù)據(jù)幀的模式:
dfWithColumnNames.printSchema() root ?|?—?name:?string?(nullable?=?true) ?|?—?id:?integer?(nullable?=?false)
此外,可以執(zhí)行SQL查詢:
df.createOrReplaceTempView("people") dfWithColumnNames.createOrReplaceTempView("got") val?sqlDF?=?spark.sql("SELECT?*?FROM?got?where?name?=?'Jon'?") sqlDF.show() +----+---+ |name|?id| +----+---+ |?Jon|??1| +----+---+
除了方便的DSL之外,還有許多隱藏的好東西,例如Catalyst優(yōu)化器,基于成本的優(yōu)化器,用于火花和模式推理。
Dataframes還嘗試解決許多性能問題,這些問題與非jvm語(yǔ)言(如python和R)有關(guān)。從歷史上看,在python中使用RDD比在Scala中慢得多。使用Dataframes,編寫所有語(yǔ)言的代碼執(zhí)行相同但有一些例外。
3)數(shù)據(jù)集:?它是強(qiáng)類型特定于域的對(duì)象的集合,可以使用函數(shù)或關(guān)系運(yùn)算并行轉(zhuǎn)換。為?每個(gè)轉(zhuǎn)換創(chuàng)建并更新邏輯計(jì)劃,并在?調(diào)用操作時(shí)將最終邏輯計(jì)劃轉(zhuǎn)換為物理計(jì)劃。Spark的催化劑
優(yōu)化器優(yōu)化了邏輯計(jì)劃,并?以并行和分布式方式生成有效執(zhí)行的物理計(jì)劃。此外,還有編碼器生成優(yōu)化的,更低內(nèi)存占用的二進(jìn)制結(jié)構(gòu)。編碼器知道記錄的模式。這就是它們?nèi)绾翁峁┟黠@更快的
序列化和反序列化(與默認(rèn)的Java或Kryo序列化器相比)。
case?class?Characters(name:?String,?id:?Int)//Note?this?class?should?be?outside?your?main?object.
數(shù)據(jù)集的主要優(yōu)點(diǎn)是類型安全。使用數(shù)據(jù)集時(shí),我們可以確保在編譯期間捕獲語(yǔ)法錯(cuò)誤和分析錯(cuò)誤。與Dataframes相比,在編譯期間可以捕獲語(yǔ)法錯(cuò)誤,但只有在運(yùn)行它時(shí)才會(huì)捕獲諸如引用不存在的列名之類的Analysis錯(cuò)誤。運(yùn)行時(shí)間可能非常昂貴,而且作為開發(fā)人員,讓編譯器和IDE為您完成這些工作會(huì)很不錯(cuò)。
數(shù)據(jù)集建立在spark SQL引擎上,它使用Catalyst生成優(yōu)化的邏輯和物理查詢計(jì)劃,是一個(gè)很好的權(quán)衡數(shù)據(jù)幀和RDD。它具有Dataframes的性能和靈活性RDD,可以執(zhí)行更精細(xì)的粒度操作,例如lambda操作,這是SQL方法無(wú)法實(shí)現(xiàn)的。數(shù)據(jù)集為我們提供了兩全其美的優(yōu)勢(shì)。
此外,還有一個(gè)名為Tungsten的Spark?中令人興奮的功能,它可以理解數(shù)據(jù)集類型的JVM對(duì)象,并使用編碼器將特定于類型的JVM對(duì)象映射到Tungsten的內(nèi)部存儲(chǔ)器表示。基本上,鎢以更有效的方式將數(shù)據(jù)存儲(chǔ)在Java堆中,因?yàn)镾park有更多關(guān)于正在存儲(chǔ)的數(shù)據(jù)的信息,并嘗試創(chuàng)建緩存感知計(jì)算,并且還在運(yùn)行時(shí)生成動(dòng)態(tài)代碼。有很多基準(zhǔn)來(lái)支持這些性能增強(qiáng),并且隨著Spark接近3.0,它會(huì)變得更好。許多這些新功能在2.0中引入,許多功能都標(biāo)記為實(shí)驗(yàn)性的。但盡管如此,這是一個(gè)了解更多Spark的激動(dòng)人心的時(shí)刻。
https://zookeeper.apache.org/
https://github.com/antirez/redis
https://stackoverflow.com/questions/37293928/zookeeper-vs-in-memory-data-grid-vs-redis
https://zookeeper.apache.org/doc/current/zookeeperOver.html
多實(shí)例模式vs多租戶模式
https://blog.csdn.net/nimeijian/article/details/49614853
多租戶模式
SaaS現(xiàn)在已成為一股潮流,它將顛覆傳統(tǒng)的軟件交付方式
其實(shí)從架構(gòu)層面來(lái)分析,SaaS區(qū)別于傳統(tǒng)技術(shù)的重要差別就是Multi-Tenant模式。多租戶就是說(shuō)多個(gè)租戶共用一個(gè)實(shí)例,租戶的數(shù)據(jù)既有隔離又有共享,說(shuō)到底就是如何解決數(shù)據(jù)存儲(chǔ)的問題。
現(xiàn)在SaaS Multi-Tenant在數(shù)據(jù)存儲(chǔ)上存在三種主要的方案,分別是—
方案一:獨(dú)立數(shù)據(jù)庫(kù)
這是第一種方案,即一個(gè)Tenant一個(gè)Database(見圖3-14),這種方案的用戶數(shù)據(jù)隔離級(jí)別最高,安全性最好,但成本也高。
優(yōu)點(diǎn):
為不同的租戶提供獨(dú)立的數(shù)據(jù)庫(kù),有助于簡(jiǎn)化數(shù)據(jù)模型的擴(kuò)展設(shè)計(jì),滿足不同租戶的獨(dú)特需求;如果出現(xiàn)故障,恢復(fù)數(shù)據(jù)比較簡(jiǎn)單。
缺點(diǎn):
增大了數(shù)據(jù)庫(kù)的安裝數(shù)量,隨之帶來(lái)維護(hù)成本和購(gòu)置成本的增加。
這種方案與傳統(tǒng)的一個(gè)客戶、一套數(shù)據(jù)、一套部署類似,差別只在于軟件統(tǒng)一部署在運(yùn)營(yíng)商那里。如果面對(duì)的是銀行、醫(yī)院等需要非常高數(shù)據(jù)隔離級(jí)別的租戶,可以選擇這種模式,提高租用的定價(jià)。如果定價(jià)較低,產(chǎn)品走低價(jià)路線,這種方案一般對(duì)運(yùn)營(yíng)商來(lái)說(shuō)是無(wú)法承受的。
方案二:共享數(shù)據(jù)庫(kù),隔離數(shù)據(jù)架構(gòu).即多個(gè)或所有租戶共享Database,但一個(gè)Tenant一個(gè)Schema。
優(yōu)點(diǎn):
為安全性要求較高的租戶提供了一定程度的邏輯數(shù)據(jù)隔離,并不是完全隔離;每個(gè)數(shù)據(jù)庫(kù)可以支持更多的租戶數(shù)量。
缺點(diǎn):
如果出現(xiàn)故障,數(shù)據(jù)恢復(fù)比較困難,因?yàn)榛謴?fù)數(shù)據(jù)庫(kù)將牽扯到其他租戶的數(shù)據(jù);如果需要跨租戶統(tǒng)計(jì)數(shù)據(jù),存在一定困難。
方案三:共享數(shù)據(jù)庫(kù),共享數(shù)據(jù)架構(gòu).即租戶共享同一個(gè)Database、同一個(gè)Schema,但在表中通過TenantID區(qū)分租戶的數(shù)據(jù)。這是共享程度最高、隔離級(jí)別最低的模式。
優(yōu)點(diǎn):
三種方案比較,第三種方案的維護(hù)和購(gòu)置成本最低,允許每個(gè)數(shù)據(jù)庫(kù)支持的租戶數(shù)量最多。
缺點(diǎn):
隔離級(jí)別最低,安全性最低,需要在設(shè)計(jì)開發(fā)時(shí)加大對(duì)安全的開發(fā)量;數(shù)據(jù)備份和恢復(fù)最困難,需要逐表逐條備份和還原。如果希望以最少的服務(wù)器為最多的租戶提供服務(wù),并且租戶接受以犧牲隔離級(jí)別換取降低成本,這種方案最適合。
CRM系統(tǒng)未來(lái)將以中低端市場(chǎng)為主,所以采用第三種方案,只要做好數(shù)據(jù)隔離比較好了。千萬(wàn)不可掉以輕心,SaaS下的安全性設(shè)計(jì)很重要。一般常見的安全性設(shè)計(jì)分為兩類:系統(tǒng)級(jí)和程序級(jí)。
系統(tǒng)級(jí):
使用HTTPS協(xié)議以SSL(Security Socket Layer)交換數(shù)據(jù),增強(qiáng)通信安全;通過數(shù)字簽名防止傳輸過程篡改;對(duì)用戶身份識(shí)別的UserToken使用DES算法數(shù)據(jù)加密;業(yè)務(wù)數(shù)據(jù)定時(shí)自動(dòng)備份。
程序級(jí):
完整的權(quán)限配置,包括功能權(quán)限和數(shù)據(jù)權(quán)限;客戶端輸入校驗(yàn),防止JS攻擊、XSS攻擊、SQL注入等;輔助安全設(shè)計(jì),比如密碼控件、圖片驗(yàn)證碼、手機(jī)確認(rèn)碼等。
Hadoop集群
YARN是Hadoop集群的默認(rèn)資源管理器和任務(wù)調(diào)度器
Terraform
Terraform是一個(gè)批量管理資源的工具,可以十分方便地對(duì)資源進(jìn)行增刪改查等操作。如果兩個(gè)資源之間存在依賴關(guān)系,比如VPC和ECS,這種情況下我們可以使用outputs.tf文件,將創(chuàng)建的VPC和subnet信息通過outputs.tf文件傳給ECS。
MPP(Massive Parallel Processing)架構(gòu),支持行存儲(chǔ)和列存儲(chǔ),提供PB(Petabyte,2的50次方字節(jié))級(jí)別數(shù)據(jù)量的處理能力。
DLF包含三種業(yè)務(wù):DLF、DI、DG。
DLF:即數(shù)據(jù)湖工廠(Data lake factory),它可管理多種大數(shù)據(jù)服務(wù),提供一站式的大數(shù)據(jù)開發(fā)環(huán)境、全托管的大數(shù)據(jù)調(diào)度能力,極大降低用戶使用大數(shù)據(jù)的門檻,幫助用戶快速構(gòu)建大數(shù)據(jù)處理中心。
DI:即數(shù)據(jù)融合(Data Integration)。提供同構(gòu)/異構(gòu)數(shù)據(jù)源之間批量數(shù)據(jù)遷移服務(wù),幫助客戶實(shí)現(xiàn)數(shù)據(jù)自由流動(dòng)。支持客戶各種類型數(shù)據(jù)源之間的數(shù)據(jù)遷移,支持的類型包括:文件系統(tǒng),關(guān)系數(shù)據(jù)庫(kù),數(shù)據(jù)倉(cāng)庫(kù),NoSQL,大數(shù)據(jù)服務(wù)等數(shù)據(jù)源。DI:即數(shù)據(jù)融合(Data Integration)服務(wù)提供同構(gòu)/異構(gòu)數(shù)據(jù)源之間批量數(shù)據(jù)遷移服務(wù),幫助客戶實(shí)現(xiàn)數(shù)據(jù)自由流動(dòng)。支持客戶各種類型數(shù)據(jù)源之間的數(shù)據(jù)遷移,支持的類型包括:文件系統(tǒng),關(guān)系數(shù)據(jù)庫(kù),數(shù)據(jù)倉(cāng)庫(kù),NoSQL,大數(shù)據(jù)服務(wù)等數(shù)據(jù)源。
DG:即數(shù)據(jù)治理(Data Goverance),對(duì)數(shù)據(jù)資產(chǎn)進(jìn)行梳理、質(zhì)量監(jiān)控、標(biāo)準(zhǔn)化、清洗等操作,提供一站式數(shù)據(jù)管控平臺(tái)。對(duì)企業(yè)的數(shù)據(jù)資產(chǎn)提供標(biāo)準(zhǔn)建設(shè)、資產(chǎn)管理、質(zhì)量監(jiān)控、安全共享的智能數(shù)據(jù)治理能力,助力打造資產(chǎn)化、服務(wù)化、標(biāo)準(zhǔn)化的數(shù)據(jù)體系。
https://blog.csdn.net/u012152619/article/details/52901319
ZooKeeper之(一)ZooKeeper是什么
通訊相關(guān):
https://github.com/openvswitch/ovs
Open vSwitch是一個(gè)在開源Apache 2許可下獲得許可的多層軟件交換機(jī)
Open vSwitch非常適合在VM環(huán)境中用作虛擬交換機(jī)
DHCP二三層配置實(shí)驗(yàn)
PPPoE撥號(hào)實(shí)驗(yàn)
CM上線實(shí)驗(yàn)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。