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);
  }
}

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