7.1 R语言为Hadoop注入统计血脉
问题
R为什么要结合Hadoop?
引言
R语言和Hadoop分别属于两个不同的学科,有着两类完全不同的用户,基于两种不同的知识体系,做着不同的事情。但数据却是它们的交集,数据让R语言结合Hadoop成为一种跨学科选择,一种挖掘数据价值的工具。
7.1.1 Hadoop介绍
对于IT界的人员来说,Hadoop算是耳熟能详的技术了。Hadoop是一个分布式系统基础架构,由Apache基金会管理。用户可以在不了解分布式底层细节的情况下开发分布式程序,充分利用集群的威力高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有着高容错性的特点,并且设计用来部署在低廉的硬件上。而且它提供高传输率来访问应用程序的数据,适合那些有着超大数据集的应用程序。
Hadoop的家族成员众多,包括Hive、 HBase、 Zookeeper、 Avro、 Pig、 Ambari、 Sqoop、 Mahout、Chukwa 等,下面分别一句话介绍这些Hadoop家族的成员。
Hive 是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Pig 是一个基于Hadoop的大规模数据分析工具,它提供了SQL-LIKE语言,即Pig Latin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。
HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
Sqoop 是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(MySQL、Oracle、Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
Zookeeper是一个为分布式应用所设计的分布的、开源的协调服务,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。
Mahout是基于Hadoop的机器学习和数据挖掘的一个分布式框架。Mahout用MapReduce实现了部分数据挖掘算法,解决了并行挖掘的问题。
Avro是一个数据序列化系统,设计用于支持数据密集型、大批量数据交换的应用。Avro是新的数据序列化格式与传输工具,将逐步取代Hadoop原有的IPC机制。
Ambari是一种基于Web的工具,支持Hadoop集群的供应、管理和监控。
Chukwa是一个开源的用于监控大型分布式系统的数据收集系统,它可以将各种类型的数据收集成适合Hadoop处理的文件保存在HDFS中供Hadoop进行各种MapReduce操作。
自2006年Hadoop以MapReduce和HDFS独立发展开始到2013年,不过7年时间,Hadoop的家族已经孵化出多个Apache的顶级项目。特别是最近两三年,发展速度越来越快,又融入了很多新技术,比如YARN、Hcatalog、 Oozie、 Cassandra),都有点让我们学不过来了。关于Hadoop家族的更多介绍,可以参考笔者的博客“Hadoop家族系列文章”。
7.1.2 为什么要让Hadoop结合R语言?
R语言和Hadoop在各自领域中都是明星,而且发挥着重要的作用。当说起Hadoop结合R语言的时候,很多软件开发人员从计算机的角度,都会提出下面2个问题。
- 问题1: Hadoop的家族如此之强大,为什么还要结合R语言?
- 问题2: Hadoop家族中Mahout同样可以做数据挖掘和机器学习,和R语言的区别是什么?
下面我尝试着做一个解答。
问题1: Hadoop的家族如此之强大,为什么还要结合R语言?
(1) Hadoop家族的强大之处,在于对大数据的处理,让原来的不可能的GB、TB、PB级数据量的计算任务,成为了可能。
(2) R语言的强大之处,在于统计分析。在没有Hadoop之前,我们对于大数据的处理,要取样本,假设检验,做回归,长久以来R语言都是统计学家专属的工具。
(3) 从上面两点我们可以看出,Hadoop重点是全量数据分析,而R语言重点是样本数据分析,所以把两种技术放在一起,刚好是取长补短!
下面模拟一个场景:对1PB的新闻网站访问日志做分析,预测未来流量变化。具体实施过程,可能分为下面4步。
(1) 用R语言进行样本数据分析,对业务目标构建回归模型,并定义指标。
(2) 用Hadoop从海量日志数据中,提取全量指标数据。
(3) 再用R语言,对指标数据进行验证和调优。
(4) 最后用Hadoop分步式算法,重写R语言的模型,部署上线。
这个场景中,R和Hadoop分别都起着非常重要的作用。如果按照程序员的思维模式,所有事情都用Hadoop去做,就会没有数据建模和证明的过程,“预测的结果”一定是有问题的。如果按照统计学家的思维模式,所有的事情都用R去做,以抽样方式,得到的“预测的结果”也是有偏差的。所以让R语言结合Hadoop是工业界的必然的导向,也是工业界和学术界的交集,同时也为交叉学科的研究人员提供了无限广阔的想象空间。
问题2: Mahout同样可以做数据挖掘和机器学习,和R语言的区别是什么?
(1) Mahout是基于Hadoop的数据挖掘和机器学习的算法框架,Mahout的重点同样是解决大数据的计算的问题。
(2) Mahout目前已支持的算法包括协同过滤、推荐算法、聚类算法、分类算法、LDA、朴素Bayes、随机森林等,Mahout的算法中大部分都是基于距离的算法,可以通过矩阵分解后,充分利用MapReduce的并行计算框架,高效地完成计算任务。
(3) Mahout有很多空白点,许多数据挖掘算法是很难实现MapReduce并行化的。而且,Mahout的现有模型都是通用计算模型,直接用到项目中,计算结果只会比随机结果好一些。Mahout二次开发,要求有深厚的Java和Hadoop的技术基础,最好兼有线性代数、概率统计、算法导论等领域的基础知识,所以想玩转Mahout也不是一件容易的事情。
(4) R语言同样提供了Mahout支持的绝大多数算法(专有算法除外),并且还有大量的Mahout不支持的算法,算法的增长速度比Mahout快N倍。并且开发简单,参数配置灵活,对小型数据集运算速度非常快。
虽然,Mahout同样可以做数据挖掘和机器学习,但是和R语言的擅长领域并不重合。集百家之长,在适合的领域选择合适的技术,才能真正地保质保量做好软件。
7.1.3 如何让Hadoop结合R语言?
从上文的介绍我们可以了解到,Hadoop和R语言是可以互补互助的,但从目前的企业应用来看,R语言和Hadoop仍然都是在独立使用。不过一旦市场有需求,自然会有人来填补这个空白点。到底如何让Hadoop结合R语言呢?我列出5种结合的思路。
1. RHadoop
RHadoop是一款Hadoop和R语言结合的产品,由RevolutionAnalytics公司开发,并将代码开源到Github社区上面。RHadoop包含三个R包 (rmr,rhdfs,rhbase),分别是对应Hadoop系统架构中的MapReduce、 HDFS、 HBase 三个部分。关于RHadoop的安装和使用,在本章中会有详细的介绍。
2. RHive
RHive是一款通过R语言直接访问Hive的工具包,是由NexR一个韩国公司研发的。关于RHive的安装和使用,在6.5节和6.6节已经介绍过了。
3. 重写Mahout
用R语言重写Mahout的实现也是一种结合的思路,我也做过相关的尝试,在本书的姊妹篇《R的极客理想——高级开发篇》中会有详细介绍。
4. Hadoop调用R
上面说的都是R如何调用Hadoop,当然我们也可以反相操作,打通Java和R的连接通道,让Hadoop调用R的函数。目前,这部分还没有商家做出成形的产品。
我写了3个例子让Java可以调用R,大家可以自己尝试着结合,做出不一样的应用来,请参考4.1节、4.2节和4.3节。
5. R和Hadoop在实际中的案例
R和Hadoop的结合,技术门槛还是有点高的。对于一个人来说,不仅要掌握Linux、Java、 Hadoop、 R的技术,还要具备软件开发、算法、概率统计、线性代数、数据可视化、行业背景等一些基本素质。在公司部署这套环境,同样需要多个部门,多种人才的的配合。Hadoop运维、Hadoop算法研发、R语言建模、R语言MapReduce开发、软件测试等,所以,这样的案例并不太多。我做过一些尝试和努力,本书介绍了3个项目的实现思路,参见6.6节、7.3节和7.4节。
7.1.4 展望未来
对于R和Hadoop的结合,在近几年,肯定会生成爆发式的增长的。但由于跨学科会造成技术壁垒,人才会远远跟不上市场的需求。所以,肯定会有更多的大数据工具被开发出来!