files-in-wood-cases

数据生成正在成为一个重要的过程。正如世界经济论坛所指出的,每天总共将生成463艾字节(10,006字节)的数据。从各种社交媒体渠道收集数据、传感器、搜索生成的数据等都需要存储在可靠的基础架构中,从而保证数据的安全性和更容易的处理可用性。

需要进一步处理生成的数据,以获得能够提高预测和计算准确性以构建更智能系统的结果。因此,必须保留数据的真实性。同时,它必须存储在支持更快操作执行的文件系统中。Apache Hadoop 保证更快、更轻松地进行管理,同时通过分布式文件系统存储大量数据。

你也可能喜欢:开始与ApacheHadoop。

Apache Hadoop 和 Hadoop 分布式文件系统 (HDFS)

Apache Hadoop是一个开源框架,通过软件库支持软件开发,帮助解决分布式计算和数据存储问题。因此,Hadoop 分布式文件系统 (HDFS) 用于跨不同设备存储数据,这些设备可以轻松高效地获取和共享。Hadoop 是一个基于 Java 的框架,更易于操作。

为什么要使用 Hadoop 分布式文件系统 (HDFS)?

用于大数据分析的数据不是结构化的。结构化数据采用单一形式,可通过正在使用的文件系统存储。处理结构化数据更容易,因为它只采用单一形式,因此处理速度更快。

但是,大数据包括图像、音频信号、视频、传感器数据等形式的数据。要处理这些非结构化数据,需要将其存储在大型分布式文件系统上,其中数据提取也更容易处理。

因此,使用 HDFS,因为它提供了处理数据的最佳选项,并将其存储在设备之间,只有在满足身份验证要求后才能从设备中获取数据。Hadoop 提供了一个命令行界面,用于与数据交互并完成处理。

Hadoop 映射减少:软件处理分布式数据

Hadoop MapReduce 是一个高效帮助处理分布式数据的框架。它主要是使用 Java 来处理数据的原始 Hadoop 引擎。MapReduce 只是一种基于并行处理原理的算法。

由于谷歌要求每分钟处理它收到的搜索(显然,它是380万!),它在其GFS(谷歌文件系统)中引入了并行处理,其中给定的任务被分成小块的任务,并且它们以一种能够提高处理效率和速度的方式完成。MapReduce 是一种处理并行处理的算法,它遵循类似于 HDFS 的主从体系结构来实现它。

映射缩减的工作原理

并行处理将数据分解为更小的块,并并行处理每个数据块以收集和形成最终输出。由于 HDFS 已经将存储的文件划分为小块大小,因此 MapReduce 要做的只是处理数据在本文中,我们将使用一个简单的示例来理解该过程:

假设我们的数据分布在两个节点中,并且每个文件的内容是:

  • 文件1:早上好汤姆早上杰里。

  • 文件2:你好汤姆你好杰里。

第 1 步:映射

Mapper 应该有独立的逻辑,可以帮助映射数据,并根据算法将其划分为多个区块。输入设置在要处理的特定文件的驱动程序程序中。将运行进程的输入格式也设置在那里。生成的输出将以<key、值>对的形式出现,不会保存在 HDFS 中;相反,它们将在操作系统上创建的中间文件中执行进一步处理。

按照该示例,映射器将生成输出,如下所示:

File1
<Good, 1>
<Morning, 1>
<Tom, 1>
<Morning, 1>
<Jerry, 1>

File2
<Hello, 1>
<Tom, 1>
<Hello, 1>
<Jerry, 1>

第 2 步:随机播放和组合(排序)

如果不需要执行此步骤,则可以重写此步骤。随机播放是映射和减少之间的中间步骤,有助于相应地收集和组装数据,使处理更加容易。随机洗牌和合并过程后的输出格式将为<key,列表(值列表)>指示对映射器键值和输出进行分组的过程。

对于给定的示例,此阶段将生成输出,如:

File1
<Good, 1>
<Morning, 2>
<Tom, 1>
<Jerry, 1>

File2
<Hello, 2>
<Tom, 1>
<Jerry, 1>

第 3 步:减少

减速器最终合并从随机播放接收的输出并合并过程并生成最终输出。它在提供的<key、列表(值列表)上处理 > >并生成<key、列表(值列表)>格式中的最终输出,聚合从不同区块生成的数据。减速器的最终输出存储在 HDFS 中,它是 MapReduce 执行后的最终输出。

所述示例的最终输出将为:

<Good, 1>
<Morning, 2>
<Hello, 2>
<Tom, 2>
<Jerry, 2>

MapReduce Process Sample and Output

映射减少过程采样和输出

地图缩减的整个过程如下图所示:

MapReduce Process (Source)

