Build Oozie4.3.1 on Hadoop3.X及Hadoop生态圈Action调用

Posted fansy1990

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Build Oozie4.3.1 on Hadoop3.X及Hadoop生态圈Action调用相关的知识,希望对你有一定的参考价值。

Build Oozie4.3.1 on Hadoop3.X及Hadoop生态圈Action调用(一)

本文主要描述Oozie4.3.1在Hadoop3.0.0上的编译工作,下篇描述Hadoop生态圈Action调用,如MapReduce、Hive、Pig、Spark、HBase等。

1. 需求:

  1. 需要在Hadoop3.x的基础上编译Oozie;
  2. 需要在编译好的Oozie中能运行Hadoop相关的生态圈组件,比如HBase,Hive,Pig,Spark等;

2. 前期预研:

  1. 经过查阅,发现Oozie4.3.1中有Hadoop3的相关配置,而最新的版本Oozie-5.0.0中并没有,所以采用Oozie-4.3.1版本;
  2. 同时Oozie-4.3.1版本对应的Hadoop版本为3.0.0-snapshot版本,其maven下载是在https://repository.apache.org/content/groups/snapshots , 这一个maven库在国外,而且是snapshot版本的,不适合,所以改为Hadoop3的一个版本;
  3. Hadoop3的版本选择主要基于时间:
    Oozie4.3.1 : 2018-2-13
    Hadoop3.0.0: 2017-12-08
    Hadoop3.0.1 : 2018-3-25
    所以选择Hadoop3.0.0版本.
  4. 版本如下:
软件版本
Oozie4.3.1
Hadoop3.0.0

其他版本随Oozie版本而定;

3. 前期准备

  1. 下载 oozie安装包:http://mirrors.hust.edu.cn/apache/oozie/4.3.1/oozie-4.3.1.tar.gz
  2. 本次编译使用Intellij IDEA,所以需要提前安装,同时配置IDEA: JDK1.8, Maven3+ ;
  3. Maven 库使用阿里云的,如下(在maven的settting.xml中加入如下配置):

    <mirror>
    <id>Central</id>
    <mirrorOf>*</mirrorOf>
    <name>Central</name>
    <url>http://central.maven.org/maven2/</url>
    </mirror>
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>*</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
    

    说明:后面再编译的时候会报pentaho的错误,如果不想,建议把下面的mirror也加入maven setting.xml 中(这个是spring的相关maven库)

    <repository>
              <id>spring-plugin-releases</id>
              <url>http://repo.spring.io/plugins-release/</url>
        </repository>

4. 导入工程及编译修改

导入工程,并设置 “Enable Auto Import”,就会自动导入相关的依赖包;同时,在导入的时候,会有一个选择,建议选择如下:

4.1 修改为Hadoop3

  1. 在 oozie4.3.1/pom.xml中修改:
  2. 修改Hadoop auth,由于oozie并没有hadoop auth3的配置,所以这里可以简单的把hadoop auth3改为auth2即可,如下:

4.2 加入Hadoop-common的依赖

在工程oozie-core, oozie-sharelib-pig中加入hadoop-common的依赖,如下:

4.3 修改类

把类JavaActionException、AuthorizationService中的fs.permission.AccessControlException改为 security.AccessControlException;

4.4 修改主pom.xml

修改pom.xml把findbugs以及check style的相关内容注释掉:

<!-- findbugs plugin. Execute 'mvn verify' and look for target/findbugs/findbugsXml.html under each module
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>findbugs-maven-plugin</artifactId>
                <configuration>
                    <excludeSubProjects>false</excludeSubProjects>
                    <xmlOutput>true</xmlOutput>
                    <findbugsXmlOutput>true</findbugsXmlOutput>
                    <findbugsXmlWithMessages>true</findbugsXmlWithMessages>
                    <effort>Max</effort>
                    <failOnError>false</failOnError>
                    <threshold>Low</threshold>
                    <xmlOutput>true</xmlOutput>
                    <findbugsXmlOutputDirectory>$project.build.directory/findbugs</findbugsXmlOutputDirectory>
                </configuration>
                <executions>
                 <execution>
                    <id>findbug</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>check</goal>
                    </goals>
                 </execution>
             </executions>
            </plugin>
            -->
            <!-- xml plugin is used for transforming the findbugs xml output into a friendlier html page
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>xml-maven-plugin</artifactId>
                <configuration>
                    <excludeSubProjects>false</excludeSubProjects>
                    <transformationSets>
                        <transformationSet>
                            <dir>$project.build.directory/findbugs</dir>
                            <outputDir>$project.build.directory/findbugs</outputDir>
                            <stylesheet>fancy-hist.xsl</stylesheet>
                            <fileMappers>
                                <fileMapper
                                       implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
                                    <targetExtension>.html</targetExtension>
                                </fileMapper>
                            </fileMappers>
                        </transformationSet>
                    </transformationSets>
                </configuration>
                <executions>
                    <execution>
                        <phase>verify</phase>
                        <goals>
                            <goal>transform</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>com.google.code.findbugs</groupId>
                        <artifactId>findbugs</artifactId>
                        <version>2.0.3</version>
                    </dependency>
                </dependencies>
            </plugin>
