Hadoop

Hadoop

介绍

Apache™ Hadoop®项目为可靠、可扩展的分布式计算开发开源软件。

Apache Hadoop软件库是一个框架,允许使用简单的编程模型跨计算机集群对大型数据集进行分布式处理。它旨在从单个服务器扩展到数千台机器,每台机器都提供本地计算和存储。库本身不是依靠硬件来提供高可用性,而是旨在检测和处理应用程序层的故障,因此在计算机群集之上提供高可用性服务,每个计算机群集都可能容易出现故障。

发展历史

1、Hadoop最早起源于lucene下的Nutch。Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。 2、2003年、2004年谷歌发表的三篇论文为该问题提供了可行的解决方案。 ——分布式文件系统(GFS),可用于处理海量网页的存储(HDFS) ——分布式计算框架(MAPREDUCE),可用于处理海量网页的索引计算问题(MapReduce) ——分布式的结构化数据存储系统(Bigtable),用来处理海量结构化数据(HBase) 3、Doug Cutting基于这三篇论文完成了相应的开源实现HDFS和MAPREDUCE,并从Nutch中剥离成为独立项目HADOOP,到2008年1月,HADOOP成为Apache顶级项目(同年,cloudera公司成立),迎来了它的快速发展期。

为什么叫Hadoop Logo为什么是黄色的大象? Hadoop 狭义上来说,Hadoop就是单独指代Hadoop这个软件(HDFS+MAPREDUCE) 广义上来说,Hadoop指代大数据的一个生态圈(Hadoop生态圈)

生态系统

该项目包括以下模块:

Apache的其他Hadoop相关项目包括:

hadoop_architecture

核心组件

Yarn

部署于集群所有节点,计算资源管理和任务调度

yarn_architecture

yarn-architecture Yarn基本架构↑

yarn_submit_yarn 作业提交过程之YARN↑

yarn_submit_mapreduce 作业提交过程之MapReduce↑

yarn_submit

MapReduce

部署于集群所有节点,分布式计算框架,基于磁盘的计算

mapreduce-architecture MapReduce核心↑

mapreduce-process-1 MapReduce详细工作流程(一)↑

mapreduce-process-2 MapReduce详细工作流程(二)↑

mapreduce-shuffle Map方法之后,Reduce方法之前的数据处理过程称之为Shuffle↑ Shuffle机制将map端的无规则输出按指定的规则“打乱”成具有一定规则的数据,以便reduce端接收处理。

HDFS

部署于集群所有节点,分布式文件系统,提供接口

hdfsarchitecture HDFS组成架构↑

hdfs_read HDFS读数据流程↑

hdfs_write HDFS写数据流程↑

重要组件

SQL on Hadoop: Hive/impala/presto

Impala

Impala Impala 提高了 Apache Hadoop 上 SQL 查询性能的标准,同时保留了熟悉的用户体验。使用 Impala,您可以实时查询数据,无论是存储在 HDFS 还是 Apache HBase 中,包括 SELECT、JOIN 和聚合函数。此外,Impala 使用与 Apache Hive 相同的元数据、SQL 语法 (Hive SQL)、ODBC 驱动程序和用户界面 (Hue Beeswax),为面向批处理或实时查询提供了一个熟悉且统一的平台。(出于这个原因,Hive 用户可以在很少的设置开销下使用 Impala。

为了避免延迟,Impala 绕过 MapReduce,通过专门的分布式查询引擎直接访问数据,该引擎与商业并行 RDBMS 中的非常相似。结果是性能比 Hive 快几个数量级,具体取决于查询和配置的类型。

impala_engine

与查询 Hadoop 数据的替代方法相比,此方法有许多优点,包括:

组件

HIVE

HIVE 单节点,读取、写入和管理位于分布式存储中的大型数据集、使用 SQL 语法进行查询

Hbase

Hbase 集群所有节点,让HDFS拥有海量数据下秒级进行增删改查的能力,列数据库存储 参考: 官方文档中文版, 本地版本

hbase_architecture

Zookeeper

Zookeeper 集群,至少3个,存储各组件的元信息:配置信息、命名、分布式信息的同步

Kudu

kudu 分布式列式数据存储引擎,同时提供低延时的随机读写和高效的数据分析能力,融合HDFS和Hbase的功能

下图显示了一个 Kudu 集群,其中包含三个 master 和多个 tablet 服务器,每个 tablet 服务器服务于多个 tablet。它说明了如何使用 Raft 共识来允许主服务器和平板服务器的领导者和追随者。此外,tablet server 可以是某些 tablets 的领导者,以及其他 tablet 的追随者。领导者以金色显示,而追随者以蓝色显示。 Kudu

其他组件

Flume

分布式日志采集/聚会/传输系统

Storm

内存计算框架,流式处理,数据从网络导入内存,省去了批处理从HDFS读取数据的过程

Sqoop

数据同步工具,在Hadoop(Hive)与关系型数据库之间进行数据传递

Livy

Apache Livy是一项服务,可以通过REST接口与Spark集群轻松交互。它使 提交 Spark 作业或 Spark 代码片段、同步或异步结果检索以及 Spark 上下文管理,全部通过简单的 REST 接口或 RPC 客户端库进行。Apache Livy还简化了 Spark和应用程序服务器之间的交互,从而允许将Spark用于交互式Web/移动 应用。其他功能包括:

livy-architecture

Knox

Apache Knox™ Gateway 是一个应用程序网关,用于与 Apache Hadoop 部署的 REST API 和 UI 进行交互。 Knox 网关为与 Apache Hadoop集群的所有 REST 和 HTTP 交互提供单一访问点。

Knox 提供三组面向用户的服务:

knox-services

Hadoop常用命令

IMPALA

高级

调优

KUDU

HDFS

集群状态

文件操作

其他

其中各个参数的含义如下:

YARN

yarn application

-appStates <States>: 配合-list命令使用,基于应用程序的状态来过滤应用程序。如果应用程序的状态有多个,用逗号分隔。 有效的应用程序状态包含: ALL, NEW, NEW_SAVING, SUBMITTED, ACCEPTED, RUNNING, FINISHED, FAILED, KILLED -appTypes <Types>: 配合-list命令使用,基于应用程序类型来过滤应用程序。如果应用程序的类型有多个,用逗号分隔。 -list: 返回RUNNING状态的application 任务 -kill <ApplicationId>: kill掉指定的应用程序 -status <ApplicationId>: 打印应用程序的状态。

yarn applicationattempt

一般和yarn container [options] 配合使用

-list <ApplicationId>:获取到应用程序尝试的列表,其返回值 ApplicationAttempt-Id 等于 Application Attempt Id -status <Application Attempt Id>: 打印应用程序尝试的状态。

yarn applicationattempt -list

AM-Container-Id 指 YARN 应用程序的 Application Master 容器的唯一标识符。在 YARN 中,Application Master(简称 AM)是负责协调和管理整个应用程序执行过程的组件,它负责向 ResourceManager 请求资源,并监控和管理应用程序的执行。

yarn applicationattempt -status

yarn container

-list <Application Attempt Id>: 应用程序尝试的Containers列表 -status <ContainerId>: 打印Container的状态

yarn container -list

yarn container -status

yarn logs

-applicationId <application ID>: 指定应用程序ID -appOwner <AppOwner>: 应用的所有者 -containerId <ContainerId>: Container Id -nodeAddress <NodeAddress>: 节点地址的格式:nodename:port (端口是配置文件中:yarn.nodemanager.webapp.address参数指定)

相关信息:

日志示例:

正常结束:

异常结束:

yarn node

-all: 所有的节点,不管是什么状态的。 -list: 列出所有RUNNING状态的节点。支持-states选项过滤指定的状态,节点的状态包含:NEW,RUNNING,UNHEALTHY,DECOMMISSIONED,LOST,REBOOTED。支持--all显示所有的节点。 -states <States>: 和-list配合使用,用逗号分隔节点状态,只显示这些状态的节点信息。 -status <NodeId>: 打印指定节点的状态,NodeId 为上面显示列表中的

yarn queue

-status <QueueName>: 打印队列的状态

yarn rmadmin

-refreshQueues:重载队列的ACL,状态和调度器特定的属性,ResourceManager将重载mapred-queues配置文件 -refreshNodes: 动态刷新dfs.hosts和dfs.hosts.exclude配置,无需重启NameNode。dfs.hosts:列出了允许连入NameNode的datanode清单(IP或者机器名)dfs.hosts.exclude:列出了禁止连入NameNode的datanode清单(IP或者机器名)重新读取hosts和exclude文件,更新允许连到Namenode的或那些需要退出或入编的Datanode的集合。 -refreshUserToGroupsMappings: 刷新用户到组的映射。 -refreshSuperUserGroupsConfiguration: 刷新用户组的配置 -refreshAdminAcls: 刷新ResourceManager的ACL管理 -refreshServiceAclResourceManager: 重载服务级别的授权文件。 -getGroups [username]: 获取指定用户所属的组。 -failover [–forceactive] <serviceId1> <serviceId2>: 启动从serviceId1 到 serviceId2的故障转移。如果使用了-forceactive选项,即使服务没有准备,也会尝试故障转移到目标服务。如果采用了自动故障转移,这个命令不能使用。 -getServiceState <serviceId>: 返回服务的状态。(注:ResourceManager不是HA的时候,时不能运行该命令的) -getAllServiceState: 返回所有服务的状态。

yarn top

查看每个application占用的cpu和内存

命令结果展示

整体资源详情

参数说明
available剩余可用的资源
allocated已经使用的资源
reserved已经申请正在分配的资源
pending等待申请的资源
available + allocatedYarn的总资源

job详情列解释

 

脚本执行yarn top

只要SLEEP_TIME小于yarn top上的默认刷新延迟(默认为3秒),您将在yarn-top.log中获得一个屏幕更新。如果将SLEEP_TIME设置为大于刷新延迟,则将在SLEEP_TIME期间获得尽可能多的更新。

yarn 任务状态

在YARN中,应用程序和Container的状态变化会影响任务的执行和资源分配。下面是YARN中应用程序和Container的状态详细过程:

1)Application 状态

