Hadoop 및 Mapreduce 예제: 첫 번째 프로그램 생성 Java

이 튜토리얼에서는 MapReduce 예제와 함께 Hadoop을 사용하는 방법을 배웁니다. 사용된 입력 데이터는 SalesJan2009.csv. 여기에는 제품명, 가격, 결제 방식, 도시, 고객 국가 등과 같은 판매 관련 정보가 포함되어 있습니다. 목표는 다음과 같습니다. 각 국가에서 판매된 제품 수를 알아보세요.

최초의 Hadoop MapReduce 프로그램

이제 이것에서 맵리듀스 튜토리얼, 우리는 첫 번째를 만들 것입니다 Java 맵리듀스 프로그램:

최초의 Hadoop MapReduce 프로그램

판매 데이터Jan2009

Hadoop이 설치되어 있는지 확인하십시오. 실제 프로세스를 시작하기 전에 사용자를 'hduser'로 변경합니다(Hadoop 구성 중에 사용된 ID, Hadoop 프로그래밍 구성 중에 사용된 사용자 ID로 전환할 수 있음).

su - hduser_

최초의 Hadoop MapReduce 프로그램

단계 1)

이름으로 새 디렉터리 만들기 MapReduce튜토리얼 아래 MapReduce 예제에서 shwon과 같이

sudo mkdir MapReduceTutorial

최초의 Hadoop MapReduce 프로그램

권한 부여

sudo chmod -R 777 MapReduceTutorial

최초의 Hadoop MapReduce 프로그램

SalesMapper.java

package SalesCountry;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.*;

public class SalesMapper extends MapReduceBase implements Mapper <LongWritable, Text, Text, IntWritable> {
	private final static IntWritable one = new IntWritable(1);

	public void map(LongWritable key, Text value, OutputCollector <Text, IntWritable> output, Reporter reporter) throws IOException {

		String valueString = value.toString();
		String[] SingleCountryData = valueString.split(",");
		output.collect(new Text(SingleCountryData[7]), one);
	}
}

SalesCountryReducer.java

package SalesCountry;

import java.io.IOException;
import java.util.*;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.*;

public class SalesCountryReducer extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {

	public void reduce(Text t_key, Iterator<IntWritable> values, OutputCollector<Text,IntWritable> output, Reporter reporter) throws IOException {
		Text key = t_key;
		int frequencyForCountry = 0;
		while (values.hasNext()) {
			// replace type of value with the actual type of our value
			IntWritable value = (IntWritable) values.next();
			frequencyForCountry += value.get();
			
		}
		output.collect(key, new IntWritable(frequencyForCountry));
	}
}

SalesCountryDriver.java

package SalesCountry;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;

public class SalesCountryDriver {
    public static void main(String[] args) {
        JobClient my_client = new JobClient();
        // Create a configuration object for the job
        JobConf job_conf = new JobConf(SalesCountryDriver.class);

        // Set a name of the Job
        job_conf.setJobName("SalePerCountry");

        // Specify data type of output key and value
        job_conf.setOutputKeyClass(Text.class);
        job_conf.setOutputValueClass(IntWritable.class);

        // Specify names of Mapper and Reducer Class
        job_conf.setMapperClass(SalesCountry.SalesMapper.class);
        job_conf.setReducerClass(SalesCountry.SalesCountryReducer.class);

        // Specify formats of the data type of Input and output
        job_conf.setInputFormat(TextInputFormat.class);
        job_conf.setOutputFormat(TextOutputFormat.class);

        // Set input and output directories using command line arguments, 
        //arg[0] = name of input directory on HDFS, and arg[1] =  name of output directory to be created to store the output file.

        FileInputFormat.setInputPaths(job_conf, new Path(args[0]));
        FileOutputFormat.setOutputPath(job_conf, new Path(args[1]));

        my_client.setConf(job_conf);
        try {
            // Run the job 
            JobClient.runJob(job_conf);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

여기서 파일을 다운로드하세요

최초의 Hadoop MapReduce 프로그램

이 모든 파일의 파일 권한을 확인하십시오

최초의 Hadoop MapReduce 프로그램

'읽기' 권한이 누락된 경우 동일한 권한을 부여합니다.

최초의 Hadoop MapReduce 프로그램

단계 2)

아래 Hadoop 예제와 같이 클래스 경로를 내보냅니다.

export CLASSPATH="$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.2.0.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-common-2.2.0.jar:$HADOOP_HOME/share/hadoop/common/hadoop-common-2.2.0.jar:~/MapReduceTutorial/SalesCountry/*:$HADOOP_HOME/lib/*"

최초의 Hadoop MapReduce 프로그램

단계 3)

편집하다 Java 파일(이 파일은 디렉토리에 있습니다. Final-MapReduceHandsOn). 해당 클래스 파일은 패키지 디렉터리에 저장됩니다.

javac -d . SalesMapper.java SalesCountryReducer.java SalesCountryDriver.java

최초의 Hadoop MapReduce 프로그램

이 경고는 무시해도 됩니다.

이 컴파일은 Java 소스 파일에 지정된 패키지 이름으로 명명된 현재 디렉토리에 디렉토리를 생성합니다(예: 판매국가 우리의 경우) 컴파일된 모든 클래스 파일을 여기에 넣습니다.

최초의 Hadoop MapReduce 프로그램

단계 4)

