맵리 듀스 프로그래밍 예 : 단어 수

이 섹션에서는 데이터 분석을위한 기본 맵리 듀스 프로그램을 작성하는 방법을 설명합니다. 코드의이 섹션은 하둡 2.7.3을 기반으로 개발되고있다.

미션 준비

워드 카운트 (단어 수) 임무는 입력 문서의 단어 세트를 별도로 계산이다. 파일이보다 큰 것을 가정하면, 각 문서는 단어를 많이, 당신은 기존의 선형 프로그램 처리를 사용할 수 없습니다 포함, 당신은 맵리 듀스의 지역의 장점을 재생할 수있는 문제의 종류이다.

앞에서 " 맵리 듀스 예제 분석 : 단어 개수 "자습서 기본적인 아이디어는 제시되었다 단어에 의해 구현 구현 프로세스가 맵리 듀스를 계산합니다. 다음은 구체적인 구현 코드를 작성하는 방법과 프로그램을 실행하는 방법에 대해 설명합니다.

우선, 로컬 파일 3 :, 표 1 file00l, file002 및 file003에 도시 된 파일의 구체적인 내용을 생성한다.

표 1 워드 카운트 입력 파일
파일 이름 file001 file002 file003
파일 내용 안녕하세요 세계
연결된 세계
하나의 세계
하나의 꿈
안녕하세요 하둡
안녕하세요지도
안녕하세요 감소

그런 다음 HDFS 명령을 입력 파일을 사용하여 디렉토리를 작성하십시오.

FS 입력 하둡 -mkdir

그런 다음, file001, file002 file003 및 입력 디렉토리에 HDFS에 업로드.

하둡 FS 저것 집어 넣어 file001 입력
하둡 FS 저것 집어 넣어 file002 입력
하둡 FS 입력 저것 집어 넣어 file003

맵리 듀스 첫 번째 작업 프로그램은지도 프로그램을 작성하는 것입니다. 워드 카운트 태스크 매핑 할 필요가 입력 텍스트 데이터이고 특정 키 - 값 쌍의 형태로 출력을 한 다음 단어로 분할하고있다.

지도 프로그램을 작성

하둡 맵리 듀스의 프레임 워크는 매퍼 클래스에서지도 작업의 기본 기능을 달성했다. 지도 작업을 달성하기 위해, 개발자는 클래스 매퍼를 상속하고, 클래스를 달성하기 위해 기능을지도 필요가 없다.

워드 카운트지도 작업을 달성하기 위해, 일류 매퍼 입력 및 출력 유형의 종류를 설정합니다. 여기서, 상기 입력 기능은지도는 <키 값> 형태는 키 입력 파일이 행의 행 번호이고, 값이 하나의 라인에 대응하는 행 번호이다.

따라서, 입력 타입 맵 <LongWritable, 텍스트>의 함수로서. 텍스트를 완료하는 작업을 분할하는지도 기능 함수는, 매핑 함수의 출력이 키는 단어, 단어가 나타나는 횟수에 대한 값이고, <키 값> 형태이다. 따라서, 출력은지도 <텍스트 LongWritable>의 유형의 함수이다.

다음은지도 작업 구현 코드 단어 수 프로그램입니다.

  1. 공공 정적 클래스 CoreMapper는 매퍼 <객체, 텍스트, 텍스트, IntWritable을> {확장
  2. 개인 정적 최종 IntWritable 하나 = 새로운 IntWritable (1);
  3. 개인 정적 텍스트 레이블 = 새로운 텍스트 ();
  4. 공공 무효지도 (개체 키, 텍스트 값은 매퍼는 <개체, 텍스트, 텍스트, IntWritable> Contextcontext)는 IOException가, 예외 : InterruptedException을 {던졌습니다
  5. 있고 StringTokenizer 토크 나이 = 새로운 있고 StringTokenizer (value.toString ());
  6. 반면 (tokenizer.hasMoreTokens ()) {
  7. label.set (tokenizer.nextToken ());
  8. context.write (레이블, 하나);
  9. }
  10. }
  11. }

위의 코드에서, 작업지도 클래스 CoreMapper를 구현합니다. 두 변수와 하나 개의 출력 라벨 클래스는 처음으로 초기화해야합니다.

  • 하나의 변수의 초기 값은 직접 텍스트 등장 단어를 나타내는 1로 설정.
  • 처음 두 파라미터는 함수 맵 함수 입력 파라미터이고, 값 유형 텍스트, 텍스트, 키 입력 오브젝트의 각 행을 판독하고 텍스트의 라인 데이터 입력 라인 수를 나타냄을 의미한다.

텍스트의 가변 중국어 분할 선에서 토큰 화 스플릿 단어의 현재 가치 있고 StringTokenizer 클래스 시스템 방법. 그러면 프로그램은 워드 프로세싱을 통해 각각의 사이클은 단어 라벨의 단어는 하나 카운트.

