数据生成正在成为一个重要的过程。正如世界经济论坛所指出的,每天总共将生成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>
地图缩减的整个过程如下图所示:
实际了解映射减少:映射减少应用程序
使用支持 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
是完成 由 分配的所有任务的守护进程。 JobTracker
TaskTracker
始终发送检测信号消息,以保持其更新与进程状态。 JobTracker
但是,对于不需要减少处理结束时执行的操作的数据,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 的重要性只会在即将到来的时代增加。