1. 程式人生 > >使用Apache Spark和MySQL打造強大的資料分析

使用Apache Spark和MySQL打造強大的資料分析

藉助真實案例和程式碼樣本,本文作者展示瞭如何將Sparke和MySQL結合起來,創造資料分析上的強大工具。

Apache Spark是一個類似Apache Hadoop的叢集計算框架,在Wikipedia上有大量描述:Apache Spark是一個開源叢集計算框架,出自加州大學伯克利分校的AMPLab,後被捐贈給了Apache軟體基金會。

相對於Hadoop基於磁碟的兩段式MapReduce規範,Spark基於記憶體的多段式基元在特定應用上表現要優出100倍。Spark允許使用者程式將資料載入到叢集記憶體中反覆查詢,非常適合機器學習演算法。

Apache Spark

與流行的看法相反,Spark不需要將所有資料存入記憶體,但會使用快取來加速操作(就像MySQL那樣)。Spark也能獨立執行而無需Hadoop,並可以執行在單獨一臺伺服器上(甚至筆記本或桌上型電腦上),並充分利用所有CPU核心。開啟它並使用分散式模式真的很簡單。先開啟master,在同一個節點上執行slave:

然後在任何額外的節點上執行Spark worker(確定向/etc/hosts 添加了hostname或者使用DNS):

為什麼用Spark而不是MySQL?

在很多工中MySQL(開箱即用的)表現並不太好。MySQL的限制之一在於:1次查詢=1個CPU核心。也就是說,即便你有48個速度飛快的核心,外加一個大型資料集可用,也無法充分利用所有的計算能力,相反Spark卻能充分使用CPU核心。

MySQL與Spark的另一差異在於:

l MySQL使用所謂的“寫時模式(schema on write)”——需要將資料轉化到MySQL中,如果未包含在MySQL裡,就無法使用sql來查詢。

l Spark(還有Hadoop/Hive)使用“讀時模式(schema on read)”——比如在一個壓縮txt檔案頂部使用表格結構(或者其他支援的輸入格式),將其看作表格;然後我們可以用SQL來查詢這個“表格”。

也就是說,MySQL負責儲存+處理,而Spark只負責處理,並可直接貫通資料與外部資料集(Hadoop、Amazon S3,本地檔案、JDBC MySQL或其他資料集)的通道。Spark支援txt檔案(壓縮的)、SequenceFile、其他Hadoop輸入格式和Parquet列式儲存。相對Hadoop來說,Spark在這方面更為靈活:例如Spark可以直接從MySQL中讀取資料。

向MySQL載入外部資料的典型管道(pipeline)是:

1、 解壓縮(尤其是壓縮成txt檔案的外部資料);

2、用“LOAD DATA INFILE”命令將其載入到MySQL的儲存表格中;

3、只有這樣,我們才能篩選/進行分組,並將結果儲存到另一張表格中。

這會導致額外的開銷;在很多情況下,我們不需要“原始”資料,但仍需將其載入MySQL中。

為什麼將Spark與MySQL用在一起:

相反,我們的分析結果(比如聚合資料)應當存在MySQL中。將分析結果存在MySQL中並非必要,不過更為方便。假設你想要分析一個大資料集(即每年的銷售額對比),需要使用表格或圖表的形式展現出來。由於會進行聚合,結果集將會小很多,將其存在MySQL中與很多標準程式一同協作處理將會容易許多。

真實案例

一個有趣的免費資料集是Wikipedia的頁數(從2008年啟用後到現在,壓縮後大於1TB)。這個資料可以下載(壓縮空間確定txt檔案),在AWS上也是可用的(有限資料集)。資料以小時聚合,包括以下欄位:

l專案(比如en,fr等,通常是一種語言)

l頁頭(uri),採用urlencode編碼

l請求數

l返回內容的大小

(資料欄位編譯到了檔名中,每小時1個檔案)

