⑴ 大數據如何入門
首先我們要了解java語言和Linux操作系統,這兩個是學習大數據的基礎,學習的順序不分前後。
大數據
Java :只要了解一些基礎即可,做大數據不需要很深的Java 技術,學java SE 就相當於有學習大數據基礎。
Linux:因為大數據相關軟體都是在Linux上運行的,所以Linux要學習的扎實一些,學好Linux對你快速掌握大數據相關技術會有很大的幫助,能讓你更好的理解hadoop、hive、hbase、spark等大數據軟體的運行環境和網路環境配置,能少踩很多坑,學會shell就能看懂腳本這樣能更容易理解和配置大數據集群。還能讓你對以後新出的大數據技術學習起來更快。
Hadoop:這是現在流行的大數據處理平台幾乎已經成為大數據的代名詞,所以這個是必學的。Hadoop裡麵包括幾個組件HDFS、MapRece和YARN,HDFS是存儲數據的地方就像我們電腦的硬碟一樣文件都存儲在這個上面,MapRece是對數據進行處理計算的,它有個特點就是不管多大的數據只要給它時間它就能把數據跑完,但是時間可能不是很快所以它叫數據的批處理。
Zookeeper:這是個萬金油,安裝Hadoop的HA的時候就會用到它,以後的Hbase也會用到它。它一般用來存放一些相互協作的信息,這些信息比較小一般不會超過1M,都是使用它的軟體對它有依賴,對於我們個人來講只需要把它安裝正確,讓它正常的run起來就可以了。
Mysql:我們學習完大數據的處理了,接下來學習學習小數據的處理工具mysql資料庫,因為一會裝hive的時候要用到,mysql需要掌握到什麼層度那?你能在Linux上把它安裝好,運行起來,會配置簡單的許可權,修改root的密碼,創建資料庫。這里主要的是學習SQL的語法,因為hive的語法和這個非常相似。
Sqoop:這個是用於把Mysql里的數據導入到Hadoop里的。當然你也可以不用這個,直接把Mysql數據表導出成文件再放到HDFS上也是一樣的,當然生產環境中使用要注意Mysql的壓力。
Hive:這個東西對於會SQL語法的來說就是神器,它能讓你處理大數據變的很簡單,不會再費勁的編寫MapRece程序。有的人說Pig那?它和Pig差不多掌握一個就可以了。
Oozie:既然學會Hive了,我相信你一定需要這個東西,它可以幫你管理你的Hive或者MapRece、Spark腳本,還能檢查你的程序是否執行正確,出錯了給你發報警並能幫你重試程序,最重要的是還能幫你配置任務的依賴關系。我相信你一定會喜歡上它的,不然你看著那一大堆腳本,和密密麻麻的crond是不是有種想屎的感覺。
Hbase:這是Hadoop生態體系中的NOSQL資料庫,他的數據是按照key和value的形式存儲的並且key是唯一的,所以它能用來做數據的排重,它與MYSQL相比能存儲的數據量大很多。所以他常被用於大數據處理完成之後的存儲目的地。
Kafka:這是個比較好用的隊列工具,隊列是干嗎的?排隊買票你知道不?數據多了同樣也需要排隊處理,這樣與你協作的其它同學不會叫起來,你干嗎給我這么多的數據(比如好幾百G的文件)我怎麼處理得過來,你別怪他因為他不是搞大數據的,你可以跟他講我把數據放在隊列里你使用的時候一個個拿,這樣他就不在抱怨了馬上灰流流的去優化他的程序去了,因為處理不過來就是他的事情。而不是你給的問題。當然我們也可以利用這個工具來做線上實時數據的入庫或入HDFS,這時你可以與一個叫Flume的工具配合使用,它是專門用來提供對數據進行簡單處理,並寫到各種數據接受方(比如Kafka)的。
Spark:它是用來彌補基於MapRece處理數據速度上的缺點,它的特點是把數據裝載到內存中計算而不是去讀慢的要死進化還特別慢的硬碟。特別適合做迭代運算,所以演算法流們特別稀飯它。它是用scala編寫的。Java語言或者Scala都可以操作它,因為它們都是用JVM的。
⑵ spark必須要hadoop嗎
Spark的安裝分為幾種模式,其中一種是本地運行模式,只需要在單節點上解壓即可運行,這種模式不需要依賴Hadoop 環境。
運行 spark-shell
本地模式運行spark-shell非常簡單,只要運行以下命令即可,假設當前目錄是$SPARK_HOME
$ MASTER=local $ bin/spark-shell
MASTER=local就是表明當前運行在單機模式。如果一切順利,將看到下面的提示信息:
Created spark context..
Spark context available as sc.
這表明spark-shell中已經內置了Spark context的變數,名稱為sc,我們可以直接使用該變數進行後續的操作。
spark-shell 後面設置 master 參數,可以支持更多的模式,
我們在sparkshell中運行一下最簡單的例子,統計在README.md中含有Spark的行數有多少,在spark-shell中輸入如下代碼:
scala>sc.textFile("README.md").filter(_.contains("Spark")).count
如果你覺得輸出的日誌太多,你可以從模板文件創建 conf/log4j.properties :
$ mv conf/log4j.properties.template conf/log4j.properties
然後修改日誌輸出級別為WARN:
log4j.rootCategory=WARN, console
如果你設置的 log4j 日誌等級為 INFO,則你可以看到這樣的一行日誌 INFO SparkUI: Started SparkUI at http://10.9.4.165:4040,意思是 Spark 啟動了一個 web 伺服器,你可以通過瀏覽器訪問http://10.9.4.165:4040來查看 Spark 的任務運行狀態等信息。
pyspark
運行 bin/pyspark 的輸出為:
$ bin/pyspark
python 2.7.6 (default, Sep 9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "right", "credits" or "license" for more information.
Spark assembly has been built with Hive, including Datanucleus jars on classpath
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
15/03/30 15:19:07 WARN Utils: Your hostname, june-mac resolves to a loopback address: 127.0.0.1; using 10.9.4.165 instead (on interface utun0)
15/03/30 15:19:07 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
15/03/30 15:19:07 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ / __/ _/
/__ / .__/\_,_/_/ /_/\_\ version 1.3.0
/_/
Using Python version 2.7.6 (default, Sep 9 2014 15:04:36)
SparkContext available as sc, HiveContext available as sqlCtx.
你也可以使用 IPython 來運行 Spark:
IPYTHON=1 ./bin/pyspark
如果要使用 IPython NoteBook,則運行:
IPYTHON_OPTS="notebook" ./bin/pyspark
從日誌可以看到,不管是 bin/pyspark 還是 bin/spark-shell,他們都有兩個內置的變數:sc 和 sqlCtx。
SparkContext available as sc, HiveContext available as sqlCtx
sc 代表著 Spark 的上下文,通過該變數可以執行 Spark 的一些操作,而 sqlCtx 代表著 HiveContext 的上下文。
spark-submit
在Spark1.0之後提供了一個統一的腳本spark-submit來提交任務。
對於 python 程序,我們可以直接使用 spark-submit:
$ mkdir -p /usr/lib/spark/examples/python$ tar zxvf /usr/lib/spark/lib/python.tar.gz -C /usr/lib/spark/examples/python$ ./bin/spark-submit examples/python/pi.py 10
對於 Java 程序,我們需要先編譯代碼然後打包運行:
$ spark-submit --class "SimpleApp" --master local[4] simple-project-1.0.jar
Spark 運行模式
Spark 的運行模式多種多樣、靈活多變,部署在單機上時,既可以用本地模式運行,也可以用偽分布式模式運行,而當以分布式集群的方式部署時,也有眾多的運行模式可以供選擇,這取決於集群的實際情況,底層的資源調度既可以依賴於外部的資源調度框架,也可以使用 Spark 內建的 Standalone 模式。對於外部資源調度框架的支持,目前的實現包括相對穩定的 Mesos 模式,以及還在持續開發更新中的 Hadoop YARN 模式。
在實際應用中,Spark 應用程序的運行模式取決於傳遞給 SparkContext 的 MASTER 環境變數的值,個別模式還需要依賴輔助的程序介面來配合使用,目前所支持的 MASTER 環境變數由特定的字元串或 URL 所組成。例如:
Local[N]:本地模式,使用 N 個線程。
Local Cluster[Worker,core,Memory]:偽分布式模式,可以配置所需要啟動的虛擬工作節點的數量,以及每個工作節點所管理的 CPU 數量和內存尺寸。
Spark://hostname:port:Standalone 模式,需要部署 Spark 到相關節點,URL 為 Spark Master 主機地址和埠。
Mesos://hostname:port:Mesos 模式,需要部署 Spark 和 Mesos 到相關節點,URL 為 Mesos 主機地址和埠。
YARN standalone/Yarn cluster:YARN 模式一,主程序邏輯和任務都運行在 YARN 集群中。
YARN client:YARN 模式二,主程序邏輯運行在本地,具體任務運行在 YARN 集群中。
運行 Spark
通過命令行運行 Spark ,有兩種方式:bin/pyspark 和 bin/spark-shell。
運行 bin/spark-shell 輸出的日誌如下:
$ ./bin/spark-shell --master local
你可以從模板文件創建 conf/log4j.properties ,然後修改日誌輸出級別:
mv conf/log4j.properties.template conf/log4j.properties
修改 log4j.rootCategory 的等級為輸出 WARN 級別的日誌:
log4j.rootCategory=WARN, console
如果你設置的 log4j 日誌等級為 INFO,則你可以看到這樣的一行日誌 INFO SparkUI: Started SparkUI at http://10.9.4.165:4040 ,意思是 Spark 啟動了一個 web 伺服器,你可以通過瀏覽器訪問 http://10.9.4.165:4040 來查看 Spark 的任務運行狀態。
從日誌可以看到,不管是 bin/pyspark 還是 bin/spark-shell,他們都有兩個內置的變數:sc 和 sqlCtx。
SparkContext available as sc, HiveContext available as sqlCtx
sc 代表著 Spark 的上下文,通過該變數可以執行 Spark 的一些操作,而 sqlCtx 代表著 HiveContext 的上下文。
⑶ spark和hadoop的區別
直接比較Hadoop和Spark有難度,因為它們處理的許多任務都一樣,但是在一些方面又並不相互重疊。
比如說,Spark沒有文件管理功能,因而必須依賴Hadoop分布式文件系統(HDFS)或另外某種解決方案。
Hadoop框架的主要模塊包括如下:
Hadoop Common
Hadoop分布式文件系統(HDFS)
Hadoop YARN
Hadoop MapRece
雖然上述四個模塊構成了Hadoop的核心,不過還有其他幾個模塊。這些模塊包括:Ambari、Avro、Cassandra、Hive、 Pig、Oozie、Flume和Sqoop,它們進一步增強和擴展了Hadoop的功能。
Spark確實速度很快(最多比Hadoop MapRece快100倍)。Spark還可以執行批量處理,然而它真正擅長的是處理流工作負載、互動式查詢和機器學習。
相比MapRece基於磁碟的批量處理引擎,Spark賴以成名之處是其數據實時處理功能。Spark與Hadoop及其模塊兼容。實際上,在Hadoop的項目頁面上,Spark就被列為是一個模塊。
Spark有自己的頁面,因為雖然它可以通過YARN(另一種資源協調者)在Hadoop集群中運行,但是它也有一種獨立模式。它可以作為 Hadoop模塊來運行,也可以作為獨立解決方案來運行。
MapRece和Spark的主要區別在於,MapRece使用持久存儲,而Spark使用彈性分布式數據集(RDDS)。
性能
Spark之所以如此快速,原因在於它在內存中處理一切數據。沒錯,它還可以使用磁碟來處理未全部裝入到內存中的數據。
Spark的內存處理為來自多個來源的數據提供了近乎實時分析的功能:營銷活動、機器學習、物聯網感測器、日誌監控、安全分析和社交媒體網站。另 外,MapRece使用批量處理,其實從來就不是為驚人的速度設計的。它的初衷是不斷收集來自網站的信息,不需要這些數據具有實時性或近乎實時性。
易用性
支持Scala(原生語言)、Java、Python和Spark SQL。Spark SQL非常類似於SQL 92,所以幾乎不需要經歷一番學習,馬上可以上手。
Spark還有一種交互模式,那樣開發人員和用戶都可以獲得查詢和其他操作的即時反饋。MapRece沒有交互模式,不過有了Hive和Pig等附加模塊,採用者使用MapRece來得容易一點。
成本
「Spark已證明在數據多達PB的情況下也輕松自如。它被用於在數量只有十分之一的機器上,對100TB數據進行排序的速度比Hadoop MapRece快3倍。」這一成績讓Spark成為2014年Daytona GraySort基準。
兼容性
MapRece和Spark相互兼容;MapRece通過JDBC和ODC兼容諸多數據源、文件格式和商業智能工具,Spark具有與MapRece同樣的兼容性。
數據處理
MapRece是一種批量處理引擎。MapRece以順序步驟來操作,先從集群讀取數據,然後對數據執行操作,將結果寫回到集群,從集群讀 取更新後的數據,執行下一個數據操作,將那些結果寫回到結果,依次類推。Spark執行類似的操作,不過是在內存中一步執行。它從集群讀取數據後,對數據 執行操作,然後寫回到集群。
Spark還包括自己的圖形計算庫GraphX。GraphX讓用戶可以查看與圖形和集合同樣的數據。用戶還可以使用彈性分布式數據集(RDD),改變和聯合圖形,容錯部分作了討論。
容錯
至於容錯,MapRece和Spark從兩個不同的方向來解決問題。MapRece使用TaskTracker節點,它為 JobTracker節點提供了心跳(heartbeat)。如果沒有心跳,那麼JobTracker節點重新調度所有將執行的操作和正在進行的操作,交 給另一個TaskTracker節點。這種方法在提供容錯性方面很有效,可是會大大延長某些操作(即便只有一個故障)的完成時間。
Spark使用彈性分布式數據集(RDD),它們是容錯集合,裡面的數據元素可執行並行操作。RDD可以引用外部存儲系統中的數據集,比如共享式文件系統、HDFS、HBase,或者提供Hadoop InputFormat的任何數據源。Spark可以用Hadoop支持的任何存儲源創建RDD,包括本地文件系統,或前面所列的其中一種文件系統。
RDD擁有五個主要屬性:
分區列表
計算每個分片的函數
依賴其他RDD的項目列表
面向鍵值RDD的分區程序(比如說RDD是散列分區),這是可選屬性
計算每個分片的首選位置的列表(比如HDFS文件的數據塊位置),這是可選屬性
RDD可能具有持久性,以便將數據集緩存在內存中。這樣一來,以後的操作大大加快,最多達10倍。Spark的緩存具有容錯性,原因在於如果RDD的任何分區丟失,就會使用原始轉換,自動重新計算。
可擴展性
按照定義,MapRece和Spark都可以使用HDFS來擴展。那麼,Hadoop集群能變得多大呢?
據稱雅虎有一套42000個節點組成的Hadoop集群,可以說擴展無極限。最大的已知Spark集群是8000個節點,不過隨著大數據增多,預計集群規模也會隨之變大,以便繼續滿足吞吐量方面的預期。
安全
Hadoop支持Kerberos身份驗證,這管理起來有麻煩。然而,第三方廠商讓企業組織能夠充分利用活動目錄Kerberos和LDAP用於身份驗證。同樣那些第三方廠商還為傳輸中數據和靜態數據提供數據加密。
Hadoop分布式文件系統支持訪問控制列表(ACL)和傳統的文件許可權模式。Hadoop為任務提交中的用戶控制提供了服務級授權(Service Level Authorization),這確保客戶擁有正確的許可權。
Spark的安全性弱一點,目前只支持通過共享密鑰(密碼驗證)的身份驗證。Spark在安全方面帶來的好處是,如果你在HDFS上運行Spark,它可以使用HDFS ACL和文件級許可權。此外,Spark可以在YARN上運行,因而能夠使用Kerberos身份驗證。
總結
Spark與MapRece是一種相互共生的關系。Hadoop提供了Spark所沒有的功能特性,比如分布式文件系統,而Spark 為需要它的那些數據集提供了實時內存處理。完美的大數據場景正是設計人員當初預想的那樣:讓Hadoop和Spark在同一個團隊裡面協同運行。
⑷ 怎樣利用Spark Streaming和Hadoop實現近實時的會話連接
科普Spark,Spark是什麼,如何使用Spark
1.Spark基於什麼演算法的分布式計算(很簡單)
2.Spark與MapRece不同在什麼地方
3.Spark為什麼比Hadoop靈活
4.Spark局限是什麼
5.什麼情況下適合使用Spark
什麼是Spark
Spark是UC Berkeley AMP lab所開源的類Hadoop MapRece的通用的並行計算框架,Spark基於map rece演算法實現的分布式計算,擁有Hadoop MapRece所具有的優點;但不同於MapRece的是Job中間輸出和結果可以保存在內存中,從而不再需要讀寫HDFS,因此Spark能更好地適用於數據挖掘與機器學習等需要迭代的map rece的演算法。其架構如下圖所示:
Spark與Hadoop的對比
Spark的中間數據放到內存中,對於迭代運算效率更高。
Spark更適合於迭代運算比較多的ML和DM運算。因為在Spark裡面,有RDD的抽象概念。
Spark比Hadoop更通用
Spark提供的數據集操作類型有很多種,不像Hadoop只提供了Map和Rece兩種操作。比如map, filter, flatMap, sample, groupByKey, receByKey, union, join, cogroup, mapValues, sort,partionBy等多種操作類型,Spark把這些操作稱為Transformations。同時還提供Count, collect, rece, lookup, save等多種actions操作。
這些多種多樣的數據集操作類型,給給開發上層應用的用戶提供了方便。各個處理節點之間的通信模型不再像Hadoop那樣就是唯一的Data Shuffle一種模式。用戶可以命名,物化,控制中間結果的存儲、分區等。可以說編程模型比Hadoop更靈活。
不過由於RDD的特性,Spark不適用那種非同步細粒度更新狀態的應用,例如web服務的存儲或者是增量的web爬蟲和索引。就是對於那種增量修改的應用模型不適合。
容錯性
在分布式數據集計算時通過checkpoint來實現容錯,而checkpoint有兩種方式,一個是checkpoint data,一個是logging the updates。用戶可以控制採用哪種方式來實現容錯。
可用性
Spark通過提供豐富的Scala, Java,Python API及互動式Shell來提高可用性。
Spark與Hadoop的結合
Spark可以直接對HDFS進行數據的讀寫,同樣支持Spark on YARN。Spark可以與MapRece運行於同集群中,共享存儲資源與計算,數據倉庫Shark實現上借用Hive,幾乎與Hive完全兼容。
Spark的適用場景
Spark是基於內存的迭代計算框架,適用於需要多次操作特定數據集的應用場合。需要反復操作的次數越多,所需讀取的數據量越大,受益越大,數據量小但是計算密集度較大的場合,受益就相對較小(大資料庫架構中這是是否考慮使用Spark的重要因素)
由於RDD的特性,Spark不適用那種非同步細粒度更新狀態的應用,例如web服務的存儲或者是增量的web爬蟲和索引。就是對於那種增量修改的應用模型不適合。總的來說Spark的適用面比較廣泛且比較通用。
運行模式
本地模式
Standalone模式
Mesoes模式
yarn模式
Spark生態系統
Shark ( Hive on Spark): Shark基本上就是在Spark的框架基礎上提供和Hive一樣的H iveQL命令介面,為了最大程度的保持和Hive的兼容性,Shark使用了Hive的API來實現query Parsing和 Logic Plan generation,最後的PhysicalPlan execution階段用Spark代替Hadoop MapRece。通過配置Shark參數,Shark可以自動在內存中緩存特定的RDD,實現數據重用,進而加快特定數據集的檢索。同時,Shark通過UDF用戶自定義函數實現特定的數據分析學習演算法,使得SQL數據查詢和運算分析能結合在一起,最大化RDD的重復使用。
Spark streaming: 構建在Spark上處理Stream數據的框架,基本的原理是將Stream數據分成小的時間片斷(幾秒),以類似batch批量處理的方式來處理這小部分數據。Spark Streaming構建在Spark上,一方面是因為Spark的低延遲執行引擎(100ms+)可以用於實時計算,另一方面相比基於Record的其它處理框架(如Storm),RDD數據集更容易做高效的容錯處理。此外小批量處理的方式使得它可以同時兼容批量和實時數據處理的邏輯和演算法。方便了一些需要歷史數據和實時數據聯合分析的特定應用場合。
Bagel: Pregel on Spark,可以用Spark進行圖計算,這是個非常有用的小項目。Bagel自帶了一個例子,實現了Google的PageRank演算法。
End.
⑸ 怎麼創建應用並部署代碼
「
要建立一個大數據系統,我們需要從數據流的源頭跟蹤到最後有價值的輸出,並在現有的Hadoop和大數據生態圈內根據實際需求挑選並整合各部分合適的組件來構建一個能夠支撐多種查詢和分析功能的系統平台。這其中既包括了對數據存儲的選擇,也涵蓋了數據線上和線下處理分離等方面的思考和權衡。此外,沒有任何一個引入大數據解決方案的商業應用在生產環境上承擔的起安全隱患。
1
計算框架篇
大數據的價值
只有在能指導人們做出有價值的決定時,數據才能體現其自身的價值。因此,大數據技術要服務於實際的用途,才是有意義的。一般來說,大數據可以從以下三個方面指導人們做出有價值的決定:
報表生成(比如根據用戶歷史點擊行為的跟蹤和綜合分析、 應用程序活躍程度和用戶粘性計算等);
診斷分析(例如分析為何用戶粘性下降、根據日誌分析系統為何性能下降、垃圾郵件以及病毒的特徵檢測等);
決策(例如個性化新聞閱讀或歌曲推薦、預測增加哪些功能能增加用戶粘性、幫助廣告主進行廣告精準投放、設定垃圾郵件和病毒攔截策略等)。
圖 1
進一步來看,大數據技術從以下三個方面解決了傳統技術難以達成的目標(如圖1):
在歷史數據上的低延遲(...「
要建立一個大數據系統,我們需要從數據流的源頭跟蹤到最後有價值的輸出,並在現有的Hadoop和大數據生態圈內根據實際需求挑選並整合各部分合適的組件來構建一個能夠支撐多種查詢和分析功能的系統平台。這其中既包括了對數據存儲的選擇,也涵蓋了數據線上和線下處理分離等方面的思考和權衡。此外,沒有任何一個引入大數據解決方案的商業應用在生產環境上承擔的起安全隱患。
1
計算框架篇
大數據的價值
只有在能指導人們做出有價值的決定時,數據才能體現其自身的價值。因此,大數據技術要服務於實際的用途,才是有意義的。一般來說,大數據可以從以下三個方面指導人們做出有價值的決定:
報表生成(比如根據用戶歷史點擊行為的跟蹤和綜合分析、 應用程序活躍程度和用戶粘性計算等);
診斷分析(例如分析為何用戶粘性下降、根據日誌分析系統為何性能下降、垃圾郵件以及病毒的特徵檢測等);
決策(例如個性化新聞閱讀或歌曲推薦、預測增加哪些功能能增加用戶粘性、幫助廣告主進行廣告精準投放、設定垃圾郵件和病毒攔截策略等)。
圖 1
進一步來看,大數據技術從以下三個方面解決了傳統技術難以達成的目標(如圖1):
在歷史數據上的低延遲(互動式)查詢,目標是加快決策過程和時間, 例如分析一個站點為何變緩慢並嘗試修復它;
在實時數據上的低延遲查詢,目的是幫助用戶和應用程序在實時數據上做出決策, 例如實時檢測並阻攔病毒蠕蟲(一個病毒蠕蟲可以在1.3秒內攻擊1百萬台主機);
更加精細高級的數據處理演算法,這可以幫助用戶做出「更好」的決策, 例如圖數據處理、異常點檢測、趨勢分析及其他機器學習演算法。
蛋糕模式
從將數據轉換成價值的角度來說,在Hadoop生態圈十年蓬勃成長的過程中,YARN和Spark這二者可以算得上是里程碑事件。Yarn的出現使得集群資源管理和數據處理流水線分離,大大革新並推動了大數據應用層面各種框架的發展(SQL on Hadoop框架, 流數據,圖數據,機器學習)。
它使得用戶不再受到MapRece開發模式的約束,而是可以創建種類更為豐富的分布式應用程序,並讓各類應用程序運行在統一的架構上,消除了為其他框架維護獨有資源的開銷。就好比一個多層蛋糕,下面兩層是HDFS和Yarn, 而MapRece就只是蛋糕上層的一根蠟燭而已,在蛋糕上還能插各式各樣的蠟燭。
在這一架構體系中,總體數據處理分析作業分三塊(圖2),在HBase上做互動式查詢(Apache Phoenix, Cloudera Impala等), 在歷史數據集上編寫MapRece程序抑或利用Hive等做批處理業務, 另外對於實時流數據分析Apache Storm則會是一種標准選擇方案。
雖然Yarn的出現極大地豐富了Hadoop生態圈的應用場景,但仍存有兩個顯而易見的挑戰:一是在一個平台上需要維護三個開發堆棧;二是在不同框架內很難共享數據,比如很難在一個框架內對流數據做互動式查詢。這也意味著我們需要一個更為統一和支持更好抽象的計算框架的出現。
圖 2
一統江湖
Spark的出現使得批處理任務,互動式查詢,實時流數據處理被整合到一個統一的框架內(圖3),同時Spark和現有的開源生態系統也能夠很好地兼容(Hadoop, HDFS, Yarn, Hive, Flume)。 通過啟用內存分布數據集,優化迭代工作負載, 用戶能夠更簡單地操作數據,並在此基礎上開發更為精細的演算法,如機器學習和圖演算法等。
有三個最主要的原因促使Spark目前成為了時下最火的大數據開源社區(擁有超過來自200多個公司的800多個contributors):
Spark可以擴展部署到超過8000節點並處理PB級別的數據,同時也提供了很多不錯的工具供應用開發者進行管理和部署;
Spark提供了一個互動式shell供開發者可以用Scala或者Python即時性試驗不同的功能;
Spark提供了很多內置函數使得開發者能夠比較容易地寫出低耦合的並且能夠並發執行的代碼,這樣開發人員就更能集中精力地為用戶提供更多的業務功能而不是花費時間在優化並行化代碼之上。
當然Spark也和當年的MapRece一樣不是萬靈葯,比如對實時性要求很高的流數據處理上Apache Storm還是被作為主流選擇, 因為Spark Streaming實際上是microbatch(將一個流數據按時間片切成batch,每個batch提交一個job)而不是事件觸發實時系統,所以雖然支持者們認為microbatch在系統延時性上貢獻並不多,但在生產環境中和Apache Storm相比還不是特別能滿足對低延時要求很高的應用場景。
比如在實踐過程中, 如果統計每條消息的平均處理時間,很容易達到毫秒級別,但一旦統計類似service assurance(確保某條消息在毫秒基本能被處理完成)的指標, 系統的瓶頸有時還是不能避免。
但同時我們不能不注意到,在許多用例當中,與流數據的交互以及和靜態數據集的結合是很有必要的, 例如我們需要在靜態數據集上進行分類器的模型計算,並在已有分類器模型的基礎上,對實時進入系統的流數據進行交互計算來判定類別。
由於Spark的系統設計對各類工作(批處理、流處理以及互動式工作)進行了一個共有抽象,並且生態圈內延伸出了許多豐富的庫(MLlib機器學習庫、SQL語言API、GraphX), 使得用戶可以在每一批流數據上進行靈活的Spark相關操作,在開發上提供了許多便利。
Spark的成熟使得Hadoop生態圈在短短一年之間發生了翻天覆地的變化, Cloudera和Hortonworks紛紛加入了Spark陣營,而Hadoop項目群中除了Yarn之外已經沒有項目是必須的了(雖然Mesos已在一些場合替代了Yarn), 因為就連HDFS,Spark都可以不依賴。但很多時候我們仍然需要像Impala這樣的依賴分布式文件系統的MPP解決方案並利用Hive管理文件到表的映射,因此Hadoop傳統生態圈依然有很強的生命力。
另外在這里簡要對比一下互動式分析任務中各類SQL on Hadoop框架,因為這也是我們在實際項目實施中經常遇到的問題。我們主要將注意力集中在Spark SQL, Impala和Hive on Tez上, 其中Spark SQL是三者之中歷史最短的,論文發表在15年的SIGMOD會議上, 原文對比了數據倉庫上不同類型的查詢在Shark(Spark最早對SQL介面提供的支持)、Spark SQL和Impala上的性能比較。
也就是說, 雖然Spark SQL在Shark的基礎上利用Catalyst optimizer在代碼生成上做了很多優化,但總體性能還是比不上Impala, 尤其是當做join操作的時候, Impala可以利用「predicate pushdown」更早對表進行選擇操作從而提高性能。
不過Spark SQL的Catalyst optimizer一直在持續優化中,相信未來會有更多更好的進展。Cloudera的Benchmark評測中Impala一直比其他SQL on Hadoop框架性能更加優越,但同時Hortonworks評測則指出雖然單個數據倉庫查詢Impala可以在很短的時間內完成,但是一旦並發多個查詢Hive on Tez的優勢就展示出來。另外Hive on Tez在SQL表達能力也要比Impala更強(主要是因為Impala的嵌套存儲模型導致的), 因此根據不同的場景選取不同的解決方案是很有必要的。
圖 3
各領風騷抑或代有才人出?
近一年比較吸引人眼球的Apache Flink(與Spark一樣已有5年歷史,前身已經是柏林理工大學一個研究性項目,被其擁躉推崇為繼MapRece, Yarn,Spark之後第四代大數據分析處理框架)。 與Spark相反,Flink是一個真正的實時流數據處理系統,它將批處理看作是流數據的特例,同Spark一樣它也在嘗試建立一個統一的平台運行批量,流數據,互動式作業以及機器學習,圖演算法等應用。
Flink有一些設計思路是明顯區別於Spark的,一個典型的例子是內存管理,Flink從一開始就堅持自己精確的控制內存使用並且直接操作二進制數據,而Spark一直到1.5版本都還是試用java的內存管理來做數據緩存,這也導致了Spark很容易遭受OOM以及JVM GC帶來的性能損失。
但是從另外一個角度來說, Spark中的RDD在運行時被存成java objects的設計模式也大大降低了用戶編程設計門檻, 同時隨著Tungsten項目的引入,Spark現在也逐漸轉向自身的內存管理, 具體表現為Spark生態圈內從傳統的圍繞RDD(分布式java對象集合)為核心的開發逐漸轉向以DataFrame(分布式行對象集合)為核心。
總的來說,這兩個生態圈目前都在互相學習,Flink的設計基因更為超前一些,但Spark社區活躍度大很多,發展到目前毫無疑問是更為成熟的選擇,比如對數據源的支持(HBase, Cassandra, Parquet, JSON, ORC)更為豐富以及更為統一簡潔的計算表示。另一方面,Apache Flink作為一個由歐洲大陸發起的項目,目前已經擁有來自北美、歐洲以及亞洲的許多貢獻者,這是否能夠一改歐洲在開源世界中一貫的被動角色,我們將在未來拭目以待。
2
NoSQL資料庫篇
NoSQL資料庫在主流選擇上依舊集中在MongoDB, HBase和Cassandra這三者之間。在所有的NoSQL選擇中,用C 編寫的MongoDB幾乎應該是開發者最快也最易部署的選擇。MongoDB是一個面向文檔的資料庫,每個文檔/記錄/數據(包括爬取的網頁數據及其他大型對象如視頻等)是以一種BSON(Binary JSON)的二進制數據格式存儲, 這使得MongoDB並不需要事先定義任何模式, 也就是模式自由(可以把完全不同結構的記錄放在同一個資料庫里)。
MongoDB對於完全索引的支持在應用上是很方便的,同時也具備一般NoSQL分布式資料庫中可擴展,支持復制和故障恢復等功能。 MongoDB一般應用於高度伸縮性的緩存及大尺寸的JSON數據存儲業務中,但不能執行「JOIN」操作,而且數據佔用空間也比較大,最被用戶詬病的就是由於MongoDB提供的是資料庫級鎖粒度導致在一些情況下建索引操作會引發整個資料庫阻塞。一般來說,MongoDB完全可以滿足一些快速迭代的中小型項目的需求。
下面來主要談談Cassandra和HBase之間的比較選擇。Cassandra和HBase有著截然不同的基因血統。HBase和其底層依賴的系統架構源自於著名的Google FileSystem(發表於2003年)和Google BigTable設計(發表於2006年), 其克服了HDFS注重吞吐量卻犧牲I/O的缺點,提供了一個存儲中間層使得用戶或者應用程序可以隨機讀寫數據。
具體來說,HBase的更新和刪除操作實際上是先發生在內存MemStore中, 當MemStore滿了以後會Flush到StoreFile, 之後當StoreFile文件數量增長到一定閾值後會觸發Compact合並操作,因此HBase的更新操作其實是不斷追加的操作,而最終所有更新和刪除數據的持久化操作都是在之後Compact過程中進行的。
這使得應用程序在向內存MemStore寫入數據後,所做的修改馬上就能得到反映,用戶讀到的數據絕不會是陳舊的數據,保證了I/O高性能和數據完全一致性; 另一方面來說, HBase基於Hadoop生態系統的基因就已經決定了他自身的高度可擴展性、容錯性。
在數據模型上,Cassandra和HBase類似實現了一個key-value提供面向列式存儲服務,其系統設計參考了 Amazon Dynamo (發表於2007年) 分布式哈希(DHT)的P2P結構(實際上大部分Cassandra的初始工作都是由兩位從Amazon的Dynamo組跳槽到Facebook的工程師完成),同樣具有很高的可擴展性和容錯性等特點。
除此之外, 相對HBase的主從結構,Cassandra去中心化的P2P結構能夠更簡單地部署和維護,比如增加一台機器只需告知Cassandra系統新節點在哪,剩下的交給系統完成就行了。同時,Cassandra對多數據中心的支持也更好,如果需要在多個數據中心進行數據遷移Cassandra會是一個更優的選擇。
Eric Brewer教授提出的經典CAP理論認為任何基於網路的數據共享系統,最多隻能滿足數據一致性、可用性、分區容忍性三要素中的兩個要素。實際分布式系統的設計過程往往都是在一致性與可用性上進行取捨,相比於HBase數據完全一致性的系統設計,Cassandra選擇了在優先考慮數據可用性的基礎上讓用戶自己根據應用程序需求決定系統一致性級別。
比如:用戶可以配置QUONUM參數來決定系統需要幾個節點返回數據才能向客戶端做出響應,ONE指只要有一個節點返回數據就可以對客戶端做出響應,ALL指等於數據復制份數的所有節點都返回結果才能向客戶端做出響應,對於數據一致性要求不是特別高的可以選擇ONE,它是最快的一種方式。
從基因和發展歷史上來說,HBase更適合用做數據倉庫和大規模數據處理與分析(比如對網頁數據建立索引), 而Cassandra則更適合用作實時事務和互動式查詢服務。Cassandra在國外市場佔有比例和發展要遠比國內紅火, 在不少權威測評網站上排名都已經超過了HBase。目前Apache Cassandra的商業化版本主要由軟體公司DataStax進行開發和銷售推廣。另外還有一些NoSQL分布式資料庫如Riak, CouchDB也都在各自支持的廠商推動下取得了不錯的發展。
雖然我們也考慮到了HBase在實際應用中的不便之處比如對二級索引的支持程度不夠(只支持通過單個行鍵訪問,通過行鍵的范圍查詢,全表掃描),不過在明略的大數據基礎平台上,目前整合的是依然是HBase。
理由也很簡單,HBase出身就與Hadoop的生態系統緊密集成,其能夠很容易與其他SQL on Hadoop框架(Cloudera Impala, Apache Phoenix, or Hive on Tez)進行整合,而不需要重新部署一套分布式資料庫系統,而且可以很方便地將同樣的數據內容在同一個生態系統中根據不同框架需要來變換存儲格式(比如存儲成Hive表或者Parquet格式)。
我們在很多項目中都有需要用到多種SQL on Hadoop框架,來應對不同應用場景的情況,也體會到了在同一生態系統下部署多種框架的簡便性。 但同時我們也遇到了一些問題, 因為HBase項目本身與HDFS和Zookeeper系統分別是由不同開源團隊進行維護的,所以在系統整合時我們需要先對HBase所依賴的其他模塊進行設置再對HBase進行配置,在一定程度上降低了系統維護的友好性。
目前我們也已經在考慮將Cassandra應用到一些新的客戶項目中,因為很多企業級的應用都需要將線上線下資料庫進行分離,HBase更適合存儲離線處理的結果和數據倉庫,而更適合用作實時事務和並發交互性能更好的Cassandra作為線上服務資料庫會是一種很好的選擇。
3
大數據安全篇
隨著越來越多各式各樣的數據被存儲在大數據系統中,任何對企業級數據的破壞都是災難性的,從侵犯隱私到監管違規,甚至會造成公司品牌的破壞並最終影響到股東收益。給大數據系統提供全面且有效的安全解決方案的需求已經十分迫切:
大數據系統存儲著許多重要且敏感的數據,這些數據是企業長久以來的財富
與大數據系統互動的外部系統是動態變化的,這會給系統引入新的安全隱患
在一個企業的內部,不同Business Units會用不同的方式與大數據系統進行交互,比如線上的系統會實時給集群推送數據、數據科學家團隊則需要分析存儲在數據倉庫內的歷史數據、運維團隊則會需要對大數據系統擁有管理許可權。
因此為了保護公司業務、客戶、財務和名譽免於被侵害,大數據系統運維團隊必須將系統安全高度提高到和其他遺留系統一樣的級別。同時大數據系統並不意味著引入大的安全隱患,通過精細完整的設計,仍然能夠把一些傳統的系統安全解決方案對接到最新的大數據集群系統中。
一般來說,一個完整的企業級安全框架包括五個部分:
Administration: 大數據集群系統的集中式管理,設定全局一致的安全策略
Authentication: 對用戶和系統的認證
Authorization:授權個人用戶和組對數據的訪問許可權
Audit:維護數據訪問的日誌記錄
Data Protection:數據脫敏和加密以達到保護數據的目的
系統管理員要能夠提供覆蓋以上五個部分的企業級安全基礎設施,否則任何一環的缺失都可能給整個系統引入安全性風險。
在大數據系統安全集中式管理平台這塊,由Hortonworks推出的開源項目Apache Ranger就可以十分全面地為用戶提供Hadoop生態圈的集中安全策略的管理,並解決授權(Authorization)和審計(Audit)。例如,運維管理員可以輕松地為個人用戶和組對文件、數據等的訪問策略,然後審計對數據源的訪問。
與Ranger提供相似功能的還有Cloudera推出的Apache Sentry項目,相比較而言Ranger的功能會更全面一些。
而在認證(Authentication)方面, 一種普遍採用的解決方案是將基於Kerberos的認證方案對接到企業內部的LDAP環境中, Kerberos也是唯一為Hadoop全面實施的驗證技術。
另外值得一提的是Apache Knox Gateway項目,與Ranger提高集群內部組件以及用戶互相訪問的安全不同,Knox提供的是Hadoop集群與外界的唯一交互介面,也就是說所有與集群交互的REST API都通過Knox處理。這樣,Knox就給大數據系統提供了一個很好的基於邊緣的安全(perimeter-based security)。
基於以上提到的五個安全指標和Hadoop生態圈安全相關的開源項目, 已經足已證明基於Hadoop的大數據平台我們是能夠構建一個集中、一致、全面且有效的安全解決方案。
我市再ITjob管網上面找的
⑹ spark集群搭建時報TimeoutException是怎麼回事
搭建spark集群時,集群啟動後,剛開始在節點上jps查看進程會顯示master與worker, 日誌為:
Spark assembly has been built with Hive, including Datanucleus jars on classpath
Spark Command: /usr/lib/java/jdk1.7.0_71/bin/java -cp ::/usr/local/spark/spark-1.0.0-bin-hadoop1/conf:/usr/local/spark/spark-1.0.0-bin-hadoop1/lib/spark-assembly-1.0.0-hadoop1.0.4.jar:/usr/local/spark/spark-1.0.0-bin-hadoop1/lib/datanucleus-rdbms-3.2.1.jar:/usr/local/spark/spark-1.0.0-bin-hadoop1/lib/datanucleus-api-jdo-3.2.1.jar:/usr/local/spark/spark-1.0.0-bin-hadoop1/lib/datanucleus-core-3.2.2.jar:/usr/local/hadoop/hadoop-1.2.1/conf -XX:MaxPermSize=128m -Dspark.akka.logLifecycleEvents=true -Xms512m -Xmx512m org.apache.spark.deploy.master.Master --ip 192.168.81.128 --port 7077 --webui-port 8080
========================================
14/12/03 11:34:55 INFO spark.SecurityManager: Changing view acls to: root
14/12/03 11:34:55 INFO spark.SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(root)
14/12/03 11:35:44 INFO slf4j.Slf4jLogger: Slf4jLogger started
14/12/03 11:35:48 INFO Remoting: Starting remoting
Exception in thread "main" java.util.concurrent.TimeoutException: Futures timed out after [10000 milliseconds]
at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:219)
at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:223)
at scala.concurrent.Await$$anonfun$result$1.apply(package.scala:107)
at scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:53)
at scala.concurrent.Await$.result(package.scala:107)
at akka.remote.Remoting.start(Remoting.scala:173)
at akka.remote.RemoteActorRefProvider.init(RemoteActorRefProvider.scala:184)
at akka.actor.ActorSystemImpl._start$lzycompute(ActorSystem.scala:579)
at akka.actor.ActorSystemImpl._start(ActorSystem.scala:577)
at akka.actor.ActorSystemImpl.start(ActorSystem.scala:588)
at akka.actor.ActorSystem$.apply(ActorSystem.scala:111)
at akka.actor.ActorSystem$.apply(ActorSystem.scala:104)
at org.apache.spark.util.AkkaUtils$.createActorSystem(AkkaUtils.scala:104)
at org.apache.spark.deploy.master.Master$.startSystemAndActor(Master.scala:785)
at org.apache.spark.deploy.master.Master$.main(Master.scala:765)
at org.apache.spark.deploy.master.Master.main(Master.scala)
⑺ 選擇什麼樣的數據倉庫架構比較好如何選擇呢
一直想整理一下這塊內容,既然是漫談,就想起什麼說什麼吧。我一直是在互聯網行業,就以互聯網行業來說。
先大概列一下互聯網行業數據倉庫、數據平台的用途:
整合公司所有業務數據,建立統一的數據中心;
提供各種報表,有給高層的,有給各個業務的;
為網站運營提供運營上的數據支持,就是通過數據,讓運營及時了解網站和產品的運營效果;
為各個業務提供線上或線下的數據支持,成為公司統一的數據交換與提供平台;
分析用戶行為數據,通過數據挖掘來降低投入成本,提高投入效果;比如廣告定向精準投放、用戶個性化推薦等;
開發數據產品,直接或間接為公司盈利;
建設開放數據平台,開放公司數據;
。。。。。。
上面列出的內容看上去和傳統行業數據倉庫用途差不多,並且都要求數據倉庫/數據平台有很好的穩定性、可靠性;但在互聯網行業,除了數據量大之外,越來越多的業務要求時效性,甚至很多是要求實時的 ,另外,互聯網行業的業務變化非常快,不可能像傳統行業一樣,可以使用自頂向下的方法建立數據倉庫,一勞永逸,它要求新的業務很快能融入數據倉庫中來,老的下線的業務,能很方便的從現有的數據倉庫中下線;
其實,互聯網行業的數據倉庫就是所謂的敏捷數據倉庫,不但要求能快速的響應數據,也要求能快速的響應業務;
建設敏捷數據倉庫,除了對架構技術上的要求之外,還有一個很重要的方面,就是數據建模,如果一上來就想著建立一套能兼容所有數據和業務的數據模型,那就又回到傳統數據倉庫的建設上了,很難滿足對業務變化的快速響應。應對這種情況,一般是先將核心的持久化的業務進行深度建模(比如:基於網站日誌建立的網站統計分析模型和用戶瀏覽軌跡模型;基於公司核心用戶數據建立的用戶模型),其它的業務一般都採用維度+寬表的方式來建立數據模型。這塊是後話。
整體架構下面的圖是我們目前使用的數據平台架構圖,其實大多公司應該都差不多:
邏輯上,一般都有數據採集層、數據存儲與分析層、數據共享層、數據應用層。可能叫法有所不同,本質上的角色都大同小異。
我們從下往上看:
數據採集數據採集層的任務就是把數據從各種數據源中採集和存儲到數據存儲上,期間有可能會做一些簡單的清洗。
數據源的種類比較多:
網站日誌:
作為互聯網行業,網站日誌占的份額最大,網站日誌存儲在多台網站日誌伺服器上,
一般是在每台網站日誌伺服器上部署flume agent,實時的收集網站日誌並存儲到HDFS上;
業務資料庫:
業務資料庫的種類也是多種多樣,有Mysql、Oracle、SqlServer等,這時候,我們迫切的需要一種能從各種資料庫中將數據同步到HDFS上的工具,Sqoop是一種,但是Sqoop太過繁重,而且不管數據量大小,都需要啟動MapRece來執行,而且需要Hadoop集群的每台機器都能訪問業務資料庫;應對此場景,淘寶開源的DataX,是一個很好的解決方案(可參考文章 《異構數據源海量數據交換工具-Taobao DataX 下載和使用》),有資源的話,可以基於DataX之上做二次開發,就能非常好的解決,我們目前使用的DataHub也是。
當然,Flume通過配置與開發,也可以實時的從資料庫中同步數據到HDFS。
來自於Ftp/Http的數據源:
有可能一些合作夥伴提供的數據,需要通過Ftp/Http等定時獲取,DataX也可以滿足該需求;
其他數據源:
比如一些手工錄入的數據,只需要提供一個介面或小程序,即可完成;
數據存儲與分析毋庸置疑,HDFS是大數據環境下數據倉庫/數據平台最完美的數據存儲解決方案。
離線數據分析與計算,也就是對實時性要求不高的部分,在我看來,Hive還是首當其沖的選擇,豐富的數據類型、內置函數;壓縮比非常高的ORC文件存儲格式;非常方便的SQL支持,使得Hive在基於結構化數據上的統計分析遠遠比MapRece要高效的多,一句SQL可以完成的需求,開發MR可能需要上百行代碼;
當然,使用Hadoop框架自然而然也提供了MapRece介面,如果真的很樂意開發Java,或者對SQL不熟,那麼也可以使用MapRece來做分析與計算;Spark是這兩年非常火的,經過實踐,它的性能的確比MapRece要好很多,而且和Hive、Yarn結合的越來越好,因此,必須支持使用Spark和SparkSQL來做分析和計算。因為已經有Hadoop Yarn,使用Spark其實是非常容易的,不用單獨部署Spark集群,關於Spark On Yarn的相關文章,可參考:《Spark On Yarn系列文章》
實時計算部分,後面單獨說。
數據共享這里的數據共享,其實指的是前面數據分析與計算後的結果存放的地方,其實就是關系型資料庫和NOSQL資料庫;
前面使用Hive、MR、Spark、SparkSQL分析和計算的結果,還是在HDFS上,但大多業務和應用不可能直接從HDFS上獲取數據,那麼就需要一個數據共享的地方,使得各業務和產品能方便的獲取數據;和數據採集層到HDFS剛好相反,這里需要一個從HDFS將數據同步至其他目標數據源的工具,同樣,DataX也可以滿足。
另外,一些實時計算的結果數據可能由實時計算模塊直接寫入數據共享。
數據應用
業務產品
業務產品所使用的數據,已經存在於數據共享層,他們直接從數據共享層訪問即可;
報表
同業務產品,報表所使用的數據,一般也是已經統計匯總好的,存放於數據共享層;
即席查詢
即席查詢的用戶有很多,有可能是數據開發人員、網站和產品運營人員、數據分析人員、甚至是部門老大,他們都有即席查詢數據的需求;
這種即席查詢通常是現有的報表和數據共享層的數據並不能滿足他們的需求,需要從數據存儲層直接查詢。
即席查詢一般是通過SQL完成,最大的難度在於響應速度上,使用Hive有點慢,目前我的解決方案是SparkSQL,它的響應速度較Hive快很多,而且能很好的與Hive兼容。
當然,你也可以使用Impala,如果不在乎平台中再多一個框架的話。
OLAP
目前,很多的OLAP工具不能很好的支持從HDFS上直接獲取數據,都是通過將需要的數據同步到關系型資料庫中做OLAP,但如果數據量巨大的話,關系型資料庫顯然不行;
這時候,需要做相應的開發,從HDFS或者HBase中獲取數據,完成OLAP的功能;
比如:根據用戶在界面上選擇的不定的維度和指標,通過開發介面,從HBase中獲取數據來展示。
其它數據介面
這種介面有通用的,有定製的。比如:一個從Redis中獲取用戶屬性的介面是通用的,所有的業務都可以調用這個介面來獲取用戶屬性。
實時計算現在業務對數據倉庫實時性的需求越來越多,比如:實時的了解網站的整體流量;實時的獲取一個廣告的曝光和點擊;在海量數據下,依靠傳統資料庫和傳統實現方法基本完成不了,需要的是一種分布式的、高吞吐量的、延時低的、高可靠的實時計算框架;Storm在這塊是比較成熟了,但我選擇Spark Streaming,原因很簡單,不想多引入一個框架到平台中,另外,Spark Streaming比Storm延時性高那麼一點點,那對於我們的需要可以忽略。
我們目前使用Spark Streaming實現了實時的網站流量統計、實時的廣告效果統計兩塊功能。
做法也很簡單,由Flume在前端日誌伺服器上收集網站日誌和廣告日誌,實時的發送給Spark Streaming,由Spark Streaming完成統計,將數據存儲至Redis,業務通過訪問Redis實時獲取。
任務調度與監控在數據倉庫/數據平台中,有各種各樣非常多的程序和任務,比如:數據採集任務、數據同步任務、數據分析任務等;
這些任務除了定時調度,還存在非常復雜的任務依賴關系,比如:數據分析任務必須等相應的數據採集任務完成後才能開始;數據同步任務需要等數據分析任務完成後才能開始;這就需要一個非常完善的任務調度與監控系統,它作為數據倉庫/數據平台的中樞,負責調度和監控所有任務的分配與運行。
前面有寫過文章,《大數據平台中的任務調度與監控》,這里不再累贅。
總結在我看來架構並不是技術越多越新越好,而是在可以滿足需求的情況下,越簡單越穩定越好。目前在我們的數據平台中,開發更多的是關注業務,而不是技術,他們把業務和需求搞清楚了,基本上只需要做簡單的SQL開發,然後配置到調度系統就可以了,如果任務異常,會收到告警。這樣,可以使更多的資源專注於業務之上。
⑻ spark model.save什麼意思
科普SparkSpark何使用Spark 一.Spark基於算布式計算(簡單) 二.Spark與MapRece同 三.Spark比Hadoop靈 四.Spark局限 5.情況適合使用Spark 圖" class="illustration_alink"> Spark SparkUC Berkeley AMP lab所源類Hadoop MapRece通用並行計算框架Spark基於map rece算實現布式計算擁Hadoop MapRece所具優點;同於MapReceJob間輸結保存內存再需要讀寫HDFSSpark能更適用於數據挖掘與機器習等需要迭代map rece算其架構圖所示: 圖" class="illustration_alink"> Spark與Hadoop比 Spark間數據放內存於迭代運算效率更高 Spark更適合於迭代運算比較MLDM運算Spark面RDD抽象概念 Spark比Hadoop更通用 Spark提供數據集操作類型種像Hadoop提供MapRece兩種操作比map, filter, flatMap, sample, groupByKey, receByKey, union, join, cogroup, mapValues, sort,partionBy等種操作類型Spark些操作稱Transformations同提供Count, collect, rece, lookup, save等種actions操作 些種數據集操作類型給給發層應用用戶提供便各處理節點間通信模型再像Hadoop唯Data Shuffle種模式用戶命名物化控制間結存儲、區等說編程模型比Hadoop更靈 由於RDD特性Spark適用種非同步細粒度更新狀態應用例web服務存儲或者增量web爬蟲索引於種增量修改應用模型適合 容錯性 布式數據集計算通checkpoint實現容錯checkpoint兩種式checkpoint datalogging the updates用戶控制採用哪種式實現容錯 用性 Spark通提供豐富Scala, JavaPython API及互動式Shell提高用性 Spark與Hadoop結合 Spark直接HDFS進行數據讀寫同支持Spark on YARNSpark與MapRece運行於同集群共享存儲資源與計算數據倉庫Shark實現借用Hive幾乎與Hive完全兼容 Spark適用場景 Spark基於內存迭代計算框架適用於需要操作特定數據集應用場合需要反復操作數越所需讀取數據量越受益越數據量計算密集度較場合受益相較(資料庫架構否考慮使用Spark重要素) 由於RDD特性Spark適用種非同步細粒度更新狀態應用例web服務存儲或者增量web爬蟲索引於種增量修改應用模型適合總說Spark適用面比較廣泛且比較通用 運行模式 本模式 Standalone模式 Mesoes模式 yarn模式 Spark態系統 Shark ( Hive on Spark): Shark基本Spark框架基礎提供HiveH iveQL命令介面程度保持Hive兼容性Shark使用HiveAPI實現query Parsing Logic Plan generationPhysicalPlan execution階段用Spark代替Hadoop MapRece通配置Shark參數Shark自內存緩存特定RDD實現數據重用進加快特定數據集檢索同Shark通UDF用戶自定義函數實現特定數據析習算使SQL數據查詢運算析能結合起化RDD重復使用 Spark streaming: 構建Spark處理Stream數據框架基本原理Stream數據間片斷(幾秒)類似batch批量處理式處理部數據Spark Streaming構建Spark面Spark低延遲執行引擎(一00ms+)用於實計算另面相比基於Record其處理框架(Storm)RDD數據集更容易做高效容錯處理外批量處理式使同兼容批量實數據處理邏輯算便些需要歷史數據實數據聯合析特定應用場合 Bagel: Pregel on Spark用Spark進行圖計算非用項目Bagel自帶例實現GooglePageRank算 End
⑼ Spark想要啟動master節點 ./sbin/start-master.sh命令時,日誌文件記錄如下
啟動master
~/project/spark-1.3.0-bin-hadoop2.4 $./sbin/start-master.sh
starting org.apache.spark.deploy.master.Master, logging to /Users/qpzhang/project/spark-1.3.0-bin-hadoop2.4/sbin/../logs/spark-qpzhang-org.apache.spark.deploy.master.Master-1-qpzhangdeMac-mini.local.out
沒有進行任何配置時,採用的都是默認配置,可以看到日誌文件的輸出:
~/project/spark-1.3.0-bin-hadoop2.4 $cat logs/spark-qpzhang-org.apache.spark.deploy.master.Master-1-qpzhangdeMac-mini.local.out
Spark assembly has been built with Hive, including Datanucleus jars on classpath
Spark Command: /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/java -cp :/Users/qpzhang/project/spark-1.3.0-bin-hadoop2.4/sbin/../conf:/Users/qpzhang/project/spark-1.3.0-bin-hadoop2.4/lib/spark-assembly-1.3.0-hadoop2.4.0.jar:/Users/qpzhang/project/spark-1.3.0-bin-hadoop2.4/lib/datanucleus-api-jdo-3.2.6.jar:/Users/qpzhang/project/spark-1.3.0-bin-hadoop2.4/lib/datanucleus-core-3.2.10.jar:/Users/qpzhang/project/spark-1.3.0-bin-hadoop2.4/lib/datanucleus-rdbms-3.2.9.jar -Dspark.akka.logLifecycleEvents=true -Xms512m -Xmx512m org.apache.spark.deploy.master.Master --ip qpzhangdeMac-mini.local --port 7077 --webui-port 8080
========================================
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
15/03/20 10:08:09 INFO Master: Registered signal handlers for [TERM, HUP, INT]
15/03/20 10:08:10 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
15/03/20 10:08:10 INFO SecurityManager: Changing view acls to: qpzhang
15/03/20 10:08:10 INFO SecurityManager: Changing modify acls to: qpzhang
15/03/20 10:08:10 INFO SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(qpzhang); users with modify permissions: Set(qpzhang)
15/03/20 10:08:10 INFO Slf4jLogger: Slf4jLogger started
15/03/20 10:08:10 INFO Remoting: Starting remoting
15/03/20 10:08:10 INFO Remoting: Remoting started; listening on addresses :[akka.tcp://sparkMaster@qpzhangdeMac-mini.local:7077]
15/03/20 10:08:10 INFO Remoting: Remoting now listens on addresses: [akka.tcp://sparkMaster@qpzhangdeMac-mini.local:7077]
15/03/20 10:08:10 INFO Utils: Successfully started service 'sparkMaster' on port 7077.
15/03/20 10:08:11 INFO Server: jetty-8.y.z-SNAPSHOT
15/03/20 10:08:11 INFO AbstractConnector: Started SelectChannelConnector@qpzhangdeMac-mini.local:6066
15/03/20 10:08:11 INFO Utils: Successfully started service on port 6066.
15/03/20 10:08:11 INFO StandaloneRestServer: Started REST server for submitting applications on port 6066
15/03/20 10:08:11 INFO Master: Starting Spark master at spark://qpzhangdeMac-mini.local:7077
15/03/20 10:08:11 INFO Master: Running Spark version 1.3.0
15/03/20 10:08:11 INFO Server: jetty-8.y.z-SNAPSHOT
15/03/20 10:08:11 INFO AbstractConnector: Started SelectChannelConnector@0.0.0.0:8080
15/03/20 10:08:11 INFO Utils: Successfully started service 'MasterUI' on port 8080.
15/03/20 10:08:11 INFO MasterWebUI: Started MasterWebUI at http://10.60.215.41:8080
15/03/20 10:08:11 INFO Master: I have been elected leader! New state: ALIVE
可以看到輸出的幾條重要的信息,service埠6066,spark埠 7077,ui埠8080等,並且當前node通過選舉,確認自己為leader。
這個時候,我們可以通過 http://localhost:8080/ 來查看到當前master的總體狀態。
⑽ Spark-Hadoop,Hive,Spark 之間是什麼關系
大數據本身是個很寬泛的概念,Hadoop生態圈(或者泛生態圈)基本上都是為了處理超過單機尺度的數據處理而誕生的。你可以把它比作一個廚房所以需要的各種工具。鍋碗瓢盆,各有各的用處,互相之間又有重合。你可以用湯鍋直接當碗吃飯喝湯,你可以用小刀或者刨子去皮。但是每個工具有自己的特性,雖然奇怪的組合也能工作,但是未必是最佳選擇。
大數據,首先你要能存的下大數據
傳統的文件系統是單機的,不能橫跨不同的機器。HDFS(Hadoop Distributed FileSystem)的設計本質上是為了大量的數據能橫跨成百上千台機器,但是你看到的是一個文件系統而不是很多文件系統。比如你說我要獲取/hdfs/tmp/file1的數據,你引用的是一個文件路徑,但是實際的數據存放在很多不同的機器上。你作為用戶,不需要知道這些,就好比在單機上你不關心文件分散在什麼磁軌什麼扇區一樣。HDFS為你管理這些數據。
存的下數據之後,你就開始考慮怎麼處理數據。雖然HDFS可以為你整體管理不同機器上的數據,但是這些數據太大了。一台機器讀取成T上P的數據(很大的數據哦,比如整個東京熱有史以來所有高清電影的大小甚至更大),一台機器慢慢跑也許需要好幾天甚至好幾周。對於很多公司來說,單機處理是不可忍受的,比如微博要更新24小時熱博,它必須在24小時之內跑完這些處理。那麼我如果要用很多台機器處理,我就面臨了如何分配工作,如果一台機器掛了如何重新啟動相應的任務,機器之間如何互相通信交換數據以完成復雜的計算等等。這就是MapRece
/ Tez / Spark的功能。MapRece是第一代計算引擎,Tez和Spark是第二代。MapRece的設計,採用了很簡化的計算模型,只有Map和Rece兩個計算過程(中間用Shuffle串聯),用這個模型,已經可以處理大數據領域很大一部分問題了。
那什麼是Map,什麼是Rece?
考慮如果你要統計一個巨大的文本文件存儲在類似HDFS上,你想要知道這個文本里各個詞的出現頻率。你啟動了一個MapRece程序。Map階段,幾百台機器同時讀取這個文件的各個部分,分別把各自讀到的部分分別統計出詞頻,產生類似(hello, 12100次),(world,15214次)等等這樣的Pair(我這里把Map和Combine放在一起說以便簡化);這幾百台機器各自都產生了如上的集合,然後又有幾百台機器啟動Rece處理。Recer機器A將從Mapper機器收到所有以A開頭的統計結果,機器B將收到B開頭的詞彙統計結果(當然實際上不會真的以字母開頭做依據,而是用函數產生Hash值以避免數據串化。因為類似X開頭的詞肯定比其他要少得多,而你不希望數據處理各個機器的工作量相差懸殊)。然後這些Recer將再次匯總,(hello,12100)+(hello,12311)+(hello,345881)=
(hello,370292)。每個Recer都如上處理,你就得到了整個文件的詞頻結果。
這看似是個很簡單的模型,但很多演算法都可以用這個模型描述了。
Map+Rece的簡單模型很黃很暴力,雖然好用,但是很笨重。第二代的Tez和Spark除了內存Cache之類的新feature,本質上來說,是讓Map/Rece模型更通用,讓Map和Rece之間的界限更模糊,數據交換更靈活,更少的磁碟讀寫,以便更方便地描述復雜演算法,取得更高的吞吐量。
有了MapRece,Tez和Spark之後,程序員發現,MapRece的程序寫起來真麻煩。他們希望簡化這個過程。這就好比你有了匯編語言,雖然你幾乎什麼都能幹了,但是你還是覺得繁瑣。你希望有個更高層更抽象的語言層來描述演算法和數據處理流程。於是就有了Pig和Hive。Pig是接近腳本方式去描述MapRece,Hive則用的是SQL。它們把腳本和SQL語言翻譯成MapRece程序,丟給計算引擎去計算,而你就從繁瑣的MapRece程序中解脫出來,用更簡單更直觀的語言去寫程序了。
有了Hive之後,人們發現SQL對比Java有巨大的優勢。一個是它太容易寫了。剛才詞頻的東西,用SQL描述就只有一兩行,MapRece寫起來大約要幾十上百行。而更重要的是,非計算機背景的用戶終於感受到了愛:我也會寫SQL!於是數據分析人員終於從乞求工程師幫忙的窘境解脫出來,工程師也從寫奇怪的一次性的處理程序中解脫出來。大家都開心了。Hive逐漸成長成了大數據倉庫的核心組件。甚至很多公司的流水線作業集完全是用SQL描述,因為易寫易改,一看就懂,容易維護。
自從數據分析人員開始用Hive分析數據之後,它們發現,Hive在MapRece上跑,真雞巴慢!流水線作業集也許沒啥關系,比如24小時更新的推薦,反正24小時內跑完就算了。但是數據分析,人們總是希望能跑更快一些。比如我希望看過去一個小時內多少人在一些特定頁面駐足,分別停留了多久,對於一個巨型網站海量數據下,這個處理過程也許要花幾十分鍾甚至很多小時。而這個分析也許只是你萬里長征的第一步,你還有很多其他的要分析。你無法忍受等待的折磨,只能跟帥帥的工程師蟈蟈說,快,快,再快一點!
於是Impala,Presto,Drill誕生了(當然還有無數非著名的交互SQL引擎,就不一一列舉了)。三個系統的核心理念是,MapRece引擎太慢,因為它太通用,太強壯,太保守,我們SQL需要更輕量,更激進地獲取資源,更專門地對SQL做優化,而且不需要那麼多容錯性保證(因為系統出錯了大不了重新啟動任務,如果整個處理時間更短的話,比如幾分鍾之內)。這些系統讓用戶更快速地處理SQL任務,犧牲了通用性穩定性等特性。如果說MapRece是大砍刀,砍啥都不怕,那上面三個就是剔骨刀,靈巧鋒利,但是不能搞太大太硬的東西。
這些系統,說實話,一直沒有達到人們期望的流行度。因為這時候又兩個異類被造出來了。他們是Hive on Tez / Spark和SparkSQL。它們的設計理念是,MapRece慢,但是如果我用新一代通用計算引擎Tez或者Spark來跑SQL,那我就能跑的更快。而且用戶不需要維護兩套系統。這就好比如果你廚房小,人又懶,對吃的精細程度要求有限,那你可以買個電飯煲,能蒸能煲能燒,省了好多廚具。
上面的介紹,基本就是一個數據倉庫的構架了。底層HDFS,上面跑MapRece/Tez/Spark,在上面跑Hive,Pig。或者HDFS上直接跑Impala,Drill,Presto。這解決了中低速數據處理的要求。
那如果我要更高速的處理呢?
如果我是一個類似微博的公司,我希望顯示不是24小時熱博,我想看一個不斷變化的熱播榜,更新延遲在一分鍾之內,上面的手段都將無法勝任。於是又一種計算模型被開發出來,這就是Streaming(流)計算。Storm是最流行的流計算平台。流計算的思路是,如果要達到更實時的更新,我何不在數據流進來的時候就處理了?比如還是詞頻統計的例子,我的數據流是一個一個的詞,我就讓他們一邊流過我就一邊開始統計了。流計算很牛逼,基本無延遲,但是它的短處是,不靈活,你想要統計的東西必須預先知道,畢竟數據流過就沒了,你沒算的東西就無法補算了。因此它是個很好的東西,但是無法替代上面數據倉庫和批處理系統。
還有一個有些獨立的模塊是KV Store,比如Cassandra,HBase,MongoDB以及很多很多很多很多其他的(多到無法想像)。所以KV Store就是說,我有一堆鍵值,我能很快速滴獲取與這個Key綁定的數據。比如我用身份證號,能取到你的身份數據。這個動作用MapRece也能完成,但是很可能要掃描整個數據集。而KV
Store專用來處理這個操作,所有存和取都專門為此優化了。從幾個P的數據中查找一個身份證號,也許只要零點幾秒。這讓大數據公司的一些專門操作被大大優化了。比如我網頁上有個根據訂單號查找訂單內容的頁面,而整個網站的訂單數量無法單機資料庫存儲,我就會考慮用KV Store來存。KV Store的理念是,基本無法處理復雜的計算,大多沒法JOIN,也許沒法聚合,沒有強一致性保證(不同數據分布在不同機器上,你每次讀取也許會讀到不同的結果,也無法處理類似銀行轉賬那樣的強一致性要求的操作)。但是丫就是快。極快。
每個不同的KV Store設計都有不同取捨,有些更快,有些容量更高,有些可以支持更復雜的操作。必有一款適合你。
除此之外,還有一些更特製的系統/組件,比如Mahout是分布式機器學習庫,Protobuf是數據交換的編碼和庫,ZooKeeper是高一致性的分布存取協同系統,等等。
有了這么多亂七八糟的工具,都在同一個集群上運轉,大家需要互相尊重有序工作。所以另外一個重要組件是,調度系統。現在最流行的是Yarn。你可以把他看作中央管理,好比你媽在廚房監工,哎,你妹妹切菜切完了,你可以把刀拿去殺雞了。只要大家都服從你媽分配,那大家都能愉快滴燒菜。
你可以認為,大數據生態圈就是一個廚房工具生態圈。為了做不同的菜,中國菜,日本菜,法國菜,你需要各種不同的工具。而且客人的需求正在復雜化,你的廚具不斷被發明,也沒有一個萬用的廚具可以處理所有情況,因此它會變的越來越復雜。