새 파일 만들기 매니페스트.txt

sudo gedit Manifest.txt

다음 줄을 추가하세요.

Main-Class: SalesCountry.SalesCountryDriver

최초의 Hadoop MapReduce 프로그램

SalesCountry.SalesCountryDriver 메인 클래스의 이름입니다. 이 줄 끝에서 Enter 키를 눌러야 한다는 점에 유의하세요.

단계 5)

Jar 파일 만들기

jar cfm ProductSalePerCountry.jar Manifest.txt SalesCountry/*.class

최초의 Hadoop MapReduce 프로그램

jar 파일이 생성되었는지 확인

최초의 Hadoop MapReduce 프로그램

단계 6)

하둡 시작

$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh

단계 7)

파일 복사 SalesJan2009.csv 으로 ~/inputMapReduce

이제 아래 명령을 사용하여 복사하십시오. ~/inputMapReduce HDFS로.

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal ~/inputMapReduce /

최초의 Hadoop MapReduce 프로그램

우리는 이 경고를 무시해도 됩니다.

실제로 파일이 복사되었는지 확인합니다.

$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce

최초의 Hadoop MapReduce 프로그램

단계 8)

MapReduce 작업 실행

$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales

최초의 Hadoop MapReduce 프로그램

그러면 mapreduce_output_sales라는 출력 디렉터리가 생성됩니다. HDFS. 이 디렉토리의 내용은 국가별 제품 판매량을 포함하는 파일입니다.

단계 9)

결과는 명령 인터페이스를 통해 다음과 같이 볼 수 있습니다.

$HADOOP_HOME/bin/hdfs dfs -cat /mapreduce_output_sales/part-00000

최초의 Hadoop MapReduce 프로그램

결과는 웹 인터페이스를 통해 다음과 같이 볼 수도 있습니다.

웹 브라우저에서 r을 엽니다.

최초의 Hadoop MapReduce 프로그램

지금 선택하십시오. '파일 시스템 찾아보기' ~로 이동 /mapreduce_output_sales

최초의 Hadoop MapReduce 프로그램

엽니다 부품-r-00000

최초의 Hadoop MapReduce 프로그램

SalesMapper 클래스 설명

이번 섹션에서는 구현에 대해 알아보겠습니다. SalesMapper 클래스입니다.

1. 먼저 클래스의 패키지 이름을 지정합니다. 판매국가 우리 패키지의 이름입니다. 컴파일 출력에 유의하세요. SalesMapper.class 이 패키지 이름으로 명명된 디렉터리로 이동합니다. 판매국가.

그런 다음 라이브러리 패키지를 가져옵니다.

아래 스냅샷은 구현을 보여줍니다. SalesMapper 수업-

SalesMapper 클래스 설명

샘플 코드 설명:

1. SalesMapper 클래스 정의-

공개 클래스 SalesMapper는 MapReduceBase를 확장하고 Mapper를 구현합니다. {

모든 매퍼 클래스는 다음에서 확장되어야 합니다. 맵리듀스베이스 클래스이며 이를 구현해야 합니다. 매퍼 인터페이스.

2. '맵' 기능 정의 -

public void map(LongWritable key,
         Text value,
OutputCollector<Text, IntWritable> output,
Reporter reporter) throws IOException

Mapper 클래스의 주요 부분은 '지도()' 네 개의 인수를 허용하는 메서드입니다.

전화할 때마다 '지도()' 방법, 핵심 가치 쌍 ('열쇠' and '값' 이 코드에서는)가 전달됩니다.

'지도()' 메서드는 인수로 받은 입력 텍스트를 분할하는 것으로 시작됩니다. 토크나이저를 사용하여 이러한 행을 단어로 분할합니다.

String valueString = value.toString();
String[] SingleCountryData = valueString.split(",");

여기 ',' 구분 기호로 사용됩니다.

이후 배열의 7번째 인덱스에 있는 레코드를 사용하여 쌍을 형성합니다. '싱글컨트리데이터' 그리고 값 '1'.

output.collect(new Text(SingleCountryData[7]), one);

우리는 필요하기 때문에 7번째 인덱스의 레코드를 선택합니다. 국가 데이터는 배열의 7번째 인덱스에 위치합니다. '싱글컨트리데이터'.

입력 데이터는 아래 형식입니다(여기서 국가 7 살이다th 인덱스(시작 인덱스는 0)-

거래_날짜,제품,가격,결제_유형,이름,도시,주,국가,계정_생성,마지막_로그인,위도,경도

매퍼의 출력은 다시 핵심 가치 다음을 사용하여 출력되는 쌍 '모으다()' 의 방법 '출력 수집기'.

SalesCountryReducer 클래스 설명

이번 섹션에서는 구현에 대해 알아보겠습니다. SalesCountryReducer 클래스입니다.

1. 먼저 클래스의 패키지 이름을 지정합니다. 판매국가 아웃 패키지의 이름입니다. 컴파일 출력에 유의하세요. SalesCountryReducer.class 이 패키지 이름으로 명명된 디렉터리로 이동합니다. 판매국가.

그런 다음 라이브러리 패키지를 가져옵니다.

아래 스냅샷은 구현을 보여줍니다. SalesCountryReducer 수업-

SalesCountryReducer 클래스 설명

코드 설명 :

1. SalesCountryReducer 클래스 정의-

공용 클래스 SalesCountryReducer는 MapReduceBase를 확장하고 Reducer를 구현합니다. {

여기서 처음 두 데이터 유형은 '텍스트' and 'IntWritable' 감속기에 대한 입력 키-값의 데이터 유형입니다.

매퍼의 출력은 다음과 같습니다. , . 이 매퍼의 출력은 감속기의 입력이 됩니다. 따라서 데이터 유형에 맞춰 정렬하려면 본문 and IntWritable 여기서는 데이터 유형으로 사용됩니다.

마지막 두 데이터 유형인 'Text'와 'IntWritable'은 리듀서가 키-값 쌍 형태로 생성한 출력의 데이터 유형입니다.

모든 리듀서 클래스는 다음에서 확장되어야 합니다. 맵리듀스베이스 클래스이며 이를 구현해야 합니다. 감속기 인터페이스.

2. '감소' 기능 정의 -

public void reduce( Text t_key,
             Iterator<IntWritable> values,                           
             OutputCollector<Text,IntWritable> output,
             Reporter reporter) throws IOException {

에 대한 입력 줄이다() method는 여러 값 목록이 있는 키입니다.

예를 들어, 우리의 경우에는 다음과 같습니다.

, , , , , .

이것은 감속기에 다음과 같이 제공됩니다.

따라서 이 형식의 인수를 허용하려면 처음 두 가지 데이터 유형, 즉 본문 and 반복자. 본문 키의 데이터 유형이며 반복자 해당 키 값 목록의 데이터 유형입니다.

다음 인수는 유형입니다. 출력 수집기 감속기 단계의 출력을 수집합니다.

줄이다() 메서드는 키 값을 복사하고 빈도 수를 0으로 초기화하는 것으로 시작됩니다.

텍스트 키 = t_key;
int 빈도ForCountry = 0;

그런 다음 '하는 동안' 루프에서는 키와 관련된 값 목록을 반복하고 모든 값을 합산하여 최종 빈도를 계산합니다.

 while (values.hasNext()) {
            // replace type of value with the actual type of our value
            IntWritable value = (IntWritable) values.next();
            frequencyForCountry += value.get();
            
        }

이제 결과를 다음 형식으로 출력 수집기에 푸시합니다. 그리고 얻은 빈도 수.

아래 코드는 이를 수행합니다.

output.collect(key, new IntWritable(frequencyForCountry));

SalesCountryDriver 클래스 설명

이번 섹션에서는 구현에 대해 알아보겠습니다. SalesCountryDriver 수업

1. 먼저 클래스의 패키지 이름을 지정합니다. 판매국가 아웃 패키지의 이름입니다. 컴파일 출력에 유의하세요. SalesCountryDriver.class 이 패키지 이름으로 명명된 디렉터리로 이동합니다. 판매국가.

다음은 패키지 이름을 지정하는 줄과 라이브러리 패키지를 가져오는 코드입니다.

SalesCountryDriver 클래스 설명

2. 새 클라이언트 작업, 구성 개체를 생성하고 매퍼 및 감속기 클래스를 광고할 드라이버 클래스를 정의합니다.

드라이버 클래스는 MapReduce 작업이 실행되도록 설정하는 역할을 담당합니다. 하둡. 이 클래스에서는 다음을 지정합니다. 작업 이름, 입출력 데이터 유형, 매퍼 및 리듀서 클래스 이름.

SalesCountryDriver 클래스 설명

3. 아래 코드 조각에서는 각각 입력 데이터 세트를 사용하고 출력을 생성하는 데 사용되는 입력 및 출력 디렉터리를 설정합니다.

인자[0] and 인자[1] MapReduce 실습에서 제공된 명령과 함께 전달된 명령줄 인수입니다. 즉,

$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales

SalesCountryDriver 클래스 설명

4. 작업을 시작하세요

아래 코드는 MapReduce 작업 실행을 시작합니다.

try {
    // Run the job 
    JobClient.runJob(job_conf);
} catch (Exception e) {
    e.printStackTrace();
}