Apache Hadoop入门

时间:2022-04-25
本文章向大家介绍Apache Hadoop入门,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

介绍

本文要介绍的Apache Hadoop是一个使用简单高级编程模型实现的对大型数据集进行分布式存储和处理的软件框架。文章涵盖了Hadoop最重要的概念,对其架构的描述,并指导如何使用它,以及在Hadoop上编写和执行各种应用程序。

简而言之,Hadoop是Apache Software Foundation的开源项目,可以安装在一组标准机器上,以便这些机器可以通信并协同工作来存储和处理大型数据集。近年来,Hadoop已经非常成功,因为它有能力有效地处理大数据。它允许公司将其所有数据存储在一个系统中,并对这些数据执行分析,而这些在传统解决方案中要做到,则成本非常昂贵,甚至根本就无法做到。

围绕Hadoop构建的许多配套工具提供了各种各样的处理技术。通过辅助系统和实用程序的集成使得Hadoop非常出色,从而处理现实世界的问题更加轻松和高效,这些工具一起构成了Hadoop生态系统。

注意:通过标准机器,我们是指许多供应商可以使用的典型服务器,并且具有预期会失败的组件,并在常规基础上更换。 由于Hadoop可以很好地扩展并提供了许多容错机制,因此您不需要打破银行购买昂贵的顶级服务器,从而最大限度地降低硬件故障的风险,增加存储容量和处理能力。

设计概念

为了解决处理和存储大数据集的挑战,Hadoop是根据以下核心特点构建的:

分布式 - 而不是构建一个大型超级计算机,存储和处理分散在一组通信和共同工作的较小机器上。

水平可扩展性 - 通过添加新机器可以轻松扩展Hadoop集群。每台新机器增加了Hadoop集群的总体存储和处理能力。

容错 - 即使在几个硬件或软件组件无法正常工作时,Hadoop也能继续运行。成本优化 - Hadoop运行在标准硬件上;它不需要昂贵的服务器。

编程抽象 - Hadoop负责处理与分布式计算相关的所有杂乱的细节。感谢它的高级API,用户可以专注于实现业务逻辑,以解决其现实问题。

数据位置 - 不要将大型数据集移动到应用程序运行的位置,而是运行数据已经存在的应用程序。

Hadoop组件

Hadoop分为两个核心组件

HDFS - 分布式文件系统

YARN - 集群资源管理技术

热提示:许多执行框架运行在YARN之上,每个都针对特定用例进行调整。 最重要的是在下面的“YARN应用程序”中进行讨论。

我们来仔细看看他们的架构,并描述他们如何合作。

注意:YARN是替换Hadoop中前一个处理层实现的新框架。 您可以在Yahoo博客中找到YARN如何解决以前版本的缺点:https://developer.yahoo.com/blogs/hadoop/next-generation-apache-hadoop-mapreduce-3061.html。

HDFS

HDFS是一个Hadoop分布式文件系统。它可以安装在商业服务器上,并根据需要运行在尽可能多的服务器上 - HDFS可轻松扩展到数千个节点和PB级数据。

较大的HDFS设置是,某些磁盘,服务器或网络交换机将失败的可能性越大。通过在多台服务器上复制数据,HDFS能够幸存这些类型的故障。 HDFS会自动检测给定的组件是否失败,并采取必要的恢复操作,这些操作对用户来说是透明的。

HDFS设计用于存储数百兆字节或千兆字节的大型文件,并为其提供高吞吐量的流数据访问。最后但并非最不重要的一点是,HDFS支持一次写多次读的模式。对于这个用例,HDFS就很具有魅力。但是,如果您需要存储大量具有随机读写访问权限的小文件,那么像RDBMS和Apache HBase这样的其他系统可以做得更好。

注意:HDFS不允许您修改文件的内容。仅支持在文件末尾附加数据。然而,Hadoop设计使用HDFS作为许多可插拔存储选项之一 - 例如,使用专有文件系统的MapR-Fs,文件是完全读写的。其他HDFS替代方案包括Amazon S3和IBM GPFS。

HDFS架构

HDFS包含了在所选群集节点上安装并运行的以下守护程序:

NameNode - 负责管理文件系统命名空间(文件名,权限和所有权,最后修改日期等)的主进程,并控制对存储在HDFS中的数据的访问。 这是一个完整的分布式文件系统概述的地方。 如果NameNode关闭,您将无法访问您的数据。 如果您的命名空间永久丢失,您基本上丢失了所有的数据!

DataNodes - 处理存储和提供数据的从属进程。 DataNode安装在群集中的每个工作节点上。

