Hadoop教学简介

Hadoop是一个开源的分布式存储和处理框架,用于处理大规模数据。它提供了存储和计算的能力,可以在集群上并行处理大量数据。在本文中,我们将介绍Hadoop的基本概念和使用方法,并给出一些代码示例。

Hadoop基本概念

Hadoop由两部分组成:Hadoop Distributed File System(HDFS)和MapReduce。HDFS用于存储数据,将数据分散在集群中的多台机器上。MapReduce用于处理数据,将数据拆分成小块并在集群上并行处理。

Hadoop集群通常由一个主节点(NameNode)和多个工作节点(DataNode)组成。NameNode负责管理文件系统的命名空间和数据块的映射关系,DataNode负责存储数据块。MapReduce任务由一个主节点(JobTracker)和多个工作节点(TaskTracker)执行。

Hadoop代码示例

示例1:WordCount

下面是一个简单的WordCount示例,用于统计文本中每个单词的出现次数。

```java
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;

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

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

示例2:HDFS操作

下面是一个简单的HDFS操作示例,用于在HDFS上创建文件夹并上传文件。

```java
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;

public class HDFSExample {

  public static void main(String[] args) throws IOException {
    Configuration conf = new Configuration();
    FileSystem fs = FileSystem.get(conf);

    // 创建文件夹
    Path dir = new Path("/test");
    fs.mkdirs(dir);

    // 上传文件
    Path src = new Path("local/path/to/file");
    Path dest = new Path("/test/file.txt");
    fs.copyFromLocalFile(src, dest);

    fs.close();
  }
}

关系图

erDiagram
    HDFS {
        string NameNode
        string DataNode
    }
    MapReduce {
        string JobTracker
        string TaskTracker
    }
    HDFS ||--| MapReduce

类图

classDiagram
    WordCount {
        - TokenizerMapper
        - IntSumReducer
    }
    HDFSExample

结语

通过本文的介绍,你应该对Hadoop有了一定的了解。你可以尝试编写自己的MapReduce程序,或者在HDFS上进行一些操作。希望本文对你有所帮助,谢谢阅读!