예 맵리 듀스 프로그래밍 모델 및 단어 수

 

빅 데이터는 첫 번째 프로그램 아이디어 맵리 듀스와 접촉 학습.

 

머리말

대용량 데이터는, 많은 것들을 매우 몇 가지 메모를했다 단편화 있지만를 구성하지 않았을 때 학습하기 전에,이 문서는 이전에 마무리로 노트, 또는 출력을 호출. 우선, 자신의 이해를 깊게하고, 둘째, 빅 데이터 또는 빅 데이터가 친구를 배우는 데 도움이 이러한 것들을 배우고 싶은 것입니다. 당신이 안에 뭔가를 볼 경우,이 진보적 일, 당신이 그것을 알려합니다. 아마 당신이 다른 문이 열립니다?

 

문제의 우선보기

맵리 듀스에 대해 이야기하기 전에, 우리는 먼저 문제가 봐. 우리 모두는 빅 데이터의 장면에서, 최초의 사람들은 많은 양의 데이터 이해하는 것을 알고있다. 미래에 많은 양의 데이터, 우리는 몇 가지 문제를 처리 할 때 우리 앞에 문제를 해결하기 위해 전통적인 방법을 따라 할 수있는 방법이 없을 때.

우리는이 문제에 간단한 단어 수의 모양을 가지고있다.

예를 들어, 우리가 지금 영어 문서에 저장됩니다 10M에 파일을 가지고, 우리는 지금 필요로하는 단어가 나타나는 횟수를 계산하는 것입니다.

할 수있는 자바 코드를 작성하기 위해 이전의 루틴에 따르면 파일을 읽을 수 아마도, 데이터는 메모리에 최종 결과를 저장하는 새로운지도를로드됩니다. 키 값은 단어가 나타납니다 단어의 수입니다.

 그런 데이터의 행의 값 + 1이 존재하는지 확인하는 파일에서 처리 된 맵을 절단 한 후, 하나의 공간, 다음 단어 중 하나에 의해 절단 된 데이터의 다음 행을 판독 값이 1로 설정되어있을 .

 그리고, 상기 조작 데이터 열이 끝날 때까지 반복된다 판독. 그것은 매우 간단합니다.

네, 아무 문제, 단지 파일 사물의 프로세스를 완료 10M, 초 초,하지만 지금은 내 파일 크기는 어떻게 지금 당신을, 두 개의 T 문서를 해결해야, 어 볼 2T이며,? 또한 메모리 그것으로로드 할?

일 128G를 훔 쳤어요, 회사의 시스템 구성, 얼마나 많은 메모리, 8G, 16G, 32G ... 생각해. 나는 말을 많이하고, 지금 메모리 128G를 보냈다 얼마나 많은 돈을 얼마나 많은 메모리 가격입니다에 대해 다음 생각하지 않습니다. 물론, 그래서 지금 그것을 재생할 수 없습니다, 재생할 수 있습니다.

하지만 지금은 일반적으로 회사의 기계 장치 그것은 여전히 ​​많은입니다. 우리는 통계 계산을 수행하기 위해 다음이 기계 위에 던져 많은 작은 파일을, 지금이 기계는 클러스터 노드 N을 만들어 놓고, 다음 2T에 파일을 넣어 그렇다면, 최종 요약 해결되지 상기 메모리 부족 문제.

 

맵리 듀스 생각

MapReduce를는 Google 용지에서, 그것이 완전히 무승부 "분할 정복 '(기본지도와 같은 데이터 처리를 분할하는 아이디어를 병렬 컴퓨팅 대규모 데이터 집합에 대한 프로그래밍 모델 (1TB 이상) 인 매핑)와 감소 (간체) 단계.

위의 예를 비교해, 각 스테이지의 맵은 처리 기계의 스테이지는 스테이지를 줄이고, 데이터의 조각을 잘라 통계적 요약의 마지막 단계이다.

따라서, 예를 들어, 이전에 아마를 설명하기 위해 다음과 같은 다이어그램을 사용할 수 있습니다 말했다 :

 

위의 아이디어에 대해 간단히 :

첫 번째 단계 : 같은 128M로 클러스터에 걸쳐 분산 된 여러 개의 블록 (블록)에 두 개의 T 문서 파일.

2 단계 : 각 시스템에 작업 맵 작업을 실행, 컴퓨터 통계에 각 파일 :

(1)의 공간에있어서, 메모리에로드 된 첫 번째 데이터 라인 판독하여 그 데이터 라인이 절단된다.

2. 데이터를 저장하는 콘텐츠는 HashMap <어수>

3. 자신의 로컬 데이터 처리가 완료되면, 데이터 출력 준비

4. 데이터를 출력하기 전에 첫 글자에 따른 레인지 3 제 HashMap의 HashMap5로 분할된다. 각각 세 송신 세 HashMap의 태스크 처리를 분산 할 때, 동일한로 데이터 워드의 동일한 부분이 될 것이다 작업을 줄여 줄 치료는 데이터 통계의 무결성을 보장합니다.

세 번째 단계는 : 수신 된 데이터를 요약하는 작업을 절감하고, 파일 시스템에 출력 HDFS 저장을 처리한다.

상기 프로세스의 문제가 발생할 수있다

우리는 사실, 일단 만든 분산 시스템과 같은 복잡한 문제를 많이 직면하게 될 것이다, 우리의 비즈니스 로직의 실현에 관심 위 :

• 어떻게지도 작업 할당?

• 처리하는 방법 작업 데이터를 할당하는 작업을 감소?

• 통합 작업 작업 사이 줄이고, 작업을 줄이기 시작하는 방법을지도?

