Combiner是MapReduce的一种优化机制,它的主要功能是在“shuffle and sort”之前先在本地将中间键值对进行聚合,以减少在网络上发送的中间键值对数据量。因此可以把combiner视作在“shuffle and sort”阶段之前对mapper的输出结果所进行聚合操作的“mini-reducer”。在实现中,各combiner之间的操作是隔离的,因此,它不会涉及到其它mapper的数据结果。需要注意的是,就算是某combiner可以有机会处理某键相关的所有中间数据,也不能将其视作reducer的替代品,因为combiner输出的键值对类型必须要与mapper输出的键值对类型相同。无论如何,combiner的恰当应用将有机会有效提高作业的性能。
Hadoop商业发行版
Hadoop的发行版除了ASF的Hadoop外,还有cloudera、hortonworks、MapR、intel、EMC等提供的商业支持版本,分别以自己的附加产品及应用经验为Hadoop应用提供专业的技术支持。
2008年成立的Cloudera是最早将Hadoop商用的公司,为合作伙伴提供Hadoop的商用解决方案,主要是包括技术支持、咨询服务和培训等。2009年hadoop的创始人Doug Cutting也任职于Cloudera公司。Cloudera产品主要为CDH,Cloudera Manager,Cloudera Support。CDH是Cloudera的hadoop发行版,完全开源,比Apache hadoop在兼容性,安全性,稳定性上有增强。Cloudera Manager是集群的软件分发及管理监控平台,可以在几个小时内部署好一个hadoop集群,并对集群的节点及服务进行实时监控。Cloudera Support即是对hadoop的技术支持。
2011年成立的Hortonworks是雅虎与硅谷风投公司BenchmarkCapital合资组建的公司。公司成立之初吸纳了大约25名至30名专门研究Hadoop的雅虎工程师,上述工程师均在2005年开始协助雅虎开发Hadoop,这些工程师贡献了hadoop 80%的代码。雅虎工程副总裁、雅虎Hadoop开发团队负责人Eric Baldeschwieler出任Hortonworks的首席执行官。Hortonworks 的主打产品是Hortonworks Data Platform (HDP),也同样是100%开源的产品,HDP还包含了一款开源的安装和管理系统Ambari以及一个元数据管理系统HCatalog。
cloudera和hortonworks都在通过自己的努力不断地提交代码修复及完善着Apache Hadoop。如果对其它商业版本有兴趣,请分别参照其官方的说明。本书后面选用的Hadoop会以CDH或HDP为主。
Hadoop依赖软件
Hadoop基于Java语言开发,因此其运行严重依赖于JDK(Java Development Kit),并且Hadoop的许多功能依赖于Java 6及以后的版本才提供的特性。Hadoop可以良好地运行于经过测试的各JDK,如Sun JDK、OpenJDK、Oracle JRockit、IBM JDK各自实现的某些版本。但迄今为止,HotSpot JVM仍是性能最好且与Hadoop搭配运行最稳定的实现。http://wiki.apache.org/hadoop/HadoopJavaVersions页面给出了Hadoop目前几大著名企业实现的Hadoop集群中所使用的JDK版本,Hortonworks已经为JDK1.6.0_31在RHEL5/CentOS5、RHEL6/CentOS6、SLES11运行Hadoop、HBase、Pig, Hive、HCatalog、Oozie、Sqoop等进行了认证。建议参考它们的测试结果进行选择。
在选择安装版本,Sun JDK有几种不同格式的安装包,其使用及功能上并没有区别;但如果在安装Hadoop使用CDH的RPM格式的包的话,它们依赖于RPM格式的JDK,不过,ASF提供的RPM包并没有定义任何外在的依赖关系,因此,其可以使用基于任何方式安装配置的JDK,但这也意味着得手动解决依赖关系。无论如何,一个生产环境的Hadoop集群应该运行在64位的操作系统上,JDK等也要使用相应的64位版本,否则,单JVM进程将无法使用大于2GB以上的内存。
除了JDK之外,Hadoop集群的正常运行还可能根据实际环境依赖于其它的一些软件以实现集群的维护、监控及管理等。这些软件诸如cron、ntp、ssh、postfix/sendmail及rsync等。cron通常用于在Hadoop集群中过期的临时文件、归档压缩日志等定期任务的执行;ntp则用于为集群的各节点实现时间同步;ssh并非是必须的,但在MapReduce或HDFS的master节点上一次性启动整个集群时通过要用到ssh服务;postfix/sendmail则用于将cron的执行结果通知给管理员;rsync可用于实现配置文件的同步等。
Hadoop的运行环境
各节点的主机名
Hadoop在基于主机引用各节点时会有一些独特的方式,这已经让很多的Hadoop管理员为此头疼不已。实际使用中,应该避免集群中的各节点尤其是从节点(DataNode和TaskTracker)使用localhost作为本机的主机名称,除非是在伪分布式环境中。
用户、组及目录
一个完整的Hadoop集群包含了MapReduce集群和HDFS集群,MapReduce集群包含JobTracker和TaskTracker两类进程和许多按需启动的任务类进程(如map任务),HDFS集群包含NameNode、SecondaryNameNode和DataNode三类进程。安全起见,应该以普通用户的身份启动这些进程,并且MapReduce集群的进程与HDFS集群的进程还应该使用不同的用户,比如分别使用mapred和hdfs用户。使用CDH的RPM包安装Hadoop时,这些用户都会被自动创建,如果基于tar包安装,则需要手动创建这些用户。
Hadoop的每一个进程都会访问系统的各类资源,然而,Linux系统通过PAM限定了用户的资源访问能力,如可打开的文件数(默认为1024个)及可运行的进程数等,这此默认配置在一个略具规模的Hadoop集群中均会带来问题。因此,需要为mapred和hdfs用户修改这些限制,这可以在/etc/security/limits.conf中进行。修改结果如下。
#Allow users hdfs, mapred, and hbase to open 32k files. The
#type '-' means both soft and hard limits.
#
#See 'man 5 limits.conf' for details.
#user type resource value
hdfs- nofile 32768
mapred- nofile 32768
Hadoop的分布式模型
Hadoop通常有三种运行模式:本地(独立)模式、伪分布式(Pseudo-distributed)模式和完全分布式(Fullydistributed)模式。
安装完成后,Hadoop的默认配置即为本地模式,此时Hadoop使用本地文件系统而非分布式文件系统,而且其也不会启动任何Hadoop守护进程,Map和Reduce任务都作为同一进程的不同部分来执行。因此,本地模式下的Hadoop仅运行于本机。此种模式仅用于开发或调试MapReduce应用程序但却避免了复杂的后续操作。
伪分布式模式下,Hadoop将所有进程运行于同一台主机上,但此时Hadoop将使用分布式文件系统,而且各jobs也是由JobTracker服务管理的独立进程。同时,由于伪分布式的Hadoop集群只有一个节点,因此HDFS的块复制将限制为单个副本,其secondary-master和slave也都将运行于本地主机。此种模式除了并非真正意义的分布式之外,其程序执行逻辑完全类似于完全分布式,因此,常用于开发人员测试程序执行。
要真正发挥Hadoop的威力,就得使用完全分布式模式。由于ZooKeeper实现高可用等依赖于奇数法定数目(an odd-numbered quorum),因此,生产环境中,完全分布式环境需要至少三个节点。
Hadoop的配置文件
hadoop-env.sh: 用于定义hadoop运行环境相关的配置信息,比如配置JAVA_HOME环境变量、为hadoop的JVM指定特定的选项、指定日志文件所在的目录路径以及master和slave文件的位置等;
core-site.xml: 用于定义系统级别的参数,如HDFSURL、Hadoop的临时目录以及用于rack-aware集群中的配置文件的配置等,此中的参数定义会覆盖core-default.xml文件中的默认配置;
hdfs-site.xml: HDFS的相关设定,如文件副本的个数、块大小及是否使用强制权限等,此中的参数定义会覆盖hdfs-default.xml文件中的默认配置;
mapred-site.xml:HDFS的相关设定,如reduce任务的默认个数、任务所能够使用内存的默认上下限等,此中的参数定义会覆盖mapred-default.xml文件中的默认配置;
masters: hadoop的secondary-masters主机列表,当启动Hadoop时,其会在当前主机上启动NameNode和JobTracker,然后通过SSH连接此文件中的主机以作为备用NameNode;
slaves:Hadoop集群的slave主机列表,master启动时会通过SSH连接至此列表中的所有主机并为其启动DataNode和taskTracker进程;
hadoop ecosystem map生态圈:
HDFS海量数据存储,用分布式文件系统;
mapreduce,数据分析处理用MapReduce框架,通过编写代码来实现对大数据的分析工作;
fuse&WebDav&Chukwa&flume&scribe,unstructured data非结构化数据(日志)收集处理;
hiho&sqoop,structured data,RDBMS-->sqoop-->hbase-->HDFS或RDBMS-->sqoop-->HDFS;
AVRO组件(将数据序列化data serialization system,协调众多任务在hadoop集群上执行,AVRO将数据序列化后,通过网络传输到HDFS上并反序列化;google中叫protocol buffer,facebook中叫thrift);
oozie、cascading(工作流管理组件,用高级语言管理你的任务流);
hive&pig&crunch&jaql组件(编程工具,MapReduce太麻烦,让你用熟悉的方式来操作Hadoop里的数据;
pig,力图将mapreduce作成workflow方式,功能性函数接口;
hive,facebook,力图将mapreduce作为sql形式,可理解为sql接口风格,在mapreduce函数基础上提供类似通过sql语句查询,并输出为表,hive也是存储;
crunch,java接口);
hbase(OLTP存储系统;
hbase是HDFS的client,基于hbase存储数据,可进行增加、删除、修改;
hbase是nosql,稀疏格式存储系统,多版本key-value存储,支持CRUD,create、replace、update、delete;
);
bigtable(google,列式数据库,在hadoop中是用hbase实现的);
R语言(统计领域专用语言,RHIPE,R and hadoop integrated programming environment,RHadoop,在hadoop之上,利用hadoop的计算能力作统计分析);
nutch,数据抓取系统;
drilldown&intellicus,数据可见;
Ambari&Hue&karmasphere&eclipseplugin&Cacti&ganglia,Hadoop监控管理工具
zookeeper,任务调度,a high performance coordination service for distributed applications;
Mahout&Elastic map Reduce,构建在Hadoop上层的服务,mahout(a scalable machine learning and data mining library);
impala(使用google的dremel(商业)的思想,impala allows you to run real-time queries on top of hadoop's HDFS,hbase and hive,no migrations necessary);
注:
学习:HDFS-->mapreduce-->hbase-->hive-->sqoop-->flume&scribe&chukwa;
不建议在虚拟机(openstack)上使用hadoop
CDH,cloudera distribution hadoop,使用CDH提供的包,hadoop官方提供的软件包有兼容性问题;
本地模式;
伪分布式模式(1个node);
完全分布式模式(4个node以上);
job tracker;
namenode;
secondary namenode;
task tracker;
data node;