使用cloudera hadoop开发hadoop程序,官方文档上有两种方法。第一种即把相应jar包拷贝到工程目录中去,另一种即使用maven管理依赖jar包。
如果直接在构建节点上开发程序的话直接指向jar包目录即可。
默认目录
hadoop:/opt/cloudera/parcels/CDH/lib
CDH文件是指向${CDH.Version}的一个链接
lib下可用的包包含如下:
avro hadoop-httpfs impala sentry
bigtop-tomcat hadoop-kms impala-shell solr
bigtop-utils hadoop-mapreduce kite spark
crunch hadoop-yarn llama sqoop
debug hbase mahout sqoop2
flume-ng hbase-solr oozie whirr
hadoop hive parquet zookeeper
hadoop-0.20-mapreduce hive-hcatalog pig zookeeper-native
hadoop-hdfs hue search
maven的默认仓库没有CDH包,所以在maven repository 上也搜不到,cloudera自己提供了个仓库供引用。当然你也可以直接输入地址下载jar包,例如https://repository.cloudera.com/artifactory/cloudera-repos/org/apache/hadoop/hadoop-common/2.6.0-cdh5.7.0/hadoop-common-2.6.0-cdh5.7.0.jar,你也可以根据仓库表直接下载或者在pom中依赖相应jar包。
1. 构建maven结构
mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DgroupId=
\
-DartifactId=
group-id 和 project-name 分别是你的组织id和项目名称
2. 使用archetype:generate生成的项目文件中有个pom.xml文件
* pom文件编写 *
默认仓库找不到对应jar包,因此添加仓库:
<repositories>
<repository>
<id>cloudera-releasesid>
<url>https://repository.cloudera.com/artifactory/cloudera-reposurl>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>falseenabled>
snapshots>
repository>
repositories>
允许发布版本,禁止快照版
然后添加版本属性,方便后面依赖引用
<properties>
<cdh.version>2.6.0-cdh5.7.0cdh.version>
properties>
添加依赖包
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-clientartifactId>
<version>${cdh.version}version>
<scope>providedscope>
dependency>
scope 指定打包项目采用provided方式,即不把依赖包打进去。因为最后生成的程序jar包都是要在linux节点运行的,防止与节点自带的classpaths包冲突。
那如果项目中的一下jar包在hadoop运行环境中找不到,那么就需要用一个插件
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-shade-pluginartifactId>
<version>1.7.1version>
<configuration>
<transformers>
<transformer implementation = "org.apache.maven.plugins.shade.resource.MainifestResourceTransformer">
<mainClass>${MainClass}mainClass>
transformer>
transformers>
configuration>
<executions>
<execution>
<phase>packagephase>
<goals>
<goal>shadegoal>
goals>
execution>
executions>
plugin>
plugins>
它可以让用户配置Main-Class的值,然后在打包的时候将值填入/META-INF/MANIFEST.MF文件。关于项目的依赖,它很聪明地将依赖JAR文件全部解压后,再将得到的.class文件连同当前项目的.class文件一起合并到最终的CLI包中,这样,在执行CLI JAR文件的时候,所有需要的类就都在Classpath中了,运行java -jar 命令也不需要添加依赖包,这个插件的说明见这里.
下面一个插件方便生成可在eclipse管理的工具,可以再eclipse中直接导入用maven生成的项目:
<plugin>
<groupId>org.apache.maven.plugins groupId>
<artifactId>maven-eclipse-pluginartifactId>
<version>2.9version>
<configuration>
<projectNameTemplate>
${project.artifactId}
projectNameTemplate>
<buildOutputDirectory>
eclipse-classes
buildOutputDirectory>
<downloadSources>truedownloadSources>
<downloadJavadocs>falsedownloadJavadocs>
configuration>
plugin>
执行:
mvn -Declipse.workspace= eclipse:configure-workspace eclipse:eclipse
当然如果eclipse整合了maven的话,可以直接不需要这个插件了,直接新建maven简单项目,然后导入pom.xml文件即可。
pom.xml