Hadoop学习:HDFS和MapReduce

记得曾经问过一个师兄一个问题:要学好一种编程语言怎么做才好,怎样才能像你一样灵活运用?他跟我说:从头学到尾是很不切实际的,要边做项目边学是最快的今天才真正体会这句话,趁着做项目,也接触了Hadoop,也对它有了初步的了解

关于Hadoop

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储。
Hadoop的框架最核心的设计就是:HDFS和MapReduceHDFS为海量的数据提供了存储,相当于一个文件中转站的功能,而MapReduce为海量的数据提供了计算。但两者只是理论基础,不是具体可使用的高级应用,Hadoop旗下有很多经典子项目,比如HBaseHive等,这些都是基于HDFS和MapReduce发展出来的。要想了解Hadoop,就必须知道HDFSMapReduce是什么。

(1)HDFS

HDFS,英文为Hadoop Distributed File System,即分布式文件系统,功能相当于一个网盘或者中转站。
HDFS有高容错性的特点,并且设计用来部署在低廉的硬件上,就算在由高失败率的节点或网络组成的大集群内运行的作业,Hadoop都可以让作业成功完成。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
PS:
(1)容错
即是Fault Tolerance,确切地说是容故障(Fault),而并非容错误(Error)。Hadoop实现容错的主要方法就是重新执行任务,具体的可以查看此博客:http://blog.csdn.net/magicdreaming/article/details/7616531,在此不过多赘述。
(2)吞吐量
指在单位时间内中央处理器(CPU)从存储设备读取->处理->存储信息的量。
(3)流式数据访问
HDFS应用需要流式访问它们的数据集。其更多考虑到了数据批处理,而不是用户交互处理。相比数据访问的低延迟,HDFS应用要求能够高速率、大批量地处理数据,极少有程序对单一的读写操作有严格的响应时间要求。POSIX标准设置的很多硬性约束对HDFS应用系统不是必需的。为了提高数据的吞吐量,在一些关键方面对POSIX的语义做了一些修改。
(4)POSIX
POSIX表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称.

(2)MapReduce

![此处输入图片的描述][1]
按个人理解,如图所示,MapReduce可以拆分成两个单词也是其两个主要操作,Map的话即地图,在这里为映射的意思,表示从众多的数据中匹配出所要的东西,而Reduce即减少,表示将匹配到的一个个数据进行统计整合成一个总的数据。
例如:
对大量数据中的性别进行匹配会得到:
女 1
女 1
女 1

最终进行统计的结果就是一行:
女 1000
简单的说,Map是把一组数据一对一的映射为另外的一组数据,其映射的规则由一个函数来指定,比如对[1,2,3,4]进行乘2的映射就变成了[2,4,6,8]。Reduce是对一组数据进行归约,这个归约的规则由一个函数指定,比如对[1,2,3,4]进行求和的归约得到结果是10,而对它进行求积的归约结果是24。

Hadoop的安装使用

(1)安装

那Hadoop既然这么好,该如何去用呢?
在此提供Ubuntu下Hadoop的安装博客:
http://www.powerxing.com/install-hadoop/
其中详细说明了Hadoop的整个安装流程以及Hadoop的三种模式的配置方式:
(1)单机
(2)伪分布
(3)集群

(2)使用

安装好了当然是要编写程序来实现了,在此使用Java进行实现,有相应的博客详细说明:http://www.powerxing.com/hadoop-build-project-using-eclipse/
其中使用Eclipse编译运行MapReduce程序,包括从安装eclipse到编写程序的整个流程。

(3)小tips

在我个人的安装使用的过程中也出现一些小毛病,在这里就跟大家分享一下遇到这些Problems时该如何去做呢?
(1)在赋予新用户权限的时候可能切换账户之后它依旧会说它没有权限,重新试了很多次还是没用,此时建议删除用户再重复操作

sudo adduser hadoop sudo

(2)因为之前已经安装了Eclipse,配置的是1.8的JDK,但按流程的话,在这一步,$JAVA_HOME/bin/java -version的输出结果和java -version的输出结果不一样,这时不用怕,程序会进行最高默认。但在后面编写程序时报错,按照错误更改JDK的版本即可。
(3)在建立与 Hadoop 集群的连接,建立 New Hadoop Location的时候会发现文件夹没东西(不像图所示),其实是关闭了 NameNode 和 DataNode 守护进程。这时输入一下命令即可~

./sbin/start-dfs.sh

此处输入图片的描述

具体实现代码:

package org.apache.hadoop.examples;

import java.io.IOException;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

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 org.apache.hadoop.util.GenericOptionsParser;

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{
            String line = value.toString();
            line = line.replace("\\", "");
            String regex = "性别:</span><span class=\"pt_detail\">(.*?)</span>";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(line);
            while(matcher.find()){
                String term = matcher.group(1);
                word.set(term);
                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();
        String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
        if(otherArgs.length != 2){
            System.err.println("Usage: wordcount <in> <out>");
            System.exit(2);
        }
        Job job = new Job(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(otherArgs[0]));
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
        System.exit(job.waitForCompletion(true)?0:1);
    }


}
Hadoop的分享就先停一步,等待继续攻克~

参考资料
(1)Hadoop的容错性
(2)Hadoop简介:HDFS和MapReduce的实现

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值