首頁 資料庫 mysql教程 使用Apache Hadoop、Impala和MySQL进行数据分析_MySQL

使用Apache Hadoop、Impala和MySQL进行数据分析_MySQL

Jun 01, 2016 pm 01:14 PM
部落格 如何 文章

Apache

Apache Hadoop是目前被大家广泛使用的数据分析平台,它可靠、高效、可伸缩。Percona公司的Alexander Rubin最近发表了一篇博客文章介绍了他是如何将一个表从MySQL导出到Hadoop然后将数据加载到Cloudera Impala并在这上面运行报告的。

在Alexander Rubin的这个测试示例中他使用的集群包含6个数据节点。下面是具体的规格:

用途

服务器规格

NameNode、DataNode、Hive 元数据存储等

2x PowerEdge 2950, 2x L5335 CPU @ 2.00GHz, 8 cores, 16GB RAM, 使用8个SAS驱动器的RAID 10

仅做数据节点

4x PowerEdge SC1425, 2x Xeon CPU @ 3.00GHz, 2 cores, 8GB RAM, 单个4TB 驱动器

数据导出

有很多方法可以将数据从MySQL导出到Hadoop。在Rubin的这个示例中,他简单地将ontime表导出到了一个文本文件中:

select*intooutfile '/tmp/ontime.psv'
FIELDS TERMINATED BY ','
fromontime;

你可以使用“|”或者任何其他的符号作为分隔符。当然,还可以使用下面这段简单的脚本直接从www.transtats.bts.gov上下载数据。

foryin{1988..2013}
do
foriin{1..12}
do
                u="http://www.transtats.bts.gov/Download/On_Time_On_Time_Performance_${y}_${i}.zip"
                wget $u -o ontime.log
                unzipOn_Time_On_Time_Performance_${y}_${i}.zip
done
done

载入Hadoop HDFS

Rubin首先将数据载入到了HDFS中作为一组文件。Hive或者Impala将会使用导入数据的那个目录,连接该目录下的所有文件。在Rubin的示例中,他在HDFS上创建了/data/ontime/目录,然后将本地所有匹配On_Time_On_Time_Performance_*.csv模式的文件复制到了该目录下。

$ hdfs dfs -mkdir /data/ontime/
$ hdfs -v dfs -copyFromLocalOn_Time_On_Time_Performance_*.csv /data/ontime/

Impala中创建外部表

当所有数据文件都被载入之后接下来需要创建一个外部表:

