免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2480 | 回复: 0
打印 上一主题 下一主题

[Impala] 使用Apache Hadoop、Impala和MySQL进行数据分析 [复制链接]

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:28
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-09 09:46 |只看该作者 |倒序浏览
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 * into outfile '/tmp/ontime.psv' FIELDS TERMINATED BY ',' from ontime;

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

for y in {1988..2013} do for i in {1..12} do                 u="http://www.transtats.bts.gov/Download/On_Time_On_Time_Performance_${y}_${i}.zip"                 wget $u -o ontime.log                 unzip On_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 -copyFromLocal On_Time_On_Time_Performance_*.csv /data/ontime/

在Impala中创建外部表

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

CREATE EXTERNAL TABLE ontime_csv ( YearD int , Quarter tinyint , MonthD tinyint , DayofMonth tinyint , DayOfWeek tinyint , FlightDate string , UniqueCarrier string , AirlineID int , Carrier string , TailNum string , FlightNum string , OriginAirportID int , OriginAirportSeqID int , OriginCityMarketID int , Origin string , OriginCityName string , OriginState string , OriginStateFips string , OriginStateName string , OriginWac int , DestAirportID int , DestAirportSeqID int , DestCityMarketID int , Dest string , ... ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/data/ontime';

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

> select yeard, count(*) from ontime_psv  group by yeard;

该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(*) as cnt,    sum(if(ArrDelayMinutes>30, 1, 0)) as flights_delayed,    round(sum(if(ArrDelayMinutes>30, 1, 0))/count(*),2) as rate FROM ontime_parquet_snappy WHERE DayOfWeek not in (6,7) and OriginState not in ('AK', 'HI', 'PR', 'VI') and DestState not in ('AK', 'HI', 'PR', 'VI') and flightdate < '2010-01-01' GROUP by carrier HAVING cnt > 100000 and max(yeard) > 1990 ORDER by rate 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

本文来自ChinaUnix新闻频道,如果查看原文请点:http://news.chinaunix.net/opensource/2014/0508/3152509.shtml
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP