📜  什么是 Hadoop 流?

📅  最后修改于: 2021-10-27 06:30:52             🧑  作者: Mango

它是 Hadoop 发行版附带的实用程序或功能,允许开发人员或程序员使用不同的编程语言(如 Ruby、Perl、 Python、C++ 等)编写 Map-Reduce 程序。我们可以使用任何可以读取标准的语言输入(STDIN)像键盘输入和所有使用标准输出(STDOUT)写入。我们都知道 Hadoop 框架完全是用Java编写的,但是 Hadoop 的程序不一定需要用Java编程语言编写。 Hadoop Streaming 的特性从 Hadoop 0.14.1 版开始可用。

Hadoop 流的工作原理

什么是 Hadoop 流

在上面的示例图像中,我们可以看到虚线块中显示的流程是一个基本的 MapReduce 作业。在这里,我们有一个 Input Reader 负责读取输入数据并生成键值对列表。我们可以从数据库表、图像数据(.jpg、.png)、音频数据等中读取 .csv 格式、分隔符格式的数据。读取所有这些类型的数据的唯一要求是我们必须创建一个特定的这些输入阅读器的数据的输入格式。输入阅读器包含有关它正在阅读的数据的完整逻辑。假设我们想要读取一个图像,那么我们必须在输入读取器中指定逻辑,以便它可以读取该图像数据,最后它会为该图像数据生成键值对。

如果我们正在读取图像数据,那么我们可以为每个像素生成键值对,其中键是像素的位置,值是彩色图像的 (0-255) 的颜色值。现在这个键值对列表被馈送到 Map 阶段,Mapper 将处理每个像素的这些键值对中的每一个,并生成一些中间键值对,然后在进行混洗和排序后将这些键值对馈送到 Reducer 然后reducer 产生的最终输出将写入 HDFS。这些是简单的 Map-Reduce 作业的工作方式。

现在让我们看看如何使用不同的语言,如Python、C++、Ruby 和 Hadoop 来执行。我们可以通过将它们作为单独的进程运行来运行这种任意语言。为此,我们将创建我们的外部映射器并将其作为外部独立进程运行。这些外部映射进程不是基本 MapReduce 流程的一部分。这个外部映射器将从 STDIN 获取输入并产生输出到 STDOUT。当键值对传递给内部映射器时,内部映射器进程会将这些键值对发送到外部映射器,在那里我们在 STDIN 的帮助下用其他语言(如Python)编写了代码。现在,这些外部映射器处理这些键值对并在 STDOUT 的帮助下生成中间键值对并将其发送给内部映射器。

同样,Reducer 也做同样的事情。一旦中间键值对通过 shuffle 和排序过程进行处理,它们就会被馈送到内部减速器,内部减速器会将这些对发送到外部减速器进程,这些对通过 STDIN 的帮助单独工作,并在帮助下收集外部减速器生成的输出STDOUT,最后将输出存储到我们的 HDFS。

这就是 Hadoop Streaming 在 Hadoop 上的工作方式,默认情况下在 Hadoop 中可用。我们只是通过制作我们的外部映射器和减速器来利用这个特性。现在我们可以看到 Hadoop 流的强大功能。任何人都可以用他自己选择的任何语言编写他的代码。

一些 Hadoop 流命令

Option

Description

-input directory_name or filename Input location for the mapper.
-output directory_name  Input location for the reducer. 
-mapper executable or JavaClassName  The command to be run as the mapper
-reducer executable or script or JavaClassName The command to be run as the reducer
-file file-name Make the mapper, reducer, or combiner executable available locally on the compute nodes 
-inputformat JavaClassName By default, TextInputformat is used to return the key-value pair of Text class. We can specify our class but that should also return a key-value pair.
-outputformat JavaClassName By default, TextOutputformat is used to take key-value pairs of Text class. We can specify our class but that should also take a key-value pair.  
-partitioner JavaClassName The Class that determines which key to reduce.
-combiner streamingCommand or JavaClassName The Combiner executable for map output
-verbose The Verbose output.
-numReduceTasks It Specifies the number of reducers.
-mapdebug Script to call when map task fails 
-reducedebug Script to call when reduce task fails