内存中的 MapReduce 和 Hadoop 生态系统:第 1 章

本文的部分内容摘自《使用 Apache Ignite 进行内存高性能计算一书。如果对此感兴趣,请查阅此书的其余部分以获取更多有用的信息。

Hadoop 已经迅速成为建立在海量数据之上的商业智能的标准。然而,其按批调度的开销和基于磁盘的数据存储使其不适合用于分析生产环境中的实时数据。限制 Hadoop 和 MapReduce 性能扩展的主要因素之一是 Hadoop 依赖生成大量输入 / 输出(I/O)文件的文件系统。I/O 操作会增加延迟,并延迟 MapReduce 的计算。有种替代方法是将所需的分布式数据存储在内存中。将 MapReduce 与其所需的数据放在内存中就可以消除由文件 I/O 操作产生的延迟。

上图显示了 Hadoop 作业的一般流程。其中 sort,merge 和 shuffle 步骤都是 I/O 密集型的。运行以毫秒级别或秒级别的时间得出结果的实时分析时,这些步骤的开销会非常高。

通过引入多种技术,MapReduce 的内存引擎 Ignite 能在几秒钟(或更短时间)内执行 MapReduce 程序。在回避 Hadoop 的按批调度后,它可以在几毫秒内而不是在几十秒内启动作业。内存数据存储可通过消除对磁盘或网络上的数据的调动来显着地缩短访问时间。这就是在不更改代码的情况下提高 Hadoop 应用程序性能的 Ignite 方法。其主要优点是所有的操作都是高度透明的,都是能在不改变 MapReduce 代码行的情况下完成的。

Hadoop 的这一即插即用的内存加速器有三种类型。

1. 内存中的 MapReduce

它是 Hadoop 的作业和任务跟踪器的一个替代方案,可以加快作业执行的性能。它消除了标准 Hadoop 体系结构中与作业和任务跟踪器相关的开销,同时能提供低延迟的 HPC 式分布式处理功能。

2. Ignite 内存文件系统(IGFS)

它也是一个 Hadoop 文件系统的替代方案,在内部名为 IgniteHadoopFileSystem。它可以将数据集存储在内存中。这种基于内存的文件系统最大限度地减少了磁盘 I/O 开销,提高了性能。

3. Hadoop 文件系统缓存

这一方案会作为 HDFS 在之上的缓存层工作。每个读写操作都应该经过这一层,并且可以提高 MapReduce 的性能。

Ignite Hadoop 加速器的概念架构如下图所示:

当你已经启动并运行了一个现有的 Hadoop 集群并希望以最少的工作获得更高的性能时,Apache Ignite Hadoop 加速器工具会特别有用。请注意,Hadoop 在商品硬件上运行的想法就是一个谎言。大多数 Hadoop 的流程都是 I/O 密集型的,需要多部同环境的服务器还有中介服务器配合工作才能实现良好的性能。

在这篇文章中,我们将探讨内存中的 Apache Ignite MapReduce 的一些细节。

内存中的 Ignite MapReduce 引擎与 Hadoop HDFS 还有 Yarn 完全兼容。它减少了 Hadoop 作业和任务跟踪器的启动和执行的时间,还为 CPU 密集型任务提供了显着的性能提升,同时只需对现有应用程序进行最小限度的更改。该模块还提供了基于权重的 MapReduce 调度器的实现,该调度器会根据权重分配 mapper 和 reducer 这两种任务,其中这一权重描述了执行特定任务需要资源的多少。然后会有调度算法通过合理分配 mapper 任务,使得所有节点上的总体结果权重尽可能最小。

内存中的 Ignite MapReduce 的高​​级架构如下所示:

内存中的 Ignite 单元在所有单元节点上都有一个基于 Java 的前级执行环境,并会将其重复用于多个数据处理流程里面。此执行环境由一组 Java 虚拟机构成,而集群中的每台服务器都会有一个这样的虚拟机。如上图所示,JVM 会形成 Ignite MapReduce 引擎。另外,内存中的 Ignite 数据单元可以自动部署所有必需的可执行程序或类库,以便在整个内存单元中执行 MapReduce,从而大大缩短了启动时间,甚至能缩短到毫秒级别。

现在我们已经了解了基础知识。不妨尝试配置一个开发环境并在 Ignite MapReduce 引擎中执行一些 MapReduce 作业。

为了简单起见,我们将在单个虚拟机中安装一个 Hadoop 伪分布式集群,并且拿有名的 Hadoop 字数统计例程作为一个 MapReduce 作业来运行。Hadoop "伪分布式集群" 意味着 Hadoop 的数据节点,名称节点,任务和作业跟踪器 —— 一切都只会运行在一台虚拟(主机)机器上。

让我们来看看我们的开发环境配置,如下所示:

  1. 操作系统:RedHat Linux 企业版;
  2. CPU:双核
  3. RAM:2 GB。
  4. JVM:1.7_60。
  5. Ignite 版本:1.6 或以上,单节点集群。

首先,我们要安装和配置 Hadoop,还有 Apache Ignite。在此我们假设 Java 已经装好并且位于环境变量 JAVA_HOME 里面。

1. 解压 Hadoop 发行版

解压 Hadoop 发行包,然后在 /etc 里面设置 JAVA_HOME 路径:

export JAVA_HOME=JAVA_HOME_PATH

2.添加配置

往文件 etc/hadoop/core-site.xml 添加以下内容:

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>

另外还要将以下数据复制策略加到这个文件中:etc/hadoop/hdfs-site.xml

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

3.设置无密码的 SSH

给操作系统设置无密码的 SSH 的命令如下:

$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys

然后在控制台上运行以下命令来测试设置效果:

$ ssh localhost

如果设置成功,这一命令的运行就不会要求你输入密码。

4. 设置 Hadoop HDFS 文件系统

首先格式化 Hadoop HDFS 文件系统:

$ bin/hdfs namenode -format

接着通过以下命令启动 namenode / datanode 守护进程:

$ sbin/start-dfs.sh

另外,建议将环境变量 HADOOP_HOME 添加到操作系统。

5. 设置目录

在 HDFS 文件系统中创建几个目录来运行 MapReduce 作业。

bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /input

以上命令将创建两个文件夹用户并输入到 HDFS文件系统里面。

然后在 input 目录中插入一些文本文件:

bin/hdfs dfs -put $HADOOP_HOME/etc/hadoop /input

6. 配置Hadoop伪集群

运行本地 Hadoop MapReduce 应用程序来计算文件的字数。

$ bin/hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar w\
ordcount /input/hadoop output

可以使用以下命令查看单词统计的结果:

bin/hdfs dfs -cat output/*

就笔者的情况来说,输入的文件还蛮大的。我们来看看输出文件的一部分:

want 1 warnings. 1 when 9 where 4 which 7 while 1 who 6
will 23
window 1
window, 1
with 62
within 4
without 1
work 12
writing, 27

在这个阶段,我们的 Hadoop 伪集群已经配置好并已经可以使用了。现在我们开始配置 Apache Ignite。

7. 解压 Apache Ignite 发行包

将 Apache Ignite 的发行包解压到开发环境中的某个位置,并将路径 IGNITE_- HOME

添加到安装的根目录中。为了获得有关任务和执行的统计信息,还必须在文件 /config/default-config.xml 中添加以下属性:

<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
  ....

  <property name="includeEventTypes">
    <list>
      <util:constant static-field="org.apache.ignite.events.EventType.EVT_TASK_FAILED"/>
      <util:constant static-field="org.apache.ignite.events.EventType.EVT_TASK_FINISHED"/>
      <util:constant static-field="org.apache.ignite.events.EventType.EVT_JOB_MAPPED"/>
    </list>
  </property>
</bean>

以上配置将会启用进行统计的针对事件的任务。

注意在默认情况下,所有的事件都会处于禁用状态而不会触发。只有在启用了上述事件之后,才可以在 Ignite Visor 中使用命令 “tasks” 来获取有关任务执行的统计信息。

8.添加库

在目录 $IGNITE_HOME/libs 中添加这些类库:

asm-all-4.2.jar
ignite-hadoop-1.6.0.jar
hadoop-mapreduce-client-core-2.7.2.jar
hadoop-common-2.7.2.jar
hadoop-auth-2.7.2.jar

注意 asm-all-4.2.jar 这个类库的具体版本是取决于你所安装的 Hadoop 版本的。

9. 启动 Ignite 节点

我们将使用 Apache Ignite 默认配置文件 config/default-config.xml 来启动 Ignite 节点。

然后使用以下命令启动 Ignite 节点:

bin/ignite.sh

10. 设置 Ignite Job Tracker

再添加一些内容来使用 Ignite 作业跟踪器而不是 Hadoop。我们需要把这些东西添加到环境变量 HADOOP_CLASSPATH 里面:

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$IGNITE_HOME/libs/ignite-core-1.6.0.jar:$IGNITE_\
HOME/libs/ignite-hadoop-1.6.0.jar:$IGNITE_HOME/libs/ignite-shmem-1.0.0.jar

11. 重写

在这个阶段,我们将会重写 Hadoop 文件。为了方便上手,不妨直接将以下 XML 片段添加到 mapred-site.xmlmapred-site.xml

<property>
<name>mapreduce.framework.name</name>
<value>ignite</value>
</property>
<property>
<name>mapreduce.jobtracker.address</name>
<value>127.0.0.1:11211</value>
</property>

12. 跑起来

再次运行上面的 MapReduce 单词统计例程:

$bin/hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wo\
rdcount /input/hadoop output2

程序的输出应该是十分相似的,如下图所示:

现在运行时间比使用 Hadoop 任务跟踪器的时候应该更快。让我们通过 Ignite Visor 来检查 Ignite 任务执行的统计信息。

对上图,我们应该注意到内存任务跟踪器的总执行次数和持续时间。在我们的例子中,

HadoopProtocolJobStatusTask(@t1) 任务执行总次数是24,执行时间是 12 秒。

在下一章节中,我们还将执行一些性能基准测试来演示 Ignite MapReduce 引擎的性能优势。

本文的版权归 Tnecesoc 所有,如需转载请联系作者。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我是攻城师

如何管理Spark Streaming消费Kafka的偏移量(一)

79770
来自专栏云计算教程系列

在腾讯云CVM上搭建Hadoop集群

本教程将介绍如何在腾讯云CVM上搭建Hadoop集群。Hadoop中是一个Apache的框架,可以让你通过基本的编程处理跨服务器集群的分布式方式的大型数据集。H...

30240
来自专栏Hadoop实操

Cloudera Manager管理控制台

Cloudera Manager管理控制台(Cloudera Manager Admin Console)是一个基于Web的用户界面,用于配置,管理和监控CDH...

1.4K110
来自专栏恰童鞋骚年

Hadoop学习笔记—22.Hadoop2.x环境搭建与配置

自从2015年花了2个多月时间把Hadoop1.x的学习教程学习了一遍,对Hadoop这个神奇的小象有了一个初步的了解,还对每次学习的内容进行了总结,也形成了我...

27910
来自专栏搜云库

Hadoop-2.7.4 集群快速搭建

Hadoop简介 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力...

34170
来自专栏Hadoop实操

如何将CDH从企业版降级为免费版

在使用CDH企业版时,当License过期后,在CM顶部总是会有一个红色的banner条显示License已过期。我们有时会觉得它影响美观,想要考虑将CDH从企...

87850
来自专栏LanceToBigData

Hadoop(四)HDFS集群详解

前言   前面几篇简单介绍了什么是大数据和Hadoop,也说了怎么搭建最简单的伪分布式和全分布式的hadoop集群。接下来这篇我详细的分享一下HDFS。   H...

55290
来自专栏加米谷大数据

技术干货 | Hadoop3.0稳定版安装攻略来啦!

第一次安装Apache Hadoop3.0.0是不是状况百出?没关系安装攻略来啦! ? Apache Hadoop 3.0.0在前一个主要发行版本(hadoop...

55690
来自专栏用户画像

DMA方式

DMA方式是一种完全由硬件进行组信息传送的控制方式。具有程序中断方式的优点,即在数据准备阶段,CPU与外设并行工作。DMA方式在外设与内存之间开辟一条“直接数据...

10310
来自专栏程序员笔录

Spark 开发环境搭建

本文是对初始接触 Spark 开发的入门介绍,说明如何搭建一个比较完整的 Spark 开发环境,如何开始应用相关工具。文中如有错误或者不当之处,敬请指正。

1.9K10

扫码关注云+社区

领取腾讯云代金券