-->
            <!-- checkstyle plugin. Execute 'mvn verify' and look for target/checkstyle-result.xml under each module
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>2.9.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>check</goal>
                        </goals>
                        <configuration>
                            <consoleOutput>true</consoleOutput>
                            <includeTestSourceDirectory>true</includeTestSourceDirectory>
                            <configLocation>src/main/resources/checkstyle.xml</configLocation>
                            <headerLocation>src/main/resources/checkstyle-header.txt</headerLocation>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
-->

5. 编译、打包

在maven 视图中,点击main程序的install进行安装:

成功安装,则会出现下面的信息:

然后,再次点击下面的assemble single选项进行打包,如下:

打包成功后,出现下面的信息:

同时,在oozie-distro中有如下的目录结构,说明编译完成!

由于下面会出现某些class找不到的错误,发现是sharelib的打包问题,参考:https://stackoverflow.com/questions/14276453/maven-assembly-include-the-current-project-jar-in-the-final-zip-tar
说的是maven的 package和assemble:single 如果分开两个命令会有问题,所以要一个命令执行完成,可以参考:

6. 安装部署

6.1 上传oozie-distro.tar.gz

上传oozie-distro.tar.gz到集群某个节点,比如master,并解压到/usr/local目录,其目录结构如下(其中libext是自己建立的,后面会说道):

标注箭头的是还没有的,会在下面生成

6.2 修改libext

在 /usr/local/oozie-4.3.1中新建libext文件夹,并把mysql驱动ext zip包放入(oozie使用mysql数据库):

root@master:/usr/local/oozie-4.3.1# ls libext/
ext-2.2.zip  mysql-connector-java-5.1.45-bin.jar

6.3 修改/usr/loca/oozie-4.3.1/conf/oozie-site.xml文件:

<property>
    <name>oozie.service.JPAService.create.db.schema</name>
    <value>true</value>
</property>
<property>
    <name>oozie.service.JPAService.jdbc.driver</name>
    <value>com.mysql.jdbc.Driver</value>
</property>
<property>
    <name>oozie.service.JPAService.jdbc.url</name>
    <value>jdbc:mysql://master:3306/oozie?createDatabaseIfNotExist=true&amp;useSSL=true</value>
</property>

<property>
    <name>oozie.service.JPAService.jdbc.username</name>
    <value>root</value>
</property>

<property>
    <name>oozie.service.JPAService.jdbc.password</name>
    <value>root</value>
</property>
<property>
    <name>oozie.service.HadoopAccessorService.hadoop.configurations</name>
    <value>*=/usr/local/hadoop-3.0.2/etc/hadoop</value>
</property>
</configuration>

主要就是mysql的连接配置以及Hadoop的配置,这样需要注意,我集群实际的Hadoop版本其实是3.0.2的。

6.4 prepare-war

执行 : /usr/loca/oozie4.3.1/bin/oozie-setup.sh prepare-war
那么会进行Classpath以及war的生成准备工作;

6.5 sharelib处理

oozie运行的时候需要相关的jar包,而这些jar包就在sharelib里面,执行下面的命令可以把这些jar包上传到HDFS上,并且作为公共资源供其他调用。
bin/oozie-setup.sh sharelib create -fs hdfs://master:8020 -locallib oozie-sharelib-4.3.1.tar.gz

