spring boot\spring data与hadoop如何整合,以及解决tomcat冲突的问题

初衷:
为将hadoop集成到Spring项目当中。一开始尝试直接导入hadoop依赖包,也是因为对依赖冲突不够了解,导致了tomcat中的若干依赖于hadoop中的依赖相互冲突。
问题:
在导入依赖包的时候,以及写代码的时候没有过多的感觉,但是在运行的时候会疯狂的报jar包不存在的问题,一开始是怀疑maven没有导全jar包的原因,后来了解到该问题很可能是由于依赖包冲突,因此下载了idea的maven help插件,删除掉了冲突的依赖包之后,发现还是没有解决问题,那么问题可能就是——我太菜了,删得不对。于是,不断查找资料,终于,看样子好像解决了问题,可实际上还是不行。
矛盾:
针对于spring-boot-starter-web:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

由于其中集成了部分tomcat功能(参考http://www.it1352.com/993418.html),与hadoop common和client均有冲突(不止是log4j、slf4j、javax),因此,解决方式为,在hadoop common 以及hadoop client中,去除相应的依赖包。

<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.5</version>
<exclusions>
<exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId></exclusion>
<exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion>
<exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.5</version>
<exclusions>
<exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId></exclusion>
<exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion>
<exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion>

</exclusions>
</dependency>

在这一过程中,发现了通过spring data的方式将其结合,可以直接使用FsShell的api方式,更加便捷,因此尝试使用新的方法,即添加依赖:

<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-hadoop-boot</artifactId>
<version>2.5.0.RELEASE</version>

</dependency>

这样子,就可以在application.properties中,添加

spring.hadoop.fs-uri=hdfs://192.168.109.128:9000

这种方式,访问hdfs:

@SpringBootApplication
public class TestApplication implements CommandLineRunner {
@Autowired
private FsShell fsShell;
public static void main(String[] args) {

SpringApplication.run(TaxiApplication.class, args);

}

@Override
public void run(String... args) throws Exception {
// fsShell.mkdir("hdfs://192.168.109.128:9000/test");

for (FileStatus s : fsShell.lsr("/")) {
System.out.println("> " + s.getPath());
}

}
}

然而,在demo中做了测试时,依然发现有问题,即log4j不存在问题,想着本应该是解除冲突了才对,为什么还会有这个问题,试着单独导入log4j的依赖后

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

,测试成功。可行之后,想要集成到案例中,依然发现有问题,问题的来源是spring boot web并没有完全集成tomcat,tomcat-embed-jasper与hadoop依然存在冲突,因此,需要继续清除冲突的依赖:
在hadoop common中添加

<exclusion> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> </exclusion>

在hadoop client中添加:

<exclusion> <groupId>com.google.code.findbugs</groupId> <artifactId>jsr305</artifactId> </exclusion>

在spring data-hadoop-boot中添加:

<exclusions>
<exclusion> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> </exclusion>
</exclusions>

并且,由于集成的案例中不是直接使用log4j的依赖,而是使用

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>

因此将之前的log4j删除掉。
这样子,就成功集成hadoop与spring。

但是,在运行的过程中,还是会出现一些问题,比如:Spring报了An incompatible version [1.1.33] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]这个错误,解决办法就是:
在http://archive.apache.org/dist/tomcat/tomcat-connectors/native/1.2.14/binaries/下载 文件tomcat-native-1.2.14-win32-bin.zip
解压后其bin中有32位和64位的 tcnative-1.dll 文件,根据自己的电脑选择相应位的文件,将文件拷贝到C:\Windows\System32即可(参考https://www.cnblogs.com/gyli20170901/p/9984221.html)
FsShell的方式,比较简单直观一些,但是,是否好用,还有待尝试。spring data hadoop的项目在今年年初就停掉了:https://spring.io/projects/spring-hadoop
spring boot\spring data与hadoop如何整合,以及解决tomcat冲突的问题_第1张图片
spring-data-hadoop-boot这个包的最新版本是2.5.0.RELEASE,只支持到hadoop-2.7.3,不过测试2.7.5是没问题。不知道hadoop3.0以上的有没有问题,没试过。
胡搞瞎搞胡搞瞎搞。

你可能感兴趣的:(hadoop,debug)