本文目录
► 简介
► 设计概念
► Hadoop的组件
► HDFS
► YARN
► YARN应用
► 监控YARN应用程序
► 处理Hadoop上的数据
► 来自Hadoop生态系统的其他工具
简介
Apache Hadoop是目前最流行的软件框架,可使用简单的高级编程模型实现大型数据集的分布式存储和处理。我们将介绍Hadoop最重要的概念,描述其架构,指导您如何开始使用它以及在Hadoop上编写和执行各种应用程序。
简而言之,Hadoop是Apache Software Foundation的一个开源项目,可以安装在服务器集群上,以便这些服务器可以通信并协同工作来存储和处理大型数据集。Hadoop近年来因其有效处理大数据的能力而变得非常成功。它允许公司将所有数据存储在一个系统中,并对这些数据进行分析,否则传统解决方案不可能或非常昂贵。
围绕Hadoop构建的许多配套工具提供了各种各样的处理技术。与辅助系统和实用程序的集成非常出色,使Hadoop的实际工作更轻松,更高效。这些工具共同构成了Hadoop生态系统。
您可以将Hadoop视为大数据操作系统,从而可以在所有庞大的数据集上运行不同类型的工作负载。其范围从离线批处理到机器学习再到实时流处理。
热门提示:访问http://hadoop.apache.org以获取有关项目的更多信息并访问详细文档。
要安装Hadoop,您可以从http://hadoop.apache.org获取代码或(更推荐)使用其中一个Hadoop发行版。三种最广泛使用的来自Cloudera(CDH),Hortonworks(HDP)和MapR。Hadoop发布是Hadoop生态系统捆绑在一起的一组工具,由相应的供应商提供保证,可以很好地协同工作。此外,每个供应商都提供工具(开源或专有)来供应,管理和监控整个平台。
设计概念
为了解决处理和存储大型数据集的挑战,Hadoop是根据以下核心特征构建的:
· 分布 - 存储和处理不是构建一台大型超级计算机,而是分布在一组通信和协同工作的小型机器上。
· 横向可扩展性 - 只需添加新计算机即可轻松扩展Hadoop集群。每台新机器都会按比例增加Hadoop集群的总存储和处理能力。
· 容错 - 即使少数硬件或软件组件无法正常工作,Hadoop仍可继续运行。
· 成本优化 - Hadoop不需要昂贵的高端服务器,无需商业许可即可正常工作。
· 编程抽象 - Hadoop负责处理与分布式计算相关的所有混乱细节。借助高级API,用户可以专注于实现解决现实问题的业务逻辑。
· 数据位置 - Hadoop不会将大型数据集移动到运行应用程序的位置,而是运行数据已经存在的应用程序。
Hadoop组件
Hadoop分为两个核心组件:
· HDFS - 分布式文件系统。
· YARN - 集群资源管理技术。
热门提示:许多执行框架在YARN之上运行,每个框架都针对特定用例进行了调整。最重要的内容将在下面的“YARN Applications”中讨论。
让我们仔细看看他们的架构并描述他们如何合作。
HDFS
HDFS是一个Hadoop分布式文件系统。它可以在您需要的任意数量的服务器上运行 - HDFS可以轻松扩展到数千个节点和数PB的数据。
HDFS设置越大,某些磁盘,服务器或网络交换机出现故障的概率就越大。HDFS通过在多个服务器上复制数据来幸免于这些类型的故障。HDFS自动检测给定组件是否已发生故障,并采取对用户透明发生的必要恢复操作。
HDFS设计用于存储数百兆字节或千兆字节的大型文件,并为它们提供高吞吐量的流数据访问。最后但同样重要的是,HDFS支持一次写入多次读取模型。对于这个用例,HDFS就像一个魅力。但是,如果您需要存储大量具有随机读写访问权限的小文件,那么其他系统(如RDBMS和Apache HBase)可以做得更好。
注意:HDFS不允许您修改文件的内容。只支持在文件末尾附加数据。但是,Hadoop设计的HDFS是众多可插拔存储选项之一 - 例如,使用专有文件系统MapR-F,文件完全可读写。其他HDFS替代品包括Amazon S3,Google Cloud Storage和IBM GPFS。
HDFS的体系结构
HDFS由在选定群集节点上安装和运行的以下守护程序组成:
· NameNode - 负责管理文件系统命名空间(文件名,权限和所有权,最后修改日期等)以及控制对存储在HDFS中的数据的访问的主进程。如果NameNode已关闭,则无法访问您的数据。幸运的是,您可以配置多个NameNode,以确保此关键HDFS进程的高可用性。
· DataNodes - 安装在集群中每个工作节点上的从属进程,负责存储和提供数据。
图1说明了在4节点集群上安装HDFS。其中一个节点托管NameNode守护程序,而其他三个运行DataNode守护程序。
图1
注意:NameNode和DataNode是在Linux发行版之上运行的Java进程,例如RedHat,Centos,Ubuntu等。他们使用本地磁盘存储HDFS数据。
HDFS将每个文件拆分为一系列较小但仍然很大的块(默认块大小等于128MB - 较大的块意味着更少的磁盘搜索操作,从而导致更大的吞吐量)。每个块都冗余地存储在三个DataNode上以实现容错(每个文件的副本数量是可配置的)。
图2说明了将文件拆分为块的概念。文件X被分成块B1和B2,文件Y仅包括一个块B3。所有块都在群集中复制两次。
图2
与HDFS交互
HDFS提供了一个简单的POSIX类接口来处理数据。您使用hdfs dfs命令执行文件系统操作。
热门提示:要开始使用Hadoop,您不必完成设置整个群集的过程。Hadoop可以在一台机器上以所谓的伪分布式模式运行。您可以下载已安装所有HDFS组件的沙盒虚拟机,并立即开始使用Hadoop!只需按照以下链接之一:
以下步骤说明了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上没有“当前”目录的概念(换句话说,没有相当于“cd”命令):
$ hdfs dfs -mkdir songs
将文件移动到新创建的子目录:
$ hdfs dfs -mv songs.txt songs/
从HDFS中删除目录:
$ hdfs dfs -rm -r songs
注意:已删除的文件和目录将移至废纸篓(HDFS上主目录的.Trash)并保留一天,直到它们被永久删除。您只需将它们从.Trash复制或移动到原始位置即可恢复它们。
热门提示:您可以在不使用任何参数的情况下键入hdfs dfs以获取可用命令的完整列表。
如果您更喜欢使用图形界面与HDFS交互,您可以查看免费和开源的HUE(Hadoop用户体验)。它包含一个方便的“文件浏览器”组件,允许您浏览HDFS文件和目录并执行基本操作。
您还可以使用HUE通过“上传”按钮直接从计算机将文件上传到HDFS。
YARN
YARN(Yet Another Resource Negotiator)负责管理Hadoop集群上的资源,并支持运行处理存储在HDFS上的数据的各种分布式应用程序。
与HDFS类似,YARN遵循主从设计,ResourceManager进程充当主节点,多个NodeManager充当工作者。他们有以下责任:
ResourceManager
· 跟踪实时NodeManagers以及群集中每台服务器上的可用计算资源量。
· 为应用程序分配可用资源。
· 监视Hadoop集群上所有应用程序的执行情况。
节点管理器
· 管理Hadoop集群中单个节点上的计算资源(RAM和CPU)。
· 运行各种应用程序的任务,并强制它们在指定的计算资源的限制范围内。
YARN以资源容器的形式将集群资源分配给各种应用程序,资源容器表示RAM量和CPU核心数量的组合。
在YARN群集上执行的每个应用程序都有自己的ApplicationMaster进程。在群集上调度应用程序并协调此应用程序中所有任务的执行时,此过程开始。
图3显示了YARN守护程序在运行两个应用程序的4节点集群上的合作,这些应用程序总共产生了7个任务。
图3
Hadoop = HDFS + YARN
在同一群集上运行的HDFS和YARN守护程序为我们提供了一个用于存储和处理大型数据集的强大平台。
DataNode和NodeManager进程在同一节点上并置以启用数据位置。这种设计使得能够在存储数据的机器上执行计算,从而最小化通过网络发送大块数据的必要性,这导致更快的执行时间。
图3
YARN的应用
YARN只是一个资源管理器,它知道如何将分布式计算资源分配给在Hadoop集群上运行的各种应用程序。换句话说,YARN本身不提供任何可以分析HDFS中数据的处理逻辑。因此,必须将各种处理框架与YARN集成(通过提供ApplicationMaster的特定实现)以在Hadoop集群上运行并处理来自HDFS的数据。
下面列出了最流行的分布式计算框架的简短描述,这些框架可以在由YARN支持的Hadoop集群上运行。· MapReduce - Hadoop的传统和最古老的处理框架,将计算表示为一系列map和reduce任务。它目前正被Spark或Flink等更快的引擎所取代。
· Apache Spark - 一种用于大规模数据处理的快速通用引擎,可通过在内存中缓存数据来优化计算(后面部分将详细介绍)。
· Apache Flink - 高吞吐量,低延迟的批处理和流处理引擎。它以其强大的实时处理大数据流的能力而着称。您可以在这篇全面的文章中找到Spark和Flink之间的差异:https://dzone.com/articles/apache-hadoop-vs-apache-spark
· Apache Tez - 一个旨在加快Hive执行SQL查询的引擎。它可以在Hortonworks数据平台上使用,它将MapReduce替换为Hive的执行引擎。
监控YARN应用程序
可以使用ResourceManager WebUI跟踪在Hadoop集群上运行的所有应用程序的执行,默认情况下,该管理程序在端口8088上公开。
对于每个应用程序,您都可以阅读一些重要信息。
如果单击“ID”列中的条目,您将获得有关所选应用程序执行的更详细的指标和统计信息。
热门提示:使用ResourceManager WebUI,您可以检查可用于处理的RAM总量和CPU核心数以及当前的Hadoop集群负载。查看页面顶部的“群集指标”。
处理Hadoop上的数据
有许多框架可以轻松实现在Hadoop上实现分布式应用程序的过程。在本节中,我们将重点介绍最受欢迎的:Hive和Spark。
Hive
Hive可以使用熟悉的SQL方言处理HDFS上的数据。
使用Hive时,我们在HDFS中的数据集表示为具有行和列的表。因此,Hive易于学习,并且对于那些已经熟悉SQL且具有使用关系数据库经验的人来说很有吸引力。
Hive不是一个独立的执行引擎。每个Hive查询都转换为MapReduce,Tez或Spark(正在进行中)中的代码,随后在Hadoop集群上执行。
Hive示例
让我们处理一个关于用户在给定时间收听的歌曲的数据集。输入数据由一个名为songs.tsv的制表符分隔文件组成:
"Creep" Radiohead piotr 2017-07-20
"Desert Rose" Sting adam 2017-07-14
"Desert Rose" Sting piotr 2017-06-10
"Karma Police" Radiohead adam 2017-07-23
"Everybody" Madonna piotr 2017-07-01
"Stupid Car" Radiohead adam 2017-07-18
"All This Time" Sting adam 2017-07-13
我们使用Hive在2017年7月找到两位最受欢迎的艺术家。
上传HDFS上的songs.txt文件。您可以在HUE中的“文件浏览器”的帮助下执行此操作,或使用命令行工具键入以下命令:
# hdfs dfs -mkdir /user/training/songs
# hdfs dfs -put songs.txt /user/training/songs
使用Beeline客户端输入Hive。您必须为HiveServer2提供一个地址,这是一个使远程客户端(如Beeline)能够执行Hive查询和检索结果的过程。
# beeline
beeline> !connect jdbc:hive2://localhost:10000 training passwd
在Hive中创建一个指向HDFS数据的表(请注意,我们需要指定文件的正确分隔符和位置,以便Hive可以将原始数据表示为表):
beeline> CREATE TABLE songs(
title STRING,
artist STRING,
user STRING,
date DATE
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY 't\'
LOCATION '/user/training/songs';
热门提示:在使用Beeline启动会话后,您创建的所有表都将在“默认”数据库下。您可以通过提供特定的数据库名称作为表名的前缀或通过键入“use ;”命令来更改它。
检查表是否已成功创建: beeline\> SHOW tables;
2017年7月运行一个查找两位最受欢迎艺术家的查询:
SELECT artist, COUNT(\*) AS total
FROM songs
WHERE year(date) = 2017 AND month(date) = 7
GROUP BY artist
ORDER BY total DESC
LIMIT 2;
您可以使用ResourceManager WebUI监视查询的执行情况。根据您的配置,您将看到MapReduce作业或群集上运行的Spark应用程序。
注意:您还可以从HUE编写和执行Hive查询。有一个专门用于Hive的查询编辑器,具有语法自动完成和着色等便捷功能,保存查询的选项以及以线条,条形图或饼图形式显示结果的基本可视化。
spark
Apache Spark是一种通用的分布式计算框架。它与Hadoop生态系统完美集成,可以在YARN上轻松运行Spark应用程序。
与传统的Hadoop计算范例MapReduce相比,Spark提供了出色的性能,易用性和多功能性,可满足不同的数据处理需求。
Spark的速度主要来自于它能够在后续执行步骤和执行计划和数据序列化中的优化之间将数据存储在RAM中。
让我们直接跳到代码中来体验Spark。我们可以选择Scala,Java,Python,SQL或R API。我们的例子是Python。要启动Spark Python shell(称为pyspark),请键入\# pyspark。
过了一会儿,你会看到一个Spark提示符。这意味着在YARN上启动了Spark应用程序(您可以转到ResourceManager WebUI进行确认;查找名为“PySparkShell”的正在运行的应用程序)。
热门提示:如果您不喜欢使用shell,您应该查看基于Web的笔记本,例如Jupyter(https://jupyter.org)或Zeppelin(https://zeppelin.apache.org)。
作为使用Spark的Python数据帧API的一个例子,我们实现了与Hive相同的逻辑,例如在2017年7月找到两位最受欢迎的艺术家。
首先,我们必须阅读我们的数据集。Spark可以直接从Hive表中读取数据:# songs = spark.table("songs")
Spark中具有模式的数据表示为所谓的数据帧。数据帧是不可变的,通过从不同的源系统读取数据或通过在其他数据帧上应用转换来创建。
要预览任何数据帧的内容,请调用以下show()方法:
# songs.show()
+-------------+---------+-----+----------+
| title| artist| user| date|
+-------------+---------+-----+----------+
| Creep|Radiohead|piotr|2017-07-20|
| Desert Rose| Sting| adam|2017-07-14|
| Desert Rose| Sting|piotr|2017-06-10|
| Karma Police|Radiohead| adam|2017-07-23|
| Everybody| Madonna|piotr|2017-07-01|
| Stupid Car|Radiohead| adam|2017-07-18|
|All This Time| Sting| adam|2017-07-13|
+-------------+---------+-----+----------+
为了达到预期的效果,我们需要使用一些链接在一起的直观函数:
# from pyspark.sql.functions import desc
# songs.filter(\"year(date) = 2017 AND month(date) = 7\")
.groupBy(\"artist\")
.count()
.sort(desc(\"count\"))
.limit(2)
.show()
Spark的数据帧转换看起来与SQL运算符类似,因此它们非常易于使用和理解。
热门提示:如果在同一数据帧上执行多次转换(例如,当您浏览新数据集时),您可以通过调用数据帧上的cache()方法(例如songs.cache())告诉spark将其缓存在内存中。然后,Spark会将您的数据保存在RAM中,避免在运行后续查询时碰到磁盘,从而为您提供更高性能的数量级。
数据帧只是Spark中可用的API之一。还有用于近实时处理(Spark Streaming),机器学习(MLlib)或图形处理(GraphFrames)的API和库。
由于Spark的多功能性,您可以使用它来解决各种处理需求,保持在相同的框架内并在不同的上下文之间共享代码片段(例如批处理和流式处理)。
Spark可以直接从许多不同的数据存储中读取和写入数据,而不仅仅是HDFS。您可以轻松地从MySQL或Oracle中的表中的记录,HBase中的行,本地磁盘上的JSON文件,ElasticSearch中的索引数据以及许多其他内容创建数据帧。
来自Hadoop生态系统的其他工具
Hadoop生态系统包含许多不同的工具来完成现代大数据平台所需的特定任务。下面,您可以看到前面部分未涉及的热门和重要项目列表。
Sqoop - 从关系数据存储和HDFS / Hive批量移动数据的必不可少的工具,反之亦然。您可以使用命令行与Sqoop进行交互,选择所需的操作并提供一组控制数据移动过程的必要参数。从MySQL表导入有关用户的数据就像输入以下命令一样简单:
# sqoop import \
--connect jdbc:mysql://localhost/streamrock \
--username $(whoami) -P \
--table users \
--hive-import
注意:Sqoop使用MapReduce在关系数据存储区和Hadoop之间来回传输数据。您可以在ResourceManager WebUI中跟踪Sqoop提交的MapReduce应用程序。
Oozie - Hadoop的协调和编排服务。使用Oozie,您可以构建要在Hadoop集群上执行的不同操作的工作流(例如HDFS命令,Spark应用程序,Hive查询,Sqoop导入等),然后安排工作流以自动执行。
HBase - 建立在HDFS之上的NoSQL数据库。它可以使用行键快速随机读取和写入单个记录。
Zookeeper - Hadoop的分布式同步和配置管理服务。许多Hadoop服务利用Zookeeper在分布式环境中正确有效地工作。