您的位置:

Hadoop学习指南

一、Hadoop简介

Hadoop是Apache基金会开发的一款开源框架,用于存储和处理大数据集。它使用分布式存储和计算的方式来管理庞大的数据集。相较于传统的数据处理方法,Hadoop更节省成本且具有更高的效率。

Hadoop分别由HDFS和MapReduce两大模块组成。HDFS是Hadoop Distributed File System的简称,用于将大文件拆分并分散存储在不同的节点上;MapReduce则用于将数据分散在各个计算节点上进行处理。

Hadoop生态圈还有许多其他的组件,包括但不限于HBase、Hive、Pig、Zookeeper等。

二、Hadoop安装和部署

首先需要从Hadoop官网下载对应版本的二进制压缩包,并将其解压到指定目录下。接着,需要配置hadoop-env.sh文件、core-site.xml、hdfs-site.xml和mapred-site.xml,这些配置文件均在Hadoop的安装目录下的conf文件夹内。

配置完毕后,需要启动HDFS和MapReduce。启动HDFS需要使用hadoop-daemon.sh脚本,分别启动NameNode和DataNode。启动MapReduce则需要使用start-mapred.sh脚本,包括启动JobTracker和TaskTracker。

# 启动NameNode
$ sbin/hadoop-daemon.sh start namenode

# 启动DataNode
$ sbin/hadoop-daemon.sh start datanode

# 启动JobTracker
$ sbin/start-mapred.sh

# 启动TaskTracker
$ sbin/hadoop-daemon.sh start tasktracker

三、HDFS操作指南

在HDFS中,文件被分割成块并在不同的节点上存储,一个文件可以被分割成多个块。块的大小可以通过hdfs-site.xml文件中的配置项dfs.blocksize进行配置,块的数量可以通过dfs.replication进行配置。

HDFS拥有很多命令可以用来对文件进行操作,包括但不限于以下几个:

1. 创建文件夹

$ hdfs dfs -mkdir /dir

2. 上传文件到HDFS

$ hdfs dfs -put localfile /hdfs/path

3. 从HDFS下载文件

$ hdfs dfs -get /hdfs/path localfile

4. 删除文件或文件夹

$ hdfs dfs -rm [-r] /hdfs/path

四、MapReduce编程

MapReduce是Hadoop最核心的组件之一,用于处理分布式计算任务。MapReduce编程分为两个部分,一个是Map阶段,用于将数据分割为小块并进行处理;另一个是Reduce阶段,用于将Map阶段输出的结果进行合并。

MapReduce编程主要有两种方式,一个是基于Java编写的MapReduce程序,另一个是基于HiveQL或Pig Latin等高级语言进行编写。

下面是一个基于Java编写的MapReduce程序,用于对输入的文本文件进行单词计数:

public class WordCount {
  public static class Map extends Mapper {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();
    
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
      String line = value.toString();
      StringTokenizer tokenizer = new StringTokenizer(line);
      
      while (tokenizer.hasMoreTokens()) {
        word.set(tokenizer.nextToken());
        context.write(word, one);
      }
    }
  }
  
  public static class Reduce extends Reducer
    {
    public void reduce(Text key, Iterable
     values, Context context) throws IOException, InterruptedException {
      int sum = 0;
      
      for (IntWritable value : values) {
        sum += value.get();
      }
      
      context.write(key, new IntWritable(sum));
    }
  }
  
  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = Job.getInstance(conf, "wordcount");
    
    job.setJarByClass(WordCount.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    
    job.setMapperClass(Map.class);
    job.setReducerClass(Reduce.class);
    
    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);
    
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    
    job.waitForCompletion(true);
  }
}

    
   
  

五、Hadoop实战

Hadoop可以应用于许多场景,比如日志处理、机器学习、搜索引擎等。

以日志处理为例,假设有一份500GB规模的日志文件,每个日志文件被拆分成多个块存储在不同的节点上。通过MapReduce程序对这些日志文件进行分析,可以得到一些有用的信息,比如某个时间段内的访问量、IP地址的分布等。

下面是一个简单的代码示例,用于统计访问量最高的前10个URL:

public class TopUrls {
  public static class Map extends Mapper {
    private final static IntWritable one = new IntWritable(1);
    private Text url = new Text();
    
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
      String line = value.toString();
      String[] fields = line.split("\t");
      
      if (fields.length == 6) {
        url.set(fields[2]);
        context.write(url, one);
      }
    }
  }
  
  public static class Reduce extends Reducer
    {
    private TreeMap
     topUrls = new TreeMap
     ();
    
    public void reduce(Text key, Iterable
       values, Context context) throws IOException, InterruptedException {
      long count = 0;
      
      for (IntWritable value : values) {
        count += value.get();
      }
      
      topUrls.put(count, key.toString());
    }
    
    public void cleanup(Context context) throws IOException, InterruptedException {
      int count = 0;
      
      for (Long key : topUrls.descendingKeySet()) {
        if (count++ == 10) {
          break;
        }
        
        context.write(new Text(topUrls.get(key)), new LongWritable(key));
      }
    }
  }
  
  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = Job.getInstance(conf, "topurls");
    
    job.setJarByClass(TopUrls.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(LongWritable.class);
    
    job.setMapperClass(Map.class);
    job.setReducerClass(Reduce.class);
    
    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);
    
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    
    job.waitForCompletion(true);
  }
}

      
     
    
   
  

六、总结

本文介绍了Hadoop的概述、安装和部署、HDFS操作、MapReduce编程和实战案例等方面的内容。Hadoop作为一款开源的分布式框架,在大数据处理方面有着广泛的应用场景。通过学习Hadoop,可以更好地理解大数据处理的方式和原理。