본문 바로가기
BigData/Spark

Spark로 WordCount 구현하기. #2

by Tomining 2015. 5. 21.
#1 을 해봤다면, 조금 불편함을 느꼈을 것이다.

분석 대상 파일과 output 경로를 모두 code에 포함되어 있기 때문이다.
그렇다면 이런 값들을 파라메터로 받아서 처리할 순 없을까?

spark-submit으로 수행시에는 AppClass 내에 파라메터를 전달할 방법이 마땅치 않다.


위 블로그를 참고하여 진행해보자.
우선 아래와 같이 Argument를 파싱하는 Enum을 생성해 보았다.

public static void main(String[] args) throws Exception {
if (ArrayUtils.getLength(args) > 4) {
LOGGER.debug("");
LOGGER.debug("Usage : ArgumentSampleApp <sourceFilePath> <outputFilePath> [appName] [hadoop uri]");
System.exit(1);
}

String sourceFilePath = ARGUMENT.SOURCE_FILE.getArgument(args);
String outputFilePath = ARGUMENT.OUTPUT_FILE.getArgument(args);
String appName = ARGUMENT.APP_NAME.getArgument(args, DEFAULT_APP_NAME);
String hdfsUri = ARGUMENT.HADOOP_URI.getArgument(args, DEFAULT_HDFS_MASTER_PATH);

ArgumentSampleApp app = new ArgumentSampleApp();
app.executeSparkTask(appName, hdfsUri, sourceFilePath, outputFilePath);
}

enum ARGUMENT {
SOURCE_FILE(0),
OUTPUT_FILE(1),
APP_NAME(2, true),
HADOOP_URI(3, true);

private int index;
private boolean isOptinal;
private ARGUMENT(int index) {
this(index, false);
}

private ARGUMENT(int index, boolean isOptinal) {
this.index = index;
this.isOptinal = isOptinal;
}

public String getArgument(String[] args) throws IllegalArgumentException {
return this.getArgument(args, StringUtils.EMPTY);
}

public String getArgument(String[] args, String defaultValue) throws IllegalArgumentException {
if (ArrayUtils.isEmpty(args)) {
return defaultValue;
}

int argsCount = ArrayUtils.getLength(args);
if (argsCount < this.index + 1) {
if (!this.isOptinal) { //필수 파라메터가 누락된 경우
throw new IllegalArgumentException();
}

return defaultValue;
} else {
return args[this.index];
}
}
}

간단한 기능이지만 필수정보와 옵션을 분리하여 기본값을 세팅할 수 있는 구조로 만들어보았다.
이런 기능을 제공해주는 OtpionParser가 있는 것으로 알고 있다. 테스트가 완료되면 그 Class를 적용하도록 하자.
일단 여기서는 위 샘플대로 테스트를 진행한다.

수행은 spark-submit 이 아닌 spark-class로 수행해야 한다.

~/apps/spark/bin/spark-class org.apache.spark.deploy.yarn.Client --jar hdfs://dev-umn-udm001.ncl:9000/umon-udm-1.0.0.jar --class com.nhncorp.umon.spark.app.ArgumentSampleApp --arg /README.md --arg /README2 --arg /ArgumentSampleApp2


output이 지정한대로 README2 디렉토리에 잘 저장이 되었다.