•如果 Map task 运行失败了,怎么处理?

•Map task 还要去维护自己要发送的数据分区,是不是也太麻烦了。

•等等等等等

 

为什么要用 MapReduce

可见在程序由单机版扩成分布式时,会引入大量的复杂工作。为了提高开发效率,可以将分布式程序中的公共功能封装成框架,让开发人员可以将精力集中于业务逻辑。

而 MapReduce 就是这样一个分布式程序的通用框架。

 

WordCount 示例

用一个代码示例来演示,它需要3个东西,一个是map task ,一个是 reduce task ,还有就是启动类,不然怎么关联他们的关系呢。

首先是 map task :

package com.zhouq.mr;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/** * KEYIN 默认情况下,是MR 框架中读取到的一行文本的起始偏移量,long 类型 * 在hadoop 中有自己更精简的序列化接口,我们不直接用Long ,而是用 LongWritable * VALUEIN : 默认情况下,是MR 中读取到的一行文本内容,String ,也有自己的类型 Text 类型 * <p> * KEYOUT : 是用户自定义的逻辑处理完成后的自定义输出数据的key ,我们这里是单词,类型为string 同上,Text * <p> * VALUEOUT: 是用户自定义的逻辑处理完成后的自定义输出value 类型,我们这里是单词数量Integer,同上,Integer 也有自己的类型 IntWritable * <p> */public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {    /**     * map 阶段的业务逻辑就写在map 方法内     * maptask 会对每一行输入数据 就调用一次我们自定义的map 方法。     */    @Override    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {        //拿到输入的这行数据        String line = value.toString();        //根据空格进行分割得到这行的单词        String[] words = line.split(" ");        //将单词输出为 <word,1>        for (String word : words) {            //将单词作为key ,将次数 做为value输出,            // 这样也利于后面的数据分发,可以根据单词进行分发,            // 以便于相同的单词落到相同的reduce task 上,方便统计            context.write(new Text(word), new IntWritable(1));        }    }}

接下来是 reduce task 逻辑:

/** * KEYIN VALUEIN 对于map 阶段输出的KEYOUT VALUEOUT * <p> * KEYOUT :是自定义 reduce 逻辑处理结果的key * VALUEOUT : 是自定义reduce 逻辑处理结果的 value */public class WordcountReduce extends Reducer<Text, IntWritable, Text, IntWritable> {    /**     * <zhouq,1>,<zhouq,1>,<zhouq,2> ......     * 入参key 是一组单词的kv对 的 key     */    @Override    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {        //拿到当前传送进来的 单词//        String word = key.toString();        //        int count = 0;        for (IntWritable value : values) {            count += value.get();        }        //这里的key  就是单词        context.write(key, new IntWritable(count));    }}

 

最后是启动类:

 

/** * wc 启动类 */public class WordCountDriver {    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {        Configuration conf = new Configuration();        // mapreduce.framework.name 配置成 local 就是本地运行模式,默认就是local        // 所谓的集群运行模式 yarn ,就是提交程序到yarn 上. 要想集群运行必须指定下面三个配置.//        conf.set("mapreduce.framework.name", "yarn");//        conf.set("yarn.resoucemanager.hostname", "mini1");        //conf.set("fs.defaultFS","com.zhouq.hdfs://mini1:9000/");        Job job = Job.getInstance(conf);        //指定本程序的jar 包 所在的本地路径        job.setJarByClass(WordCountDriver.class);        //指定本次业务的mepper 和 reduce 业务类        job.setMapperClass(WordCountMapper.class);        job.setReducerClass(WordcountReduce.class);        //指定mapper 输出的 key  value 类型        job.setMapOutputKeyClass(Text.class);        job.setMapOutputValueClass(IntWritable.class);        //指定 最终输出的 kv  类型        job.setOutputKeyClass(Text.class);        job.setOutputValueClass(IntWritable.class);        //指定job的输入原始文件所在目录        FileInputFormat.setInputPaths(job,new Path(args[0]));        //指定job 输出的文件目录        FileOutputFormat.setOutputPath(job,new Path(args[1]));        boolean waitForCompletion = job.waitForCompletion(true);        System.exit(waitForCompletion ? 0 : 1);    }}

 

配置启动类参数:填写输入目录和输出目录,注意输出目录不能存在,不然会执行失败的。

 

执行我们就用编辑器执行,用本地模式,不提交到hadoop 集群上,执行完成后,去到输出目录下可以看到这些文件: 

 

然后输出一下 part-r-00000 这个文件:

代码地址:https://github.com/heyxyw/bigdata/blob/master/bigdatastudy/mapreduce/src/main/java/com/zhouq/mr/WordCountDriver.java

 

最后

希望对你有帮助。后面将会去讲 MapReduce 是如何去运行的。

 

作者·往期内容:

记一次阿里巴巴一面的经历

 


 

作者介绍:乔二爷,在成都乔二爷这个名字是之前身边的同事给取的,也不知道为啥。也习惯了他们这样叫我。

一直待在相对传统一点的企业,有四年半的 Java 开发经验,会点大数据的内容,也跟客户打过一年的交道,还带过 10个月 10人+的技术团队,有一定的协调组织能力,能够理解 boss 的工作内容,也能很好的配合别人做事。

 


 

Java 极客技术公众号,是由一群热爱 Java 开发的技术人组建成立,专注分享原创、高质量的 Java 文章。如果您觉得我们的文章还不错,请帮忙赞赏、在看、转发支持,鼓励我们分享出更好的文章。

关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料。

추천

출처www.cnblogs.com/justdojava/p/11271080.html