我們的目標是:找出英文版wiki中每日請求數位居前10的頁面,不過還要支援對任意詞的搜尋,方便闡釋分析原理。例如,將2008到2015年間關於“Myspace”和“Facebook”的文章請求數進行對比。使用MySQL的話,需要將其原封不動的載入MySQL。所有檔案按內建的日期編碼分佈。解壓的總大小大於10TB。下面是可選的步驟方案(典型的MySQL方式):

1、解壓檔案並執行“LOAD DATA INFILE”命令,將其錄入臨時表格:

2、“插入到”最終的表格,進行聚合:

3、通過url解碼標題(可能用到UDF)。

開銷很大:解壓並將資料轉化為MySQL格式,絕大部分都會被丟棄,作為損耗。

根據我的統計,整理6年來的資料需耗時超過1個月,還不包括解壓時間,隨著表格逐漸變大、索引需要更新所帶來的載入時間折損。當然,有很多辦法可以加速這一過程,比如載入不同的MySQL例項、首先載入記憶體表格再集合成InnoDB等。

不過最簡單的辦法是使用Apache Spark和Python指令碼(pyspark)。Pyspark可以讀出原始的壓縮txt檔案,用SQL進行查詢,使用篩選、類似urldecode函式等,按日期分組,然後將結果集儲存到MySQL中。

下面是執行操作的Python指令碼:

在指令碼中用到了Spark來讀取原始壓縮檔案(每次一天)。我們可以使用目錄作為“輸入”或者檔案列表。然後用彈性分散式資料集(RDD)轉化格式;Python包含lambda函式對映和篩選,允許我們將“輸入檔案”分離並進行篩選。

下一步是應用模式(declare fields);我們還能使用其他函式,比如用urllib.unquote來解碼標題(urldecode)。最終,我們可以註冊臨時表格,然後使用熟悉的SQL來完成分組。

該指令碼可以充分利用CPU核心。此外,即便不使用Hadoop,在分散式環境中執行也非常簡易:只要將檔案複製到SparkNFS/外部儲存。

該指令碼花了1個小時,使用了三個box,來處理一個月的資料,並將聚合資料載入到MySQL上(單一例項)。我們可以估出:載入全部6年的(聚合)資料到MySQL上需要大約3天左右。

你可能會問,為什麼現在要快得多(而且實現了同樣的例項)。答案是:管道不同了,而且更為有效。在我們起初的MySQL管道中,載入的是原始資料,需要大約數月時間完成。而在本案例中,我們在讀取時篩選、分組,然後只將需要的內容寫入MySQL。

這裡還有一個問題:我們真的需要整個“管道”嗎?是否可以簡單地在“原始”資料之上執行分析查詢?答案是:確實有可能,但是也許會需要1000個節點的Spark叢集才能奏效,因為需要掃描的資料量高達5TB(參見下文中的“補充”)。

MySQL Inserts的多執行緒表現

通過使用group_res.write.jdbc(url=mysql_url, table=”wikistats.wikistats_by_day_spark”, mode=”append”) ,Spark會啟動多執行緒插入。

監控你的工作

Spark提供了web介面,方便對工作進行監控管理。樣例如下:執行wikistats.py application:

結果:使用Parquet分列格式與MySQL InnoDB表格

Spark支援Apache Parquet分列格式,因此我們可以將RDD儲存為parquet檔案(存入HDFS時可以儲存到目錄中):

我們將管道結果(聚合資料)存入Spark。這次使用了按天分割槽(“mydate=20080101”),Spark可以在這種格式中自動發現分割槽。得到結果後要進行查詢。假設我們想要找到2018年1月查詢最頻繁的10大wiki頁面。可以用MySQL進行查詢(需要去掉主頁和搜尋頁):

請注意,我們已經使用了聚合(資料彙總)表格,而不是“原始”資料。我們可以看到,查詢花了1小時22分鐘。由於將同樣的結果存入了Parquet(見指令碼)中,現在可以在Spark-SQL中使用它了:

這將用到spark-sql的本地版本,而且只用到1個主機。


耗時大約20分鐘,比之前更快。

結論

Apache Spark是分析和聚合資料的好辦法,而且非常簡便。我喜歡Spark與其他大資料還有分析框架的原因在於:

l開源與積極開發

