了解了hadoop基本的搭建,和前期可能遇到的问题。
以下是对各个功能组件的理解。
Hadoop分布式文件系统(HDFS)是一种分布式文件系统,设计用于在商品硬件上运行。它与现有的分布式文件系统有许多相似之处。但是,与其他分布式文件系统的差异很大。HDFS具有高度容错能力,旨在部署在低成本硬件上。HDFS提供对应用程序数据的高吞吐量访问,适用于具有大型数据集的应用程序。HDFS放宽了一些POSIX要求,以启用对文件系统数据的流式访问。HDFS最初是作为Apache Nutch网络搜索引擎项目的基础架构而构建的。HDFS是Apache Hadoop Core项目的一部分。
HDFS具有主/从架构。一个HDFS集群包含一个NameNode,一个主服务器,用于管理文件系统名称空间并管理客户端对文件的访问。此外,还有许多DataNode,通常是群集中的每个节点一个DataNode,用于管理连接到它们所运行的节点的存储。HDFS公开文件系统名称空间并允许用户数据存储在文件中。在内部,文件被分成一个或多个块,这些块存储在一组DataNode中。NameNode执行文件系统命名空间操作,如打开,关闭和重命名文件和目录。它还确定块到DataNode的映射。DataNode负责提供来自文件系统客户端的读取和写入请求。DataNode还执行块创建,删除。
NameNode和DataNode是设计用于在商品机器上运行的软件。这些机器通常运行GNU / Linux操作系统(OS)。HDFS使用Java语言构建; 任何支持Java的机器都可以运行NameNode或DataNode软件。使用高度可移植的Java语言意味着HDFS可以部署在各种机器上。典型的部署有一台只运行NameNode软件的专用机器。群集中的每台其他机器运行DataNode软件的一个实例。该体系结构不排除在同一台机器上运行多个DataNode,但在实际部署中很少出现这种情况。
集群中单个NameNode的存在极大地简化了系统的体系结构。NameNode是所有HDFS元数据的仲裁者和存储库。该系统的设计方式是用户数据永远不会流经NameNode。
ZooKeeper是一个分布式的开源协调服务,用于分布式应用程序。它公开了一组简单的原语,分布式应用程序可以构建这些原语,以实现更高级别的服务,以实现同步,配置维护以及组和命名。它的设计易于编程,并使用在熟悉的文件系统目录树结构之后设计的数据模型。它运行在Java中,并且对Java和C都有绑定。
众所周知,协调服务很难做到正确。它们特别容易出现诸如竞态条件和死锁等错误。ZooKeeper背后的动机是减轻分布式应用程序从头开始实施协调服务的责任。
YARN的基本思想是将资源管理和作业调度/监控的功能分解为单独的守护进程。这个想法是有一个全局的ResourceManager(RM)和每个应用程序的ApplicationMaster(AM)。应用程序可以是单个作业,也可以是DAG作业。
ResourceManager和NodeManager构成了数据计算框架。ResourceManager是仲裁系统中所有应用程序之间资源的最终权威机构。NodeManager是负责容器的每机器框架代理,监视它们的资源使用情况(cpu,内存,磁盘,网络),并将其报告给ResourceManager / Scheduler。
每个应用程序的ApplicationMaster实际上是一个特定于框架的库,并负责从ResourceManager协商资源,并与NodeManager一起工作来执行和监视这些任务。
ResourceManager有两个主要组件:Scheduler和ApplicationsManager。
调度程序负责将资源分配给各种正在运行的应用程序,这些应用程序受到容量,队列等熟悉的限制。调度程序是纯调度程序,因为它不会监视或跟踪应用程序的状态。此外,由于应用程序故障或硬件故障,它无法保证重启失败的任务。调度器根据应用程序的资源需求执行其调度功能; 它是基于资源容器的抽象概念来实现的,容器包含内存,CPU,磁盘,网络等元素。
调度程序有一个可插拔策略,负责在各种队列,应用程序等之间对集群资源进行分区。当前调度程序(如CapacityScheduler和FairScheduler)将是插件的一些示例。
ApplicationsManager负责接受作业提交,协商执行特定于应用程序的ApplicationMaster的第一个容器,并提供失败时重新启动ApplicationMaster容器的服务。每个应用程序的ApplicationMaster负责从调度程序中协商适当的资源容器,跟踪其状态并监视进度。
hadoop-2.x中的MapReduce 与以前的稳定版本(hadoop-1.x)保持API兼容性。这意味着只需重新编译,所有MapReduce作业仍应在YARN之上保持不变。
YARN支持的概念,资源预留通过ReservationSystem,即允许用户在指定时间资源和时间的限制(例如,截止日期),以及后备资源的配置文件,以确保重要jobs.The可预见的执行组件ReservationSystem跟踪资源过时,对预留执行准入控制,并动态指示底层调度程序确保预留满员。
为了将YARN扩展到几千个节点之外,YARN 通过YARN Federation功能支持Federation的概念。Federation允许透明地将多个YARN(子)群集在一起,并使它们看起来像一个单一的大型群集。这可以用于实现更大规模,和/或允许将多个独立的群集一起用于非常大的工作,或者对于所有人都具有容量的租户。
Hadoop MapReduce是一个软件框架,用于轻松编写应用程序,以可靠的容错方式在大型群集(数千个节点)的大型商业硬件上并行处理大量数据(多TB数据集)。
MapReduce 作业通常将输入数据集分成独立的块,由地图任务以完全平行的方式进行处理。框架对映射的输出进行排序,然后输入到reduce任务。通常,作业的输入和输出都存储在文件系统中。该框架负责调度任务,监控它们并重新执行失败的任务。
通常,计算节点和存储节点是相同的,即MapReduce框架和Hadoop分布式文件系统(请参阅HDFS体系结构指南)在同一组节点上运行。该配置允许框架在数据已经存在的节点上有效地调度任务,从而在整个集群中产生非常高的聚合带宽。
MapReduce框架由单个主资源管理器,每个集群节点的一个从属NodeManager和每个应用程序的MRAppMaster组成(参见YARN体系结构指南)。
最小程度上,应用程序通过实现适当的接口和/或抽象类来指定输入/输出位置并提供映射和减少函数。这些和其他作业参数构成作业配置。
然后,Hadoop 作业客户端将作业(jar /可执行文件等)和配置提交给ResourceManager,然后负责将软件/配置分发给从服务器,安排任务并监控它们,向作业提供状态和诊断信息,客户。
尽管Hadoop框架是用Java™实现的,但MapReduce应用程序不需要用Java编写。
(input) -> map -> -> combine -> -> partition-> sort -> group -> reduce -> (output)
逐行得到元数据并进行拆分
可以提前对map节点中的部分数据进行排序和合并,但是必须保证他的inputkey和outputkey一致,inputvalue和outputvalue一致,combine可以用于减少reduce的压力。
可以根据自己的规则将数据均匀划分,分配给节点进行运算,默认是hash值%节点数。
可以根据自己的项目需求重写排序规则,当你的mapreduce不为简单数据时,你可以对他进行重写,已得到你想要的排序效果
将排序好的数据进行分组,提供给reduce进行计算,例如,你的key是a-b-c形式的数据,你想将ab相同的分为同一组递交给reduce,那么你可以在这里修改group的规则。
必须 implements WritableComparable
,实现write(写序列化)、readFields(度序列化)、compareTo(比较)