错误: 找不到或无法加载主类 org.apache.oozie.tools.OozieSharelibCLI
把IDEA编译生成的oozie-4.3.1\\tools\\target\\oozie-tools-4.3.1.jar 拷贝到master的/usr/local/oozie-4.3.1/lib目录里面,如下:
root@master:/usr/local/oozie-4.3.1# ls lib/oozie*
lib/oozie-client-4.3.1.jar lib/oozie-sharelib-hive-4.3.1.jar
lib/oozie-core-4.3.1.jar lib/oozie-sharelib-oozie-4.3.1.jar
lib/oozie-hadoop-auth-hadoop-3-4.3.1.jar lib/oozie-sharelib-pig-4.3.1.jar
lib/oozie-hadoop-utils-hadoop-3-4.3.1.jar lib/oozie-sharelib-spark-4.3.1.jar
lib/oozie-sharelib-distcp-4.3.1.jar lib/oozie-sharelib-sqoop-4.3.1.jar
lib/oozie-sharelib-hcatalog-4.3.1.jar lib/oozie-sharelib-streaming-4.3.1.jar
lib/oozie-sharelib-hive2-4.3.1.jar lib/oozie-tools-4.3.1.jar

建议:把IDEA生成的 oozie-4.3.1\\sharelib\\oozie\\target\\oozie-sharelib-oozie-4.3.1.jar包拷贝到HDFS的/user/root/share/lib/lib_XXXXXXXXX/oozie/目录中 (XXXXXXX代表时间戳,每次执行是不一样的),如果不拷贝后面报错(下文中有说明);

6.6 mysql库表生成

执行命令:
bin/ooziedb.sh create -sqlfile oozie.sql -run 即可在配置的mysql库中生成对应的库表,同时,在本地也会生成一个oozie.sql文件,如上文所示;

6.7 修改集群core-site.xml配置

默认使用root用户提交:

<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
  </property>
  <property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
  </property>

使配置生效:

hdfs dfsadmin -refreshSuperUserGroupsConfiguration
yarn rmadmin -refreshSuperUserGroupsConfiguration

6.8 启动,浏览器访问

bin/oozied.sh start , 浏览器访问 http://master:11000/oozie

7. 发起任务测试

7.1 发起任务

执行命令:

tar -zxf /usr/local/oozie-4.3.1/oozie-examples.tar.gz -C /usr/local/oozie-4.3.1/
cd /usr/local/oozie-4.3.1/examples/apps/map-reduce
hadoop fs -put /usr/local/oozie-4.3.1/examples . 
oozie job --oozie http://master:11000/oozie -config job.properties -run

发现,在oozie的监控界面有任务,但是任务一直在卡着,同时Application的监控界面任务显示失败,通过查看application的日志,可以看到如下信息:

Caused by: java.lang.ClassNotFoundException: Class org.apache.oozie.action.hadoop.OozieLauncherOutputCommitter not found

此问题可以需要修改两个地方,第一个就是sharelib上传jar包的问题,这个在sharelib中已经提到了,第二个是job.properties需要添加信息,如下:

oozie.use.system.libpath=true
oozie.libpath=hdfs://master:8020/user/root/share/lib/lib_20180807105542

其中的HDFS路径需要修改为实际路径;

7.2 查看执行结果

修改完成后,再次提交任务,查看任务的输出:

8. 总结

  1. 经过初步的调研,其实这件事情的实现时机其实还是不成熟的,原因就是Hadoop发展较快,作为外围软件Oozie需要去协调肯定是有一定的滞后性,所以这次的编译后续可能会有问题。
  2. 一个正确的做事态度不是,把什么东西都混淆到一起,然后期望他能通过,这种态度就是不可取的。在做的时候也试了使用最新的版本Oozie5.0.0或正在编写的Oozie5.1.0版本,都没有取得较好的效果,原因也会有这方面的态度因素。
  3. 正确的态度:进过前期的预研能够确认一个方向,然后参考这个方向来做,遇到问题,应该去找对应的解决方法,最终的结果才有可能是好的。一位前辈说过:写代码又不是玄学,怎么会昨天可运行的代码,今天就运行不了了,所以运行不了一定是有原因的!

分享,成长,快乐
脚踏实地,专注
转载请注明blog地址:http://blog.csdn.net/fansy1990

以上是关于Build Oozie4.3.1 on Hadoop3.X及Hadoop生态圈Action调用的主要内容,如果未能解决你的问题,请参考以下文章

Oozie4.3.1各种Action及综合实例

Oozie4.3.1各种Action及综合实例

build FRR on ubuntu

build RTK on ubuntu 16.04

Build your own distribution based on Fedora CoreOS

Build your own distribution based on Fedora CoreOS