Hadoop 및 Mapreduce 예제: 첫 번째 프로그램 생성 Java
이 튜토리얼에서는 MapReduce 예제와 함께 Hadoop을 사용하는 방법을 배웁니다. 사용된 입력 데이터는 SalesJan2009.csv. 여기에는 제품명, 가격, 결제 방식, 도시, 고객 국가 등과 같은 판매 관련 정보가 포함되어 있습니다. 목표는 다음과 같습니다. 각 국가에서 판매된 제품 수를 알아보세요.
최초의 Hadoop MapReduce 프로그램
이제 이것에서 맵리듀스 튜토리얼, 우리는 첫 번째를 만들 것입니다 Java 맵리듀스 프로그램:
Hadoop이 설치되어 있는지 확인하십시오. 실제 프로세스를 시작하기 전에 사용자를 'hduser'로 변경합니다(Hadoop 구성 중에 사용된 ID, Hadoop 프로그래밍 구성 중에 사용된 사용자 ID로 전환할 수 있음).
su - hduser_
단계 1)
이름으로 새 디렉터리 만들기 MapReduce튜토리얼 아래 MapReduce 예제에서 shwon과 같이
sudo mkdir MapReduceTutorial
권한 부여
sudo chmod -R 777 MapReduceTutorial
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(); } } }
이 모든 파일의 파일 권한을 확인하십시오
'읽기' 권한이 누락된 경우 동일한 권한을 부여합니다.
단계 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/*"
단계 3)
편집하다 Java 파일(이 파일은 디렉토리에 있습니다. Final-MapReduceHandsOn). 해당 클래스 파일은 패키지 디렉터리에 저장됩니다.
javac -d . SalesMapper.java SalesCountryReducer.java SalesCountryDriver.java
이 경고는 무시해도 됩니다.
이 컴파일은 Java 소스 파일에 지정된 패키지 이름으로 명명된 현재 디렉토리에 디렉토리를 생성합니다(예: 판매국가 우리의 경우) 컴파일된 모든 클래스 파일을 여기에 넣습니다.
단계 4)
새 파일 만들기 매니페스트.txt
sudo gedit Manifest.txt
다음 줄을 추가하세요.
Main-Class: SalesCountry.SalesCountryDriver
SalesCountry.SalesCountryDriver 메인 클래스의 이름입니다. 이 줄 끝에서 Enter 키를 눌러야 한다는 점에 유의하세요.
단계 5)
Jar 파일 만들기
jar cfm ProductSalePerCountry.jar Manifest.txt SalesCountry/*.class
jar 파일이 생성되었는지 확인
단계 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_HOME/bin/hdfs dfs -ls /inputMapReduce
단계 8)
MapReduce 작업 실행
$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales
그러면 mapreduce_output_sales라는 출력 디렉터리가 생성됩니다. HDFS. 이 디렉토리의 내용은 국가별 제품 판매량을 포함하는 파일입니다.
단계 9)
결과는 명령 인터페이스를 통해 다음과 같이 볼 수 있습니다.
$HADOOP_HOME/bin/hdfs dfs -cat /mapreduce_output_sales/part-00000
결과는 웹 인터페이스를 통해 다음과 같이 볼 수도 있습니다.
웹 브라우저에서 r을 엽니다.
지금 선택하십시오. '파일 시스템 찾아보기' ~로 이동 /mapreduce_output_sales
엽니다 부품-r-00000
SalesMapper 클래스 설명
이번 섹션에서는 구현에 대해 알아보겠습니다. SalesMapper 클래스입니다.
1. 먼저 클래스의 패키지 이름을 지정합니다. 판매국가 우리 패키지의 이름입니다. 컴파일 출력에 유의하세요. SalesMapper.class 이 패키지 이름으로 명명된 디렉터리로 이동합니다. 판매국가.
그런 다음 라이브러리 패키지를 가져옵니다.
아래 스냅샷은 구현을 보여줍니다. 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 수업-
코드 설명 :
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 이 패키지 이름으로 명명된 디렉터리로 이동합니다. 판매국가.
다음은 패키지 이름을 지정하는 줄과 라이브러리 패키지를 가져오는 코드입니다.
2. 새 클라이언트 작업, 구성 개체를 생성하고 매퍼 및 감속기 클래스를 광고할 드라이버 클래스를 정의합니다.
드라이버 클래스는 MapReduce 작업이 실행되도록 설정하는 역할을 담당합니다. 하둡. 이 클래스에서는 다음을 지정합니다. 작업 이름, 입출력 데이터 유형, 매퍼 및 리듀서 클래스 이름.
3. 아래 코드 조각에서는 각각 입력 데이터 세트를 사용하고 출력을 생성하는 데 사용되는 입력 및 출력 디렉터리를 설정합니다.
인자[0] and 인자[1] MapReduce 실습에서 제공된 명령과 함께 전달된 명령줄 인수입니다. 즉,
$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales
4. 작업을 시작하세요
아래 코드는 MapReduce 작업 실행을 시작합니다.
try { // Run the job JobClient.runJob(job_conf); } catch (Exception e) { e.printStackTrace(); }