1. Hadoop/HDFS 简介

Hadoop 是一个开源的分布式计算框架,用于处理大规模数据集。HDFS(Hadoop 分布式文件系统)是 Hadoop 的一个子项目,用于存储和管理大规模数据集。

Hadoop/HDFS 的设计灵感来自于 Google 的 GFS(Google 文件系统)和 MapReduce(谷歌的分布式计算模型)。HDFS 是 Hadoop 的存储层,负责将数据切分成多个块,并在多个计算节点上进行分布式存储。Hadoop 则提供了分布式计算的能力,通过运行 MapReduce 程序对数据进行处理。

2. Hadoop/HDFS 示例应用

以下是一个使用 Hadoop/HDFS 进行大数据处理的示例:

1)上传数据:首先,将要处理的大数据集上传到 HDFS 中。使用 Hadoop HDFS 命令行工具或 HDFS API 将数据拆分成块并存储到集群中。

2)编写 MapReduce 程序:编写一个 MapReduce 程序来处理数据。MapReduce 是 Hadoop 的核心编程模型,通过将大任务分解为小任务,并将这些小任务分配给不同的计算节点来实现并行计算。MapReduce 程序通常由 map 函数和 reduce 函数组成,用于处理输入数据并生成输出结果。

3)运行作业:使用 Hadoop 集群管理器(如 YARN)来提交 MapReduce 作业。集群管理器将作业划分为多个任务,并将这些任务分配给各个计算节点来执行。每个节点上的任务会读取 HDFS 上的数据,并使用 MapReduce 程序来处理数据。最后,输出结果将写回 HDFS。

3. Hadoop/HDFS 示例代码

下面是一个简单的 Hadoop/HDFS 示例代码:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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;

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

public class WordCount {
  
  public static class TokenizerMapper extends Mapper{

    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 {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable 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);
  }
}
Java

上述代码实现了一个简单的单词计数程序,将输入的文本文件中的单词进行计数,并输出每个单词及其出现的次数。通过 Hadoop/HDFS 的分布式计算和分布式存储,这个程序可以高效地处理大规模的文本数据。