l不依賴工具,例如輸入資料與輸出資料不一定非要藉助Hadoop

l獨立模式,啟動迅速,易於部署

l大規模並行,易於新增節點

l支援多種輸入與輸出格式;比如可以讀取/寫入MySQL(Java資料庫連線驅動)與Parquet分列格式

但是,也有很多缺點:

l技術太新,會有一些bug和非法行為。很多錯誤難以解釋。

l需要Java;Spark 1.5僅支援Java 7及以上版本。這也意味著需要額外記憶體——合情合理。

l你需要通過“spark-submit”來執行任務。

我認為作為工具,Apache Spark十分不錯,補足了MySQL在資料分析與商業智慧方面的短板。

【編輯推薦】

【責任編輯:李英傑TEL:(010)68476606】

相關推薦

使用Apache SparkMySQL打造強大資料分析

藉助真實案例和程式碼樣本,本文作者展示瞭如何將Sparke和MySQL結合起來,創造資料分析上的強大工具。 Apache Spark是一個類似Apache Hadoop的叢集計算框架,在Wikipedia上有大量描述:Apache Spark是一個開源叢集計算框架,出自加州大學伯克利分校的AMPLa

使Apache SparkMysql資料分析

使用用spart-shell讀取MySQL表中的資料 步驟1: 執行spark-shell命令,進入spark-shell命令列,執行命令如下: [email protected]:~/run/spark/bin$ ./spark-shell --maste

使用Apache SparkApache Hudi構建分析資料

## 1. 引入 大多數現代資料湖都是基於某種分散式檔案系統(DFS),如HDFS或基於雲的儲存,如AWS S3構建的。遵循的基本原則之一是檔案的“一次寫入多次讀取”訪問模型。這對於處理海量資料非常有用,如數百GB到TB的資料。 但是在構建分析資料湖時,更新資料並不罕見。根據不同場景,這些更新頻率可能是每

[Spark周邊]--SQL Server 2019預覽結合了SQL ServerApache Spark來建立統一的資料平臺

感謝原文作者:https://cloudblogs.microsoft.com/sqlserver/2018/09/24/sql-server-2019-preview-combines-sql-server-and-apache-spark-to-create-a-unified-data-pla

SQL Server 2019預覽結合了SQL ServerApache Spark來建立統一的資料平臺

本文翻譯自: 今天在Ignite上,微軟宣佈推出SQL Server 2019。25年來,SQL Server幫助企業管理其關係資料的各個方面。在最近的版本中,SQL Server不僅通過統一圖形和關係資料來查詢關係資料,還通過R和Python模型培訓和評分將機器學習帶到資

從0到1搭建基於Kafka、FlumeHive的海量資料分析系統(一)資料收集應用

大資料時代,一大技術特徵是對海量資料採集、儲存和分析的多元件解決方案。而其中對來自於感測器、APP的SDK和各類網際網路應用的原生日誌資料的採集儲存則是基本中的基本。本系列文章將從0到1,概述一下搭建基於Kafka、Flume、Zookeeper、HDFS、Hive的海量資料分析系統的框架、核心應用和關鍵模組

乘用車輛商用車輛銷售資料分析

1 資料概況 本資料為上牌汽車的銷售資料,分為乘用車輛和商用車輛。資料包含銷售相關資料與汽車具體引數。資料項包括:時間、銷售地點、郵政編碼、車輛型別、車輛型號、製造廠商名稱、排量、油耗、功率、發動機型號、燃料種類、車外廓長寬高、軸距、前後車輪、輪胎規格、輪胎數、載客數、所有權、購買人相關資訊等。 2 資

資料平臺MySQL之間的資料匯出匯入

資料的匯出和匯入都是針對大資料平臺(HDFS,Hive,HBase)來定義的 資料從MySQL到大資料平臺----------資料匯入 資料從大資料平臺到MySQL-----------資料匯出 一、資料匯出(大資料平臺---->Mysql) 1.匯出 HDFS資料到MySQL

hive整合sparkmysql