是指YARN应用程序的状态。每个应用程序都有一个唯一的Application ID,并且可以通过ResourceManager API或YARN Web UI来获取应用程序的当前状态。在YARN中,应用程序状态可以有以下状态:

  1. NEW:应用程序刚创建时的状态。应用程序会被分配一个唯一的Application ID,但还没有分配资源,也没有进入资源队列。
  2. NEW_SAVING:应用程序等待资源保存。这个状态只存在于开启了Application历史保存的集群上,如果没有保存历史,则该状态的转换不会发生。
  3. SUBMITTED:应用程序已经提交给YARN,并在队列中等待调度资源。在该状态下,YARN只是对应用程序进行了初步的运行时配置,但还没有将任何容器分配到该应用程序。
  4. ACCEPTED:应用程序已经通过队列,并已经分配了它需要的初始和最小容器。
  5. RUNNING:应用程序正在运行中,并具有正在运行的容器。
  6. FINISHED:应用程序已经成功完成,并且其最终状态已经保存到YARN应用历史中。
  7. FAILED:应用程序运行失败,并且其最终状态已经保存到YARN应用历史中。
  8. KILLED:应用程序已被终止,并且其最终状态已经保存到YARN应用历史中。
2)Container 状态

容器状态指的是在YARN集群上运行的应用程序内部的容器状态。在YARN集群上运行的应用程序是通过启动多个容器来实现的,每个容器都运行着应用程序的一部分(如MapReduce中的一个map或reduce任务),并使用一个或多个资源(如内存、CPU等)来执行任务。当一个应用程序启动后,它的容器状态可能有以下几种:

  1. NEW:Container刚刚创建,但还没有分配资源
  2. LOCALIZED:Container已经获取了运行时环境和所需的资源,表示资源已经被分配给某个容器,但资源还未完全在该容器上本地化。在容器执行应用程序之前,需要将应用程序所需的资源(如JAR包、配置文件等)拷贝到容器所在的节点上,并在容器内部完成相关配置。完成本地化操作后,容器就可以开始执行应用程序。
  3. RUNNING:Container正在运行,并且已经分配了资源。
  4. COMPLETE:Container已经完成工作并退出。
  5. EXITED_WITH_SUCCESS:表示容器成功执行完毕,并且已经被清理。
  6. EXITED_WITH_FAILURE:表示容器执行失败,并且已经被清理。

NEW 状态到 LOCALIZED 状态,Container 会向 NodeManager 发起本地化请求,要求 NodeManager 将所需的资源复制到本地磁盘。从 LOCALIZED 状态到 RUNNING 状态,Container会通过启动进程来运行任务。在运行过程中,Container 可能会由于各种原因失败,进入 FAILED 状态。如果Container 顺利完成任务,则进入 COMPLETE 状态。

综上所述,YARN中应用程序和Container的状态变化对于任务的执行和资源分配非常关键。在使用YARN进行任务调度和管理时,需要对不同状态之间的转换有清晰的理解,以确保任务能够顺利运行和完成。

1)资源不足情况下

在YARN中,当资源不足时,YARN的资源管理器会对应用程序的状态进行调整,以帮助其适应现有的资源情况。下面是YARN中应用程序状态在资源不足的情况下的状态变化:

2)任务超时时间配置

任务等待超时时间:

在YARN中,可以通过配置文件设置任务等待资源的超时时间,其中包括 mapred-site.xmlyarn-site.xml 两个文件。

yarn-site.xml 文件中,可以设置以下两个参数来控制任务等待资源的超时时间:

mapred-site.xml 文件中,可以设置以下参数来控制 MapReduce 作业等待资源的超时时间:

History Server API

HBASE

基本命令

更新操作

status

snapshot

RowCounter

利用hbase.RowCounter包执行MR任务

Hive

Hadoop 部署

下载

准备工作

1、安装java 8,配置环境变量JAVA_HOME

2、要创建hadoop用户

3、配置ssh免密登录,ssh localhost 成功,才能使用脚本启动

单机模式

默认情况下,Hadoop 配置为以非分布式模式运行,作为单个 Java 进程。这对于调试很有用。 以下示例复制解压缩的 conf 目录以用作输入,然后查找并显示给定正则表达式的每个匹配项。输出被写入给定的输出目录。

伪分布式模式

Hadoop 也可以在单节点上以伪分布式模式运行,其中每个 Hadoop 守护进程在单独的 Java 进程中运行。

修改配置

启动集群

以下说明是在本地运行 MapReduce 作业。如果要在 YARN 上执行作业,请参阅YARN on Single Node。

YARN部署

使用 YARN 单节点

您可以通过设置一些参数并另外运行 ResourceManager 守护程序和 NodeManager 守护程序,以伪分布式模式在 YARN 上运行 MapReduce 作业。 以下指令假设上述指令的 1. ~ 4. 步骤已经执行。

修改配置

启动集群

启用 YARN jobHistory

修改配置

启动 JobHistoryServer

启用 YARN 日志聚集功能

修改配置

重启

HBase部署

文档下载

单机模式

默认 hbase.rootdir 是指向 /tmp/hbase-${user.name} ,也就说你会在重启后丢失数据(重启的时候操作系统会清理/tmp目录)

伪分布式模式

修改配置

启动 Hbaes

现在你运行的是单机模式的Hbaes。所有的服务都运行在一个JVM上,包括HBase和Zookeeper。

浏览 HBase 的 Web 界面;默认情况下,它位于: HBase - http://localhost:16010/

Hbase 无法启动

hbase regionserver 状态信息存储在 zookeeper中,元数据异常可能导致无法启动

启动 Hbaes Shell

👉 常用命令

Hive部署

下载

修改配置

启动 Hive

Kudu部署

Kudu 项目仅发布源代码版本,要在集群上部署 Kudu,请从源代码构建 Kudu

Kudu 无法启动

Kudu对时间同步要求比较严格,默认允许最大时间误差为2000000微秒(2秒),若还是无法启动,需要重启服务器

Unable to init master catalog manager 这个错误是因为,kudu master 启动时发现元数据目录下空空如也,没有文件,所以拒绝启动。这种情况可能是上次启动时因为时间没同步,导致启动失败。所以影响本次的启动。或者该目录下有脏数据老的kudu目录数据。

解决方法:将报错对应的wal目录和data目录清空能恢复。若还是无法启动,需要重启服务器

创建表

浏览 Kudu 的 Web 界面;默认情况下,它位于: Kudu - http://localhost:8050/

Impala部署

Impala 项目发布的是源码包

浏览 Impala 的 Web 界面;默认情况下,它位于: Impala - http://localhost:25000/ w3m http://localhost:25000/

Livy部署

要运行Livy服务器,需要安装Apache Spark。Livy至少需要Spark 1.6,并支持Scala 2.10和2.11 spark的构建。

修改配置

Livy使用的配置文件是:

启动 Livy

Livy端口:8998

Knox部署

下载

安装

启动嵌入在 Knox 中的 LDAP

创建主密钥

CLI 将提示您输入主密钥(即密码)。

启动Knox

以这种方式启动网关时,该过程将在后台运行。日志文件将写入{GATEWAY_HOME}/logs ,进程 ID 文件 (PID) 将写入{GATEWAY_HOME}/pids

要停止使用该脚本启动的网关,请使用以下命令:

如果由于某种原因,网关停止了,而不是使用上面的命令,您可能需要清除跟踪PID:

注意:此命令还将清除 {GATEWAY_HOME}/logs 目录中的任何 .out.err 文件,因此请谨慎使用。

使用 Knox 访问 Hadoop

通过网关调用WebHDFS上的LISTSTATUS操作。这将返回HDFS的根(即/)目录的目录列表。

上述命令的结果应类似于下面的输出。返回的确切信息取决于Hadoop集群中HDFS中的内容。成功执行此命令至少证明网关已正确配置为提供对 WebHDFS 的访问。这并不一定意味着任何其他服务都已正确配置为可访问。若要验证这一点,请参阅服务详细信息中各个服务的部分。

通过 Knox 将文件放入 HDFS 中。

通过 Knox 获取 HDFS 中的文件。