图1说明了HDFS在4节点集群上的安装。 其中一个节点承载NameNode守护进程,而另外三个运行DataNode守护程序。

注意:NameNode和DataNode是运行在Linux发行版上的Java进程,如RedHat,Centos,Ubuntu等等。 他们使用本地磁盘来存储HDFS数据。

HDFS将每个文件分解成一个较小但仍然较大的块(默认块大小等于128MB),更大的块意味着更少的磁盘搜索操作,这导致大的吞吐量)。 每个块都冗余地存储在多个DataNodes上以实现容错。 该块本身不知道它属于哪个文件 - 该信息仅由具有HDFS中所有目录,文件和块的全局镜像的NameNode维护。

图2说明了将文件分割成块的概念。 文件X被分成块B1和B2,文件Y仅包含一个块B3。 所有块在集群内复制2次。 如前所述,由DataNode保存原始数据时由NameNode保留组成文件的块的信息。

与HDFS进行交互

HDFS提供了一个简单的类似POSIX的UI来处理数据。 使用hdfs dfs命令执行文件系统操作。

热提示:要开始玩Hadoop,你不必经历一个设置整个集群的过程。 Hadoop可以在单个机器上运行所谓的伪分布式模式。 您可以下载所有HDFS组件的沙箱虚拟机,并随时开始使用Hadoop! 只需按照以下链接之一:

http://www.mapr.com/products/mapr-sandbox-hadoop

http://hortonworks.com/products/hortonworks-sandbox/#install

http://www.cloudera.com/downloads/quickstart_vms/5-7.html

以下步骤说明HDFS用户可以执行的典型操作:

列出主目录的内容

$ hdfs dfs -ls / user / adam

将文件从本地文件系统上传到HDFS

$ hdfs dfs -put songs.txt / user / adam

从HDFS读取文件的内容

$ hdfs dfs -cat /user/adam/songs.txt

更改文件的权限

$ hdfs dfs -chmod 700 /user/adam/songs.txt

将文件的复制模式设置为4

$ hdfs dfs -setrep -w 4 /user/adam/songs.txt

检查文件的大小

$ hdfs dfs -du -h /user/adam/songs.txt

将文件移动到新创建的子目录

$ hdfs dfs -mv songs.txt songs/

从HDFS中删除目录

$ hdfs dfs -rm -r songs

热提示:您可以键入hdfs dfs而不用任何参数来获取可用命令的完整列表

YARN

YARN是一个管理集群资源的框架,可以运行各种分布式应用程序来处理HDFS上存储的数据。

YARN与HDFS类似,遵循主从设计,具有单个ResourceManager守护程序和多个NodeManagers守护程序。这些类型的守护进程具有不同的责任。

ResourceManager

跟踪主NodeManager和他们当前拥有的可用计算资源的数量

将可用资源分配给客户提交的应用程序

监控应用程序是否完成

NodeManagers

以容器的形式提供计算资源

在容器内运行各种应用程序的任务

YARN以表示资源元素(如内存和CPU)组合的资源容器的形式将集群资源分配给各种应用程序。

在YARN集群上执行的每个应用程序都有自己的ApplicationMaster进程。当应用程序安排在集群上并协调执行此应用程序中的所有任务时,将启动此进程。

每个任务在由所选的NodeManager管理的容器内运行。 ApplicationMaster与ResourceManager协商资源(以容器的形式)。在成功协商之后,ResourceManager会向ApplicationMaster提供容器规范。然后将此规范移交给启动容器并执行其中任务的NodeManager。

图3示出了YARN守护程序在运行共计7个任务的两个应用程序的4节点集群上的合作。

Hadoop 2.0 = HDFS + YARN

在同一集群上运行的HDFS和YARN守护程序为我们提供了一个强大的存储和处理大型数据集的平台。

有趣的是,DataNode和NodeManager进程被并置在同一个节点上,以实现Hadoop的最大优点之一,称为数据本地化。 数据本地化允许我们在实际存储数据的机器上执行计算,从而最大限度地减少通过网络发送大量数据的必要性。 称为“向数据发送计算”的这种技术在处理大数据时会导致显着的性能提升。

图4:Hadoop集群上的HDFS和YARN守护程序布置。

YARN应用

YARN只是一个资源管理器,它知道如何将分布式计算资源分配给在Hadoop集群上运行的各种应用程序。换句话说,YARN本身不提供可以分析HDFS中的数据的任何处理逻辑。因此,各种处理框架必须与YARN(通过提供ApplicationMaster的特定实现)集成在Hadoop集群上运行并在HDFS中处理数据。

MapReduce用于将计算表达为一系列Map和Reduce任务的Hadoop最流行的处理框架。 MapReduce在下一节中进行了说明.

