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调用(一)
- Build Oozie4.3.1 on Hadoop3.X及Hadoop生态圈Action调用(一)
本文主要描述Oozie4.3.1在Hadoop3.0.0上的编译工作,下篇描述Hadoop生态圈Action调用,如MapReduce、Hive、Pig、Spark、HBase等。
1. 需求:
- 需要在Hadoop3.x的基础上编译Oozie;
- 需要在编译好的Oozie中能运行Hadoop相关的生态圈组件,比如HBase,Hive,Pig,Spark等;
2. 前期预研:
- 经过查阅,发现Oozie4.3.1中有Hadoop3的相关配置,而最新的版本Oozie-5.0.0中并没有,所以采用Oozie-4.3.1版本;
- 同时Oozie-4.3.1版本对应的Hadoop版本为3.0.0-snapshot版本,其maven下载是在https://repository.apache.org/content/groups/snapshots , 这一个maven库在国外,而且是snapshot版本的,不适合,所以改为Hadoop3的一个版本;
- Hadoop3的版本选择主要基于时间:
Oozie4.3.1 : 2018-2-13
Hadoop3.0.0: 2017-12-08
Hadoop3.0.1 : 2018-3-25
所以选择Hadoop3.0.0版本. - 版本如下:
软件 | 版本 |
---|---|
Oozie | 4.3.1 |
Hadoop | 3.0.0 |
其他版本随Oozie版本而定;
3. 前期准备
- 下载 oozie安装包:http://mirrors.hust.edu.cn/apache/oozie/4.3.1/oozie-4.3.1.tar.gz ;
- 本次编译使用Intellij IDEA,所以需要提前安装,同时配置IDEA: JDK1.8, Maven3+ ;
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
- 在 oozie4.3.1/pom.xml中修改:
- 修改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&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. 总结
- 经过初步的调研,其实这件事情的实现时机其实还是不成熟的,原因就是Hadoop发展较快,作为外围软件Oozie需要去协调肯定是有一定的滞后性,所以这次的编译后续可能会有问题。
- 一个正确的做事态度不是,把什么东西都混淆到一起,然后期望他能通过,这种态度就是不可取的。在做的时候也试了使用最新的版本Oozie5.0.0或正在编写的Oozie5.1.0版本,都没有取得较好的效果,原因也会有这方面的态度因素。
- 正确的态度:进过前期的预研能够确认一个方向,然后参考这个方向来做,遇到问题,应该去找对应的解决方法,最终的结果才有可能是好的。一位前辈说过:写代码又不是玄学,怎么会昨天可运行的代码,今天就运行不了了,所以运行不了一定是有原因的!
分享,成长,快乐
脚踏实地,专注
转载请注明blog地址:http://blog.csdn.net/fansy1990
以上是关于Build Oozie4.3.1 on Hadoop3.X及Hadoop生态圈Action调用的主要内容,如果未能解决你的问题,请参考以下文章