一、Hive安裝 1.Hive簡介 ​ Hive是Facebook開發的構建於Hadoop叢集之上的資料倉庫應用,可以將結構化的資料檔案對映為一張資料庫表,並提供完整的SQL查詢功能,可以將SQL語句轉換為MapReduce任務進行執行。

Mac 安裝使用apache php mysql

Mac 系統說明 OS X EI Capitan 版本 10.11.5 說明 MAC上預設自帶了 apache 和php 只需要開啟對應的地方就可以使用, mysql 需要自己安裝 配置Apache 啟動apache ap

org.apache.spark.SparkException: Task not serializable問題分析

問題描述及原因分析 在編寫Spark程式中,由於在map等運算元內部使用了外部定義的變數和函式,從而引發Task未序列化問題。然而,Spark運算元在計算過程中使用外部變數在許多情形下確實在所難免,比如在filter運算元根據外部指定的條件進行過濾,ma

分散式爬蟲處理RedisMySQL裡的資料操作步驟

這篇文章主要介紹了分散式爬蟲處理Redis裡的資料操作步驟,資料分別存入mongodb和mysql資料庫存入MongoDB1.啟動MongoDB資料庫:sudo mongod2.執行下面程式:py2 process_youyuan_mongodb.py# process_yo

hive例項-乘用車輛商用車輛銷售資料分析

資料來源地址:http://pan.baidu.com/s/1cKsrKi 1.準備資料來源 開啟 上牌數--商用車銷量資料樣例.xlsx,另存為car.txt檔案,開啟car.txt,設定編碼格式為

資料驅動測試三:使用TestNG、Apache POIExcel檔案進行資料驅動

一、測試環境準備 1、從http://www.apache.org/dyn/closer.cgi/poi/release/bin/poi-bin/poi-bin-3.14.zip下載POI的壓縮包檔案。 2、將壓縮包進行解壓,將解壓檔案根目錄下的JAR檔案和ooxml-li

MSSQLMySQL中,資料表兩列欄位值互換的問題

MSSQL的處理方法 update table1 set field_1 = field_2, field_2 = field_1 可是MySQL就不能這樣寫,不然一列會覆蓋另一列記錄 MySQL語句如下 update table1 a, table1

Sql Server中的資料型別Mysql中的資料型別的對應關係

一、SQL SERVER與MySQL資料儲存的差異 1、SQL SERVER中的datetime,保留到微秒(秒後小數點3位),而mysql僅保留到秒,轉換後是否會影響業務,如果影響,需要新增一個欄位專門來儲存微秒或者毫秒,雖然mysql中沒有時間資料型別的精度到達微秒或者

MongoDB資料轉移到Mysql庫進行資料分析

最近有一個調優的專案設計到MongoDB資料轉移到Mysql庫進行資料分析。 以下是利用kettle對資料的轉換的介紹: 1:MongoDb的查詢:    主要是基於json格式:具體的查詢可以見連線MonGoDb的查詢語句。   資料集是   由於帶有時間戳times

pyhton專案晉江文學城資料分析專案

 1.圖書管理系統       圖1.圖書管理系統(作者資訊列表頁面)         圖2.圖書管理系統(作者資訊修改頁面)  2.個人部落格網頁設計     圖3.部落格(我的日記-->

通過Apache HudiAlluxio建設高效能資料

T3出行的楊華和張永旭描述了他們資料湖架構的發展。該架構使用了眾多開源技術,包括Apache Hudi和Alluxio。在本文中,您將看到我們如何使用Hudi和Alluxio將資料攝取時間縮短一半。此外,資料分析人員如何使用Presto、Hudi和Alluxio讓查詢速度提高了10倍。我們基於資料編排為資料管

初階專案一-整合一套linux系統:紅帽系統,LVM分割槽,Apache服務,MySQL服務,資料定時備份指令碼

[TOC] # 一.專案目標 ​ 根據公司要求:整合一套LINUX系統,按照規定進行分區劃分,組建LVM分割槽,建立使用者;部署一套web+mysql,並通過shell指令碼+cron執行定期自動備份資料。 # 二.實施工具 ​ 本次軟體實施需要用到的工具: VMware Workstation虛