Apache Spark是一个用于大规模数据处理的快速通用引擎,通过大量缓存内存中的数据来优化计算.

Apache Tez将MapReduce范例概括为一个更强大,更快的框架,可以执行计算作为复杂的有向无环的一般数据处理的任务图.

Apache Giraph是一个大数据的迭代图处理框架.Apache Storm是一个实时流处理引擎.

MapReduce

MapReduce是一种可以实现并行分布式算法的编程模型。 要在此范例中定义计算,您可以为两个函数提供逻辑:map()和reduce(),它们在<key,value>对上运行。

Map函数采用<key,value>对,并产生零个或多个中间值<key,value> pa

Map(k1, v1) -> list(k2, v2)

Reduce功能将获取与此键相关联的值和列表,并生成零个或多个最终<key,value>对:

 Reduce(k2, list(v2)) -> list(k3, v3)

在Map和Reduce函数之间,Map函数生成的所有中间的<key,value>对都被按顺序排列,并将所有与相同键相关联的值分组在一起并传递给相同的Reduce函数。

Map功能的一般目的是转换或过滤输入数据。 另一方面,Reduce功能通常聚合或汇总由Map功能产生的数据。

图6显示了使用MapReduce计算句子中不同单词出现频率的示例。 Map函数分割句子并产生中间的<key,value>对,其中一个键是单词,一个值等于1.然后,reduce函数将所有与给定单词相关联的所有单词相加,返回该单词的总出现次数。

YARN上的MapReduce

YARN上的MapReduce是一个框架,可以在由YARN提供的Hadoop集群上运行MapReduce作业。它提供了一个高级API,用于实现各种语言的定制Map和Reduce功能,以及提交,运行和监视MapReduce作业所需的代码基础架构。

注意:MapReduce曾经是唯一可以与Hadoop一起使用的编程模型。引入YARN后不再是这样了。不过,MapReduce仍然是运行在YARN群集上的最受欢迎的应用程序。

每个MapReduce作业的执行由称为MapReduce ApplicationMaster(MR AM)的特殊进程的实例进行管理和协调。 MR AM生成运行map()函数的Map任务,并减少运行reduce()函数的任务。每个Map任务处理输入数据集的单独子集(默认情况下HDFS中的一个块)。每个Reduce任务处理由Map任务生成的中间数据的单独子集。此外,Map和Reduce任务彼此隔离运行,这允许并行和容错的计算。

为了优化计算,MR AM尝试安排数据本地化的Map任务。这些任务在运行在NodeManager上的容器中执行,该容器与已存储要处理数据的DataNodes上一同布置。因为默认情况下,HDFS中的每个块都冗余地存储在三个DataNode上,所以有三个NodeManager可以被要求在本地运行给定的Map任务。

提交MapReduce作业

让我们看看MapReduce实践,并在Hadoop集群上运行MapReduce作业。

要快速入门,我们使用带有Hadoop包提供的MapReduce示例的jar文件。 在Linux系统上可以找到

/usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar

我们运行上一节中介绍的Word Count作业。

  1. 创建一个名为hamlet.txt的文件,该文件具有以下内容:
  2. To be or not to be
  3. 上传HDFS上的输入数据
  4. # hdfs dfs -mkdir input
  5. 将WordCount MapReduce作业提交到集群:
  6. # hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar wordcount input hamlet-output

成功提交后,在ResourceManager Web UI上跟踪此作业的进度。

热提示:如果您使用沙箱,则可以使用ResourceManager UI

7.在HDFS中检查此作业的输出

8. # hadoop fs -cat hamlet-output/*

除了Word Count作业外,该jar文件还包含几个其他的MapReduce示例。 您可以通过键入以下命令列出它们:

# hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar

处理框架

在原生的MapReduce中开发应用程序对程序员可能是一个耗时的艰巨工作。

幸运的是,有许多框架使Hadoop集群中的分布式计算的实现过程更加方便快捷,即使对于非开发人员也是如此。 最受欢迎的是Hive和Pig。

Hive

Hive提供了一个类似SQL的语言,称为HiveQL,用于更容易地分析Hadoop集群中的数据。 当使用Hive时,我们在HDFS中的数据集表示为具有行和列的表。 因此,Hive易于学习和吸引人使用,为那些已经知道SQL并具有使用关系数据库的经验的人使用。

有了这个说法,Hive可以被认为是构建在Hadoop之上的数据仓库基础架构。

将Hive查询转换为随后在Hadoop集群上执行的一系列MapReduce作业(或Tez定向非循环图)。

Hive实例

