MapReduce 프로그램에서 외부 JAR 파일을 사용하고 싶은 경우 여러 가지 방법이 있습니다.

방법설명
라이브러리 JAR 파일을 Unpack
  • 라이브러리가 많은 경우 unpack한후 JAR로 다시 패키징하면 좀 지저분해지는 경향이 있음
  • 가장 간단한 방식
  • Maven Dependency Plugin을 활용
MapReduce JAR에 라이브러리 JAR를 추가
  • <MR JAR>/lib 에 외부 라이브러리를 포함시켜 패키징
  • Maven Dependency Plugin을 활용
Hadoop에 배포
  • 모든 노드에 JAR 파일을 배포해야 하는 문제
  • 기존에 Hadoop에 있던 라이브러리와 버전 충돌 발생할 수 있음

라이브러리 JAR 파일을 Unpack

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>unpack</id>
            <phase>test</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.outputDirectory}</outputDirectory>
                <artifactItems>
                    <artifactItem>
                        <groupId>org.postgresql</groupId>
                        <artifactId>postgresql</artifactId>
                        <version>9.4.1212.jre6</version>
                    </artifactItem>
                    <artifactItem>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.42</version>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>

MapReduce JAR에 라이브러리 JAR를 추가

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <configuration>
        <outputDirectory>${project.build.directory}/lib</outputDirectory>
        <excludeTransitive>false</excludeTransitive> 
        <stripVersion>false</stripVersion>
    </configuration>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
        </execution>
    </executions>
</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
            </manifest>
        </archive>
    </configuration>
</plugin>