함수의 실행을 통하여, 하나의 값은 항상 1이다. 이 예에서, 키를 크게하는 데 사용되지 않습니다. 지도 출력 컨텍스트는 중간 결과를 직접 내부에 저장되어, 태그가 사용되는 함수이다.

위의 코드에 따르면,지도 작업 후, 세 개의 파일의 출력은 표 2.

표 2 단어의 결과는지도 작업 출력을 계산
파일 이름 /지도 file001 / MAP1 file002 / Map2에 file003 / map3 체크
지도 작업 출력 < "안녕하세요", 1>
< "세계", 1>
< "연결됨"1>
< "세계", 1>
< "하나", 1>
< "세계", 1>
< "하나", 1>
< "꿈", 1>
< "안녕하세요", 1>
< "하둡"1>
< "안녕하세요", 1>
<1, "지도">
< "안녕하세요", 1>
< "감소"1>

쓰기 프로그램을 감소

맵리 듀스 두 번째 작업의 프로그램은 프로그램을 감소 작성하는 것입니다. 워드 카운트 작업에서는 작업은 각 단어의 발생 횟수를 얻는 결과를 합산 디지털 입력 시퀀스 줄이기 완료한다.

매핑 기능의 구현을 완료 한 후,이 단계에서, 셔플 스테이지를 입력 것이라고 MapReduce의 출력 프레임은 자동 정렬 및지도 상 분할하고 공정을 줄이기 위해 적절한 작업에 분배한다. 표 3. 셔플 단계에 표시된 최종 결과 후지도.

MAP 테이블 카운트 스테이지 출력 단자 (3) 워드 셔플
파일 이름 /지도 file001 / MAP1 file002 / Map2에 file003 / map3 체크
지도 최종
셔플 출력 단계
< "연결", 1>
< "안녕하세요", 1>
< "세계", <1,1 >>
< "꿈", 1>
< "하나", <1, 1 >>
< "세계", 1>
< "지도"1>
< "하둡"1>
< "안녕하세요", <1,1,1 >>
<1 "감소">

하는 <키 <V1, V2, ... 내지 Vn 형태 >> 같은 단어 키 - 값 쌍은 결합, 즉, 즉 동일한 키를 결합한다 전송되는 데이터의 각 단부를 수신 한지도 줄이기 출력. 표 4에 나타낸 맵 셔플상의 최종 결과 후.

표 최종 카운트 출력단 4 워드 셔플 줄이기
감소 端 < "연결", 1>
출력단 셔플 < "꿈", 1>
< "하둡"1>
< "안녕하세요", <1,1,1,1 >>
< "지도"1>
< "하나", <1,1 >>
< "세계 "<1,1,1 >>
<", "줄 1>

감소 단계는, 각 단어의 발생 수를 얻기 위해 데이터를 처리 할 필요가있다. 함수 입력을 감소하는 기능을 줄 이해되었을 수는 입력 시퀀스에서 첫번째 합산 디지털 데이터 값이다 할 필요가있다. 다음은 줄이고 작업 구현 코드 단어 수 프로그램입니다.

  1. 공공 정적 클래스 CoreReducer이 확장 감속기 <텍스트, IntWritable, 텍스트, IntWritable> {
  2.  
  3. 개인 IntWritable 카운트 = 새로운 IntWritable ();
  4. 공개 공극이 감소 (문자 키의 Iterable <IntWritable> 값을, 감속기 <텍스트, IntWritable는 텍스트, IntWritable> 컨텍스트 컨텍스트) IOException가, 예외 : InterruptedException는 {슬로우
  5. INT 합 = 0;
  6. {(값 IntWritable intWritable) 미국
  7. 합계 + = intWritable.get ();
  8. }
  9. count.set (합);
  10. context.write (키 카운트);
  11. }
  12. }

지도와 유사한 작업을 달성, 작업 감소가 제공하고 해당 인터페이스를 구현하는 클래스 감속기 하둡을 상속됩니다. 입력의 기능을 감소 출력 형태는 본질적으로 출력 매핑 함수의 동일한 타입이다.

상기 제 파라미터의 시작 기능을 줄은 각 단어의 발생 후,리스트 탐색 값의 합을 기록 횟수를 설정하는 데 사용되며, 상기 디지털 적산 상기 결국 각 단어의 발생 총수를 얻을 수있다. 출력에, 정지 화상 정보를 저장하는 컨텍스트 변수의 타입을 사용한다. 상을 줄 때, 표 5에 나타낸 바와 같이, 최종 결과는 원하는 얻을 수있다.

