본문 바로가기
Data Engineering/Hadoop Eco.

[Linux] Patch 파일 적용 방법 (+Apache Oozie 설치 시 Hadoop 3 이슈)

by so-easy 2021. 8. 11.

Patch 파일이 뭔지, 어떻게 적용하는지 알아보자.

현대인은 시간이 없기 때문에 일단 본론만 먼저 말한다.

1. Patch 파일이란?

패치(patch) 파일은 두 파일의 차이점을 출력해 주는 프로그램인 diff에 의해 생성된 파일을 의미한다.

 

소스파일들을 고치고 나서, 고친 부분이 어디인지만 차이점을 뽑아내 준다.

고친 부분에 대한 정보만을 보여주기 때문에, 소스코드 전체를 하나하나 보지 않고도 어떤 부분을 고쳤는지 파악하기 쉽다.

2. Patch 적용

patch [-p숫자] [패치를 적용할 타겟 파일명] < [패치파일이름.patch]

여기서 중요한 건 -p 옵션이다. p뒤에는 숫자를 붙이는데, 'patch파일에 적힌 경로에서 path를 몇 개 벗기고 적용할 건지?'이다.

( 남들이 patch 파일을 만들 때의 경로와 지금 내가 작업하고 있는 경로가 당연히 다를 것이기 때문에 -p 옵션이 반드시 필요하다.)

 

예를 들어, 이렇게 내 pwd(현재 작업 중인 디렉토리)에 TestECPolicyDisabler.java라는 파일이 있다면,

ls를 해서 확인해본 결과

아래 patch파일 기준으로 9개 경로를 벗겨야 한다.

그래서 아래와 같이 최종적으로 명령을 주면 잘 적용된다.

# patch [-p숫자] [패치를 적용할 파일] < [패치파일이름.patch]
patch -p9 TestECPolicyDisabler.java < OOZIE-3621-TestECPolicyDisabler.v0.patch


0. 배경

Apache Oozie는 아파치 재단의 오픈 소스이다.

Oozie 5.2.1 버전 설치 과정에서 Maven 빌드를 하다가 중간에 에러가 나서 찾아보니.. 나만 그런 게 아니라 Hadoop 버전 3에서만 발생하는 이슈가 있었다.

[ERROR] ... TestECPolicyDisabler.java:[50,71] getErasureCodingPolicy(org.apache.hadoop.fs.Path) ...

 

Oozie 공식 JIRA에 아래와 같은 이슈가 등록되어있었고, 이 이슈를 해결하기 위한 patch 파일이 올라와있었다.

https://issues.apache.org/jira/browse/OOZIE-3621

 

[OOZIE-3621] Make TestECPolicyDisabler work with Hadoop 3 - ASF JIRA

TestECPolicyDisabler is not compatible with hadoop 3. The following error messages are produced by command `mvn clean install -DskipTests -Dhadoop.version=3.1.0 -Dhadoop.majorversion=3 -Phadoop-3` [ERROR] COMPILATION ERROR : [INFO] ------------------------

issues.apache.org

Patch 파일 확인

내가 받은 OOZIE-3621.v0.patch 파일은 이런 식으로 생겼다.

2개  파일에 대한 내용이 하나에 들어가 있어서, diff --git.... 을 기준으로 일단 쪼갰다. (여러 파일을 한 번에 적용할 수 있을 것 같긴 한데... )

이렇게 생긴 파일을 쪼개서 ...

이렇게 만들었다.

diff --git a/tools/src/main/java/org/apache/oozie/tools/ECPolicyDisabler.java b/tools/src/main/java/org/apache/oozie/tools/ECPolicyDisabler.java
index e24ac7a07..58df898bf 100644
--- a/tools/src/main/java/org/apache/oozie/tools/ECPolicyDisabler.java
+++ b/tools/src/main/java/org/apache/oozie/tools/ECPolicyDisabler.java
@@ -48,7 +48,7 @@ public final class ECPolicyDisabler {
     }
 
     public static void tryDisableECPolicyForPath(FileSystem fs, Path path) {
-        switch (check(fs, path)) {
+        switch (check(fs, path, GETERASURECODINGPOLICY_METHOD)) {
             case DONE:
                 System.out.println("Done");
                 break;
@@ -64,12 +64,12 @@ public final class ECPolicyDisabler {
         }
     }
 
-    static Result check(FileSystem fs, Path path) {
+    static Result check(FileSystem fs, Path path, String getErasureCodingPolicyMethodName) {
         if (fs instanceof DistributedFileSystem && supportsErasureCoding()) {
             System.out.println("Found Hadoop that supports Erasure Coding. Trying to disable Erasure Coding for path: "+ path);
             DistributedFileSystem dfs = (DistributedFileSystem) fs;
             final Object replicationPolicy = getReplicationPolicy();
-            Method getErasureCodingPolicyMethod = getMethod(dfs, GETERASURECODINGPOLICY_METHOD);
+            Method getErasureCodingPolicyMethod = getMethod(dfs, getErasureCodingPolicyMethodName);
             final Pair<Object,Result> currentECPolicy = safeInvokeMethod(getErasureCodingPolicyMethod, dfs, path);
             if (currentECPolicy.getRight() != null) {
                 return currentECPolicy.getRight();

 

 

그리고 적용했다.(이 글 맨 위 참고)

# patch 파일 다운로드
wget https://issues.apache.org/jira/secure/attachment/13025322/OOZIE-3621.v0.patch
# 깔끔하게 하나만 남기고 수정
vi OOZIE-3621.v0.patch

# 1) TestECPolicyDisabler.java
# patch 파일 현재 디렉토리로 가져오기
cp /usr/src/oozie-5.2.1/OOZIE-3621-TestECPolicyDisabler.v0.patch ./

# patch 명령 적용
# patch [-p숫자] [패치를 적용할 파일] < 패치파일.patch
patch -p9 TestECPolicyDisabler.java < OOZIE-3621-TestECPolicyDisabler.v0.patch

# 2) ECPolicyDisabler.java (똑같이 적용)

 

참고

http://coffeenix.net/doc/misc/patch.html

댓글