Springboot整合操作HDFS的HA集群

Springboot整合操作HDFS的HA集群

一、pom依赖及踩坑

新建一个springboot项目,添加以下依赖


    
        org.springframework.data
        spring-data-hadoop
        2.5.0.RELEASE
        
            
            
             javax.servlet servlet-api 
        
    
    
    
        log4j
        log4j
        1.2.17
    

    
        org.springframework.boot
        spring-boot-starter-web
    

    
        org.springframework.boot
        spring-boot-starter-test
        test
    




    
        
            org.springframework.boot
            spring-boot-maven-plugin
        
    

 

hadoop的jar包和springboot的依赖jar包是有好几处冲突的

(1)、大坑1

java.lang.NoClassDefFoundError: org/apache/log4j/Level,就是说没有这个类,也就是说没有相应的jar包。

那么就添加这个jar包的依赖,去maven仓库找,注意是箭头指的这个,其他的我试过不行

(2)、大坑2

又是jar包冲突,刚开始我是直接去本地仓库删掉其中一个,但是编译项目它又会重新下载,指标不治本。

 

解决方法是在pom文件中的hadoop依赖中让其不被加载,slf4j-log4j12冲突也是相同的处理方式

二、项目

这里主要讲几个需要注意的地方,完整的项目可到 https://github.com/fanshuaiko/Hadoop_Demo 查看和下载

(1)、读取hadoop配置文件的时候,其中服务器的别名都需要改成其IP地址(注意是改项目中resource目录下的,不要去改服务器上的)

(2)、远程操作hdfs的时候,默认是读取本地机器的用户去操作hdfs的,这是需要改的。比方说我目前操作这个程序的电脑的用户名是 y ,那么程序会默认使用 y 这个用户名去操作服务器的hdfs,但是hdfs的用户不是 y ,所以会报错。

 

 //设置远程登录的用户(即服务器上操作hadoop的用户),默认是当前机器的用户,如果不设置会报拒绝登录的错误
        UserGroupInformation ugi = UserGroupInformation.createRemoteUser("root");
        try {
            ugi.doAs((PrivilegedExceptionAction) () -> {
                try {
                    //操作HA集群有两种方式,1.通过conf一个个的设置属性,2.将hdfs的两个配置文件放到resource目录下,new Configuration()的时候会自动读取,这种方法最简单
                    conf = new Configuration();
                    //设置集群别名,而不是具体的地址,避免硬编码,它会自动的选择active节点进行操作
                    conf.set("fs.defaultFS", "hdfs://mycluster");
                    conf.set("hadoop.job.ugi", "root");
                     fs = FileSystem.get(conf);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            });
        } catch (Exception e) {
            e.printStackTrace();
        }

 

 

 

你可能感兴趣的:(hdfs)