표 5는 작업 출력 단어 수의 결과를 감소
작업 출력을 감소 < "연결", 1>
  < "꿈", 1>
  < "하둡"1>
  < "안녕하세요", 4>
  <1 "지도">
  < "하나", 2>
  < "세계", 3>
  <1, "감소">

주요 기능 쓰기

CoreMapper CoreReducer 클래스 다음 변수 하둡 MapReduce의 환경 설정 프로그램이 주 기능에서 실행되는 작업 클래스에 의해 요구되는 실제 데이터 처리를 사용하기 위해 특정 코드이다.

  1. public static void main(String[] args) throws Exception {
  2. Configuration conf = new Configuration();
  3. String[] otherArgs = new GenericOptionsParser(conf,args).getRemainingArgs();
  4. if (otherArgs.length != 2) {
  5. System.err.printIn(“Usage:wordcount <in> <out>”);
  6. System.exit(2);
  7. }
  8. Job job = new Job (conf, “WordCount”); //设置环境参数
  9. job.setJarByClass (WordCount.class); //设置程序的类名
  10. job.setMapperClass(CoreMapper.class); //添加 Mapper 类
  11. job.setReducerClass(CoreReducer.class); //添加 Reducer类
  12. job.setOutputKeyClass (Text.class); //设置输出 key 的类型
  13. job.setOutputValueClass (IntWritable.class);
  14. //设置输出 value 的类型
  15. FileInputFormat.addInputPath (job, new Path (otherArgs [0]));
  16. //设置输入文件路径
  17. FileOutputFormat.setOutputPath (job,new Path (otherArgs [1]));
  18. //设置输入文件路径
  19. System.exit(job.waitForCompletion(true) ? 0 : 1);
  20. }

代码首先检查参数是不是正确,如果不正确就提醒用户。随后,通过 Job 类设置环境参数,并设置程序的类、Mapper 类和 Reducer 类。然后,设置了程序的输出类型,也就是 Reduce 函数的输出结果 <key,value> 中 key 和 value 各自的类型。最后,根据程序运行时的参数,设置输入、输出文件路径。

核心代码包

编写 MapReduce 程序需要引用 Hadoop 的以下几个核心组件包,它们实现了 Hadoop MapReduce 框架。

  1. import java.io.IOException;
  2. import java.util.StringTokenizer;
  3. import org.apache.hadoop.conf.Configuration;
  4. import org.apache.hadoop.fs.Path;
  5. import org.apache.hadoop.io.IntWritable;
  6. import org.apache.hadoop.io.Text;
  7. import org.apache.hadoop.mapreduce.Job;
  8. import org.apache.hadoop.mapreduce.Mapper;
  9. import org.apache.hadoop.mapreduce.Reducer;
  10.  
  11. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  12. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  13. import org.apache.hadoop.util.GenericOptionsParser;

这些核心组件包的基本功能描述如表 6 所示。

表 6 Hadoop MapReduce 核心组件包的基本功能
功能
org.apache.hadoop.conf 定义了系统参数的配置文件处理方法
org.apache.hadoop.fs 定义了抽象的文件系统 API
org.apache.hadoop.mapreduce Hadoop MapReduce 框架的实现,包括任务的分发调度等
org.apache.hadoop.io 定义了通用的 I/O API,用于网络、数据库和文件数据对象 进行读写操作

运行代码

在运行代码前,需要先把当前工作目录设置为 /user/local/Hadoop。编译 WordCount 程序需要以下 3 个 Jar,为了简便起见,把这 3 个 Jar 添加到 CLASSPATH 中。

$export
CLASSPATH=/usr/local/hadoop/share/hadoop/common/hadoop-common-2.7.3.jar:$CLASSPATH
$export
CLASSPATH=/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-2.7.3.jar:$CLAS SPATH
$export
CLASSPATH=/usr/local/hadoop/share/hadoop/common/lib/common-cli-1.2.jar:$CLASSPATH

使用 JDK 包中的工具对代码进行编译。

$ javac WordCount.java

编译之后,在文件目录下可以发现有 3 个“.class”文件,这是 Java 的可执行文件,将它们打包并命名为 wordcount.jar。

$ jar -cvf wordcount.jar *.class

这样就得到了单词计数程序的 Jar 包。在运行程序之前,需要启动 Hadoop 系统,包括启动 HDFS 和 MapReduce。然后,就可以运行程序了。

$ ./bin/Hadoop jar wordcount.jar WordCount input output

最后,可以运行下面的命令查看结果。

$ ./bin/Hadoop fs -cat output/*

39.Spark简介
40.Spark RDD
41.Spark总体架构和运行流程
42.Spark生态圈
43.Spark开发实例
44.Spark Streaming简介

年薪40+W的大数据开发【教程】,都在这儿!

추천

출처blog.csdn.net/yuidsd/article/details/92170329