我们来处理一个关于用户在给定时间听的歌曲的数据集。 输入数据由一个Tab分隔符的文件songs.txt组成:

我们使用Hive找到在2014年7月最受欢迎的两位艺术家:

注意:我们假设下面的命令是作为用户“training”执行的。

将songs.txt文件放在HDFS上:

输入Hive

在Hive中创建外部表,为HDFS上的数据提供模式

检查表是否已成功创建:

您还可以看到表的属性和列:

除了有关列名和类型的信息,您还可以看到其他有趣的属性:

运行查找在2014年7月最受欢迎的两个艺术家:

此查询被翻译成两个MapReduce作业。 通过读取Hive客户端生成的标准输出日志消息或通过使用ResourceManager Web UI跟踪在Hadoop集群上执行的作业进行验证。

注意:在撰写本文时,MapReduce是Hive的默认执行引擎。 它可能会在将来改变。 有关如何为Hive设置其他执行引擎的说明,请参阅下一节。

TEZ

Hive不限于将查询转换为MapReduce作业。 您还可以指示Hive使用其他分布式框架(如Apache Tez)来表达其查询。

Tez是一个高效执行以DAG(有向无环图)形式存在的任务的计算框架。 使用Tez,复杂的Hive查询可以表示为单个Tez DAG,而不是多个MapReduce作业。 这样我们不会引入启动多个作业的开销,并避免在HDFS上的任务之间存储数据的成本,这样可以节省I/O。

为了受益于Tez的快速响应时间,只需覆盖hive.execution.engine属性并将其设置为tez。

按照以下步骤从上一节执行Hive查询作为Tez应用程序:

输入Hive

将执行引擎设置为tez:

从Hive部分执行查询:

注意:现在,您可以看到在控制台上显示的不同日志在MapReduce上执行查询时:

该查询现在只执行一个Tez作业,而不是像以前一样执行两个MapReduce作业。 Tez不受严格的MapReduce模型的限制 - 它可以在单个作业中执行任务序列,例如Reduce任务之后再Reduce任务,带来显着的性能优势。

热提示:在博客上了解更多关于Tez的信息:http://hortonworks.com/blog/apache-tez-a-new-chapter-in-hadoop-data-processing。

Pig

Apache Pig是Hadoop大规模计算的另一个流行框架。 与Hive类似,Pig允许您以比使用MapReduce更简单,更快速,更简单的方式实现计算。 Pig引入了一种简单而强大的类似脚本的语言PigLatin。 PigLatin支持许多常见和即用的数据操作,如过滤,聚合,排序和Join。 开发人员还可以实现扩展Pig核心功能的自己的功能(UDF)。

像Hive查询一样,Pig脚本被转换为调度在Hadoop集群上运行的MapReduce作业。

我们使用Pig找到最受欢迎的艺术家,就像我们在前面的例子中与Hive一样。

在top-artists.pig文件中保存以下脚本

在Hadoop集群上执行Pig脚本:

阅读输出目录的内容:

热提示:在开发Pig脚本时,您可以在本地模式下迭代,并在将作业提交到群集之前捕获错误。 启用本地模式add -x本地选项到pig命令。

概要

由于Apache Hadoop具有诸如高级API,可扩展性,在商品硬件上运行的能力以及容错和开放源码等功能的强大功能,因此Apache Hadoop是最受欢迎的大数据处理工具之一。 Hadoop已经被许多公司成功部署在生产中了好几年了。

Hadoop生态系统提供各种开源工具,用于收集,存储和处理数据,以及集群部署,监控和数据安全。 由于这个惊人的工具生态系统,每个公司现在可以轻松,相对便宜地以分布式和高度可扩展的方式存储和处理大量数据。

Hadoop生态系统

OozieWorkflow调度程序系统用来管理Hadoop的jobs.ZookeeperFramework,实现高度可靠的分布式协调.

SoCoopTool可以在Hadoop和结构化数据存储(如关系数据库)之间高效传输批量数据.

FlumeService用于聚合,收集和移动大量日志数据.

HbaseNon-relational运行在HDFS之上的分布式数据, 它可以对大数据进行随机实时读/写访问。

其他资源

http://hadoop.apache.org/

https://hive.apache.org/

http://pig.apache.org/

http://giraph.apache.org/

https://mahout.apache.org/

http://tez.apache.org/

https://spark.apache.org/

https://storm.incubator.apache.org/

主要分发包:

Cloudera:http://www.cloudera.com/content/cloudera/en/products-and- services/cdh.html

MapR:https://www.mapr.com/products/mapr-editions

Hortonworks:http://hortonworks.com/hadoop/