티스토리 뷰

* 개요


웹 프로젝트에 Mahout 넣어서 클러스터링 테스트 하자 다음 오류 발생함.


...

java.lang.NoSuchMethodError: org.apache.hadoop.yarn.proto.YarnProtos$LocalResourceProto.hashLong(J)I

at org.apache.hadoop.yarn.proto.YarnProtos$LocalResourceProto.hashCode(YarnProtos.java:11555)

at org.apache.hadoop.yarn.api.records.impl.pb.LocalResourcePBImpl.hashCode(LocalResourcePBImpl.java:62)



Maven 사용시 의존성의 버전 충돌 문제




* 환경

Spring MVC 5

Mahout 0.13.0

Maven



* 원인


- jar 파일 차이 때문이란 의견

https://stackoverflow.com/questions/34149712/map-reduce-job-protobuf-related-error?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa


-  protobuf 버전 차이때문이란 의견

https://groups.google.com/d/topic/protobuf/-pwIkGzpsQs



- 실제로 (잘되던) 구 PRJ 는 2.5.0

새 PRJ 는 2.6.0 사용하고 있음..


- Mahout 0.13 (또는 0.12.2) 는 hadoop-hdfs, hadoop-yarn-api 등에 의존하고 있으며, 여기서는 다시 protobuf 2.5.0 에 의존


- 충돌하는 부분 : mysql-connector 8 에서 protobuf 2.6.0 을 사용하고 있고, 프로젝트 전체에 2.6.0 버전이 적용되는데 여기엔 hashLong() 이 없어서 생기는 문제.

(상위버전 2.6.0이 2.5.0 에 대한 하위호환성 backward compatibility 없어서 생긴 문제)



* 해결

- mysql connector 에서 protobuf 를 exclusion 하여 해결함.

- 프로젝트에서 사용하는 protobuf 버전은 2.5.0 으로 낮춰짐

- mysql connector 8 은 자신이 의존하고 있던 2.6.0 대신 2.5.0 사용하므로 문제 생길 수도 ...

- pom.xml 수정 내용

<dependency>

    <groupId>mysql</groupId>

    <artifactId>mysql-connector-java</artifactId>

    <version>8.0.11</version>

<exclusions>

<exclusion>

<groupId>com.google.protobuf</groupId>

  <artifactId>protobuf-java</artifactId>

</exclusion>

</exclusions>

</dependency>



* dependencyManagement 로 2.5.0으로 통일하는 방법도 가능.

https://blog.sapzil.org/2018/01/21/taming-maven-transitive-dependencies/



* 한 프로젝트에서 동일 패키지에 대해 2가지 다른 버전을 사용할 순 없나?

- 기본적으로 불가능한듯..

- 참고 링크

https://stackoverflow.com/questions/35381533/maven-multiple-version-of-same-dependency?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa


- OSGi  언급되는데 뭔지 모르겠음


- Maven shade 사용하라는 의견

https://www.quora.com/Is-there-a-way-to-use-multiple-versions-of-the-same-dependency-when-building-with-Maven-or-Gradle


의존 라이브러리를 통합하여 1개의 Jar 로 만들 수 있는 툴인데, 이 과정에서 패키지 명 변경도 가능한듯.

버전이 다른 2개 패키지 중 1개의 패키지명을 수정하여 사용이 가능한듯함.


예시)

https://medium.com/@minyodev/relocating-classes-using-apache-maven-shade-plugin-6957a1a8666d


- Maven shade 관련 내용

http://javacan.tistory.com/entry/mavenshadeplugin

http://asuraiv.blogspot.kr/2016/01/maven-shade-plugin-1-resource.html





공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함