CREATE EXTERNAL TABLE ontime_csv (
YearDint,
Quartertinyint ,
MonthDtinyint ,
DayofMonthtinyint ,
DayOfWeektinyint ,
FlightDatestring,
UniqueCarrierstring,
AirlineIDint,
Carrierstring,
TailNumstring,
FlightNumstring,
OriginAirportIDint,
OriginAirportSeqIDint,
OriginCityMarketIDint,
Originstring,
OriginCityNamestring,
OriginStatestring,
OriginStateFipsstring,
OriginStateNamestring,
OriginWacint,
DestAirportIDint,
DestAirportSeqIDint,
DestCityMarketIDint,
Deststring,
...
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/data/ontime';

注意“EXTERNAL”关键词和LOCATION,后者指向HDFS中的一个目录而不是文件。Impala仅会创建元信息,不会修改表。创建之后就能立即查询该表,在Rubin的这个示例中执行的SQL是:

>selectyeard, count(*)fromontime_psv groupbyyeard;

该SQL耗时131.38秒。注意GROUP BY并不会对行进行排序,这一点不同于MySQL,如果要排序需要添加 ORDER BY yeard语句。另外通过执行计划我们能够发现Impala需要扫描大小约为45.68GB的文件。

Impala使用面向列的格式和压缩

Impala最大的好处就是它支持面向列的格式和压缩。Rubin尝试了新的使用Snappy压缩算法的Parquet格式。因为这个例子使用的表非常大,所以最好使用基于列的格式。为了使用Parquet格式,首先需要载入数据,这在Impala中已经有表、HDFS中已经有文件的情况下是非常容易实现的。本示例大约使用了729秒的时间导入了约1亿5千万条记录,导入之后使用新表再次执行同一个查询所耗费的时间只有4.17秒,扫描的数据量也小了很多,压缩之后的数据只有3.95GB。

Impala复杂查询示例

select
   min(yeard), max(yeard),Carrier, count(*)ascnt,
   sum(if(ArrDelayMinutes>30, 1, 0))asflights_delayed,
   round(sum(if(ArrDelayMinutes>30, 1, 0))/count(*),2)asrate
FROM ontime_parquet_snappy
WHERE
DayOfWeeknotin(6,7)andOriginStatenotin('AK', 'HI', 'PR', 'VI')
andDestStatenotin('AK', 'HI', 'PR', 'VI')
andflightdate GROUPbycarrier
HAVING cnt > 100000andmax(yeard) > 1990
ORDERbyrate DESC
LIMIT 1000;

注意:以上查询不支持sum(ArrDelayMinutes>30)语法,需要使用sum(if(ArrDelayMinutes>30, 1, 0) 代替。另外查询故意被设计为不使用索引:大部分条件仅会过滤掉不到30%的数据。

该查询耗时15.28秒比最初的MySQL结果(非并行执行时15分56.40秒,并行执行时5分47秒)要快很多。当然,它们之间并不是一个“对等的比较”:

  • MySQL将扫描45GB的数据而使用Parquet的Impala仅会扫描3.5GB的数据
  • MySQL运行在一台服务器上,而Hadoop和Impala则并行运行在6台服务器上

尽管如此,Hadoop和Impala在性能方面的表现依然令人印象深刻,同时还能够支持扩展,因此在大数据分析场景中它能为我们提供很多帮助。


感谢崔康对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1246
24
從頭開始,逐步引導您安裝Flask,快速建立個人博客 從頭開始,逐步引導您安裝Flask,快速建立個人博客 Feb 19, 2024 pm 04:01 PM

從零開始,手把手教你安裝Flask和快速建立個人部落格作為一個喜歡寫作的人來說,擁有個人部落格是非常重要的。而Flask作為一個輕量級的PythonWeb框架,可以幫助我們快速建立一個簡潔而功能完善的個人部落格。在本文中,我將從零開始,手把手教你如何安裝Flask並快速建立個人部落格。第一步:安裝Python和pip在開始之前,我們需要先安裝Python和pi

創建一個簡單的部落格:使用PHP和SQLite 創建一個簡單的部落格:使用PHP和SQLite Jun 21, 2023 pm 01:23 PM

隨著網路的發展,部落格成為越來越人分享自己生活、知識和想法的平台。如果你也想創建一個自己的博客,那麼本文將介紹如何使用PHP和SQLite來創建一個簡單的博客。在確定需求在開始創建部落格之前,我們需要確定自己想要實現的功能。例如:建立部落格文章編輯部落格文章刪除部落格文章顯示部落格文章清單顯示部落格文章詳情使用者認證和權限控制安裝PHP和SQLite我們需要安裝PHP和S

2022年十大開源php部落格系統有哪些? 【推薦】 2022年十大開源php部落格系統有哪些? 【推薦】 Jul 27, 2022 pm 05:38 PM

博客,又譯為網絡日誌、博客或部落閣等,是一種通常由個人管理、不定期張貼新的文章的網站。那怎麼搭建部落格? PHP部落格系統有哪些?哪個部落格系統好用?下面PHP中文網就來跟大家總結分享十大開源php部落格系統,一起來看看吧!

今日頭條發布文章怎麼有收益?今日頭條發布文章獲得更多收益方法! 今日頭條發布文章怎麼有收益?今日頭條發布文章獲得更多收益方法! Mar 15, 2024 pm 04:13 PM

一、今日頭條發布文章怎麼有收益?今日頭條發布文章獲得更多收益方法! 1.開通基礎權益:原創文章選擇投放廣告可獲得收益,影片必須原創橫屏才會有收益。 2.開通百粉權益:粉絲量達百粉以上,微頭條、原創問答創作及問答均可獲得收益。 3.堅持原創作品:原創作品包含文章、微標題及問題等,要求300字以上。注意違規抄襲作品作為原創發布,會被扣信用分,即使有收益也會被扣除。 4.垂直度:做專業領域一類的文章,不能隨意跨領域寫文章,會得不到合適的推薦,達不到作品的專和精,難以吸引粉絲讀者。 5.活躍度:活躍度高,

如何使用PHP創建一個簡單的博客 如何使用PHP創建一個簡單的博客 Sep 24, 2023 am 08:25 AM

如何使用PHP創建一個簡單的部落格1.引言隨著網路的快速發展,部落格已經成為了人們分享經驗、記錄生活和表達觀點的重要方式。本文將介紹如何使用PHP來創建一個簡單的博客,並附上具體的程式碼範例。 2.準備工作在開始之前,你需要具備以下開發環境:一台安裝了PHP解釋器和Web伺服器(如Apache)的電腦一個資料庫管理系統,如MySQL一個文字編輯器或IDE3

使用Python Django框架建立部落格網站 使用Python Django框架建立部落格網站 Jun 17, 2023 pm 03:37 PM

隨著網路的普及,部落格在資訊傳播和交流方面扮演著越來越重要的角色。在此背景下,越來越多的人開始建立自己的部落格網站。本文將介紹如何使用PythonDjango框架來建立自己的部落格網站。一、PythonDjango框架簡介PythonDjango是一個免費的開源Web框架,可用於快速開發Web應用程式。該框架為開發人員提供了強大的工具,可幫助他們建立功能豐

如何創建部落格 如何創建部落格 Oct 10, 2023 am 09:46 AM

可以透過確定部落格的主題和目標受眾、選擇合適的部落格平台、註冊網域和購買主機、設計部落格的外觀和佈局、編寫優質的內容、推廣部落格和分析和改進等步驟來建立部落格。

如何在HTML5中加入文章? 如何在HTML5中加入文章? Sep 12, 2023 am 11:37 AM

在本文中,我們將學習如何在HTML5中加入文章。 HTML5中的新分段元素之一是標記。文章使用標籤以HTML形式表示。更具體地說,元素中包含的內容與網站的其餘內容不同(即使它們可能相關)。讓我們考慮以下範例來了解如何在HTML5中新增文章範例1在以下範例中,我們在文章元素中使用內聯樣式。 <!DOCTYPEhtml><html><body><articlestyle="width:300px;border:2pxsolidgray;padding:

See all articles