Hadoop 및 Mapreduce 예제: Java로 첫 번째 프로그램 만들기

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

최초의 Hadoop MapReduce 프로그램

이제 이것에서 맵리듀스 튜토리얼, 첫 번째 Java MapReduce 프로그램을 만듭니다.

최초의 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)

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

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

최초의 Hadoop MapReduce 프로그램

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

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

최초의 Hadoop MapReduce 프로그램

단계 4)

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

sudo gedit Manifest.txt

팔로우 추가wing 그것에 라인,

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 클래스의 주요 부분은 '지도()' 네 개의 인수를 허용하는 메서드입니다.

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

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

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를 구현합니다. {

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

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

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

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

2. '감소' 기능 정의 -

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

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

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

, , , , , .

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

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

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

줄이다() 메서드는 키 값을 복사하고 빈도 수를 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]인자[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();
}