您的位置:

Hadoop菜鸟教程详解

Hadoop是一个分布式计算平台,不但支持海量数据的存储,同时也提供了可靠的分布式数据处理机制,处理过程被优化为在大量廉价的硬件上扩展。

一、Hadoop环境搭建

为了使用Hadoop,我们需要完成Hadoop的环境搭建,在这里介绍如何搭建Hadoop 2.7.2的环境,详细步骤如下:

1. 安装Java并设置环境变量

cd /opt
tar -zxvf jdk-8u131-linux-x64.tar.gz
vim  /etc/profile
export JAVA_HOME=/opt/jdk1.8.0_131
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source /etc/profile

2. 安装hadoop

cd /opt
tar -zxvf hadoop-2.7.2.tar.gz
vim  /etc/profile
export HADOOP_HOME=/opt/hadoop-2.7.2
export PATH=${HADOOP_HOME}/bin:${PATH}
source /etc/profile

3. 修改hadoop配置文件

cd /opt/hadoop-2.7.2/etc/hadoop
vim hadoop-env.sh
export JAVA_HOME=/opt/jdk1.8.0_131
export HADOOP_HOME=/opt/hadoop-2.7.2
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HADOOP_PREFIX=${HADOOP_HOME}
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_HDFS_HOME=${HADOOP_HOME}
export HADOOP_MAPRED_HOME=${HADOOP_HOME}
export HADOOP_YARN_HOME=${HADOOP_HOME}

4. 启动Hadoop集群

cd ${HADOOP_HOME}/sbin
./start-dfs.sh
./start-yarn.sh

二、HDFS的使用

在Hadoop中,HDFS将数据拆分成多个块,分布式存储到不同节点上,为了让大文件能够并行处理,HDFS使用了块的概念,一个块可以理解为是一个文件的一部分。

1. HDFS基础操作

# 创建目录
hdfs dfs -mkdir /input
# 在本地创建文件
echo "hello hadoop" > test
# 上传文件到HDFS
hdfs dfs -put test /input
# 查看上传到HDFS的文件
hdfs dfs -ls /input
# 下载文件到本地
hdfs dfs -get /input/test test2
# 删除HDFS上的文件
hdfs dfs -rm /input/test
# 查看HDFS上文件内容
hdfs dfs -cat /input/test2

2. HDFS读写文件

下面是使用Java API读写HDFS文件的示例代码:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

import java.io.InputStream;
import java.net.URI;

public class HdfsDemo {

    private static final String HDFS_PATH = "hdfs://localhost:9000";
    private static final Configuration CONF = new Configuration();

    public static void main(String[] args) throws Exception {

        URI uri = new URI(HDFS_PATH);
        FileSystem fs = FileSystem.get(uri, CONF);

        // 写入文件
        String content = "Hello HDFS!";
        byte[] buff = content.getBytes("UTF-8");
        InputStream in = new ByteArrayInputStream(buff);
        fs.create(new Path("/test.txt"));
        IOUtils.copyBytes(in, out, 4096, true);

        // 读取文件
        InputStream in = fs.open(new Path("/test.txt"));
        IOUtils.copyBytes(in, System.out, 4096, false);

        fs.close();
    }
}

三、MapReduce的使用

MapReduce是Hadoop提供的用于大规模数据处理的编程模型,用户可以编写Map和Reduce函数,让Hadoop分发数据,执行Map任务,然后收集结果,执行Reduce任务,最终将结果返回。

1. MapReduce基础操作

下面是使用命令行执行MapReduce任务的示例命令:

# 创建输入目录并上传数据
hadoop fs -mkdir /input
hadoop fs -put /usr/local/hadoop/LICENSE.txt /input

# 执行MapReduce任务
hadoop jar /usr/local/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output

# 查看输出结果
hadoop fs -cat /output/part-r-00000

2. MapReduce自定义函数

下面是编写自定义Map函数的Java代码:

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

    }

}

下面是编写自定义Reduce函数的Java代码:

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

    }

}

下面是编写Driver程序来运行自定义MapReduce任务的Java代码:

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集群管理

在Hadoop中,集群管理分为两个部分:节点管理和作业管理。节点管理是指监控集群中的每个节点,确保它们正常工作。作业管理是指确保MapReduce作业正确提交和管理,监控作业的进度,以及保证数据在节点之间的正确移动。

1. 节点管理

下面是使用命令行监控Hadoop集群节点状态的示例命令:

$HADOOP_HOME/bin/hdfs dfsadmin -report

2. 作业管理

下面是使用命令行提交MapReduce作业的示例命令:

$HADOOP_HOME/bin/hadoop jar /usr/local/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output

下面是使用浏览器查看作业运行状态的示例地址:

http://localhost:8088/cluster

五、总结

Hadoop菜鸟教程介绍了Hadoop的环境搭建、HDFS的使用、MapReduce的使用和Hadoop集群管理等方面的内容,这些内容可以帮助初学者快速了解和学习Hadoop的基础知识。