映射减少流程

实际了解映射减少:映射减少应用程序

使用支持 Hadoop MapReduce 作业的编程语言,需要实际使用上述解释的算法。可以使用C++、Java、Python 或 Ruby 实现 MapReduce。但是,在 HDFS 上实现 MapReduce 的主要编程语言是 Java。

要对存储在HDFS中的大数据使用 MapReduce,MapReduce 的输入应提供如下:

输入/输出位置

使用基本接口映射和缩小函数为此,Hadoop 提供了两个接口:

1. 可写接口

可写接口将输入数据流转换为对象,然后序列化为输出。使用此接口的某些类是 和 ArrayWritable ByteWritable 。要使用 接口创建自定义类 Writable ,需要使用以下两种方法:

void readFields(DataInput in): Converts input stream into an object.
 void write(DataOutput out): Serializes the output object.

2. 可写可写可比较的界面

此接口用于比较通过可写接口实现的对象的键值。要创建 WritableComparable 自定义接口类,需要实现 WritableComparable 类和以下方法:

void readFields (DataInput in): Converts input stream into an object.
 void write (DataOutput out): Serializes the output object.
 Int compareTo (Object obj): Compares the value of objects to sort the key.

下面是一个在一组单词上实现 MapReduce 作业的简单示例。WordCount此处计算集中给出的每个单词的出现次数。

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {

  public static class TokenizerMapper
       extends Mapper<Object, Text, Text, IntWritable>{

    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(Object key, Text value, Context context
                    ) throws IOException, InterruptedException {
      StringTokenizer itr = new StringTokenizer(value.toString());
      while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        context.write(word, one);
      }
    }
  }

  public static class IntSumReducer
       extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values,
                       Context context
                       ) throws IOException, InterruptedException {
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
      }
      result.set(sum);
      context.write(key, result);
    }
  }

  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = Job.getInstance(conf, "word count");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

守护进程

为了有效地运行 MapReduce 作业,处理是通过守护进程完成的,这些进程无需占用大量内存空间和处理能力即可生成高效的输出。由于 MapReduce 也遵循主从体系结构,守护进程有两种类型: JobTracker 主进程和 TaskTracker ,从属进程。

工作跟踪器

这是管理资源、标识 TaskTrackers 正在执行任务并遵循流程周期的主流程分配给的主要功能 JobTracker 是检查资源可用性、任务流程周期,并随时了解 TaskTracker 的状态,以便了解流程状态。

任务跟踪器

TaskTracker是完成 由 分配的所有任务的守护进程。 JobTrackerTaskTracker始终发送检测信号消息,以保持其更新与进程状态。 JobTracker

MapReduce Architecture (Source)

映射减少体系结构

但是,对于不需要减少处理结束时执行的操作的数据,Hadoop 还有助于”仅映射作业”,以帮助映射数据。

仅限地图作业

当处理只需要重复处理数据的映射时,可以消除缩减操作,并生成输出,因为提供等值映射。这可以使用 启用 Job.SetNumReduceTasks(0)

此外,请务必记住,仅映射作业不会存储在数据库中。在操作系统中创建一个单独的文件,以存储以后可以传输到减速器的输出。仅映射作业的执行速度比 MapReduce 快。下面的代码说明了如何使用 Java 为分配的作业启用仅映射器。

package org.dedunumax.mapperOnly;
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

public class App 
{
    public static void main( String[] args ) throws IOException, ClassNotFoundException, InterruptedException
    {
    Configuration conf = new Configuration();
Job job = new Job(conf, "Mapper_Only_Job");

job.setJarByClass(App.class);
job.setMapperClass(Map.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);

// Sets reducer tasks to 0
job.setNumReduceTasks(0);

FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));

boolean result = job.waitForCompletion(true);

System.exit(result ? 0 : 1);
    }
}

(来源:Github)

大数据并行处理还有其他选项吗?

技术术语的不断发明和演变为完成任务提供了许多其他选择。MapReduce 是最基本的并行处理实现算法,可以完成工作。MapReduce仍然是处理大数据的最佳选择之一,但它面临着几个限制

在 MapReduce 中,直到映射器完成该过程,减速器无法开始工作。此外,映射或减少运行的顺序无法控制。此外,MapReduce 不能使用具有未编制索引数据的数据库,从而更快地工作。在限制之后,还有其他选项可以执行相同的任务,但效率和速度会稍高一些。

例如,阿帕奇火花,蜂巢,猪和更多即将到来的时代是智能机器,并教机器更多,提高准确性,大数据分析起着至关重要的作用,因此,MapReduce 和 HDFS 的重要性只会在即将到来的时代增加。

进一步阅读

Comments are closed.