Maven构件Hadoop1.x以及Hadoop2.x项目

参看文档

http://blog.fens.me/hadoop-maven-eclipse/

http://blog.csdn.net/tryhl/article/details/43967441

也可以关注我的另外一篇文章http://www.aboutyun.com/blog-12709-1768.html

也可以加入群 316297243一起学习讨论

此文章用于学习和交流,转载请注明

1   Hadoop1.x的Maven项目构建

怎么用Maven构建项目,以及怎么构建hadoop项目,这里就不详细介绍,详情请参考

http://blog.fens.me/hadoop-maven-eclipse/

http://blog.csdn.net/tryhl/article/details/43967441

这里只讲述在用maven构建hadoop1.x项目以及导入Eclipse运行需要注意的问题以及产生的问题。

1)修改pom.xml文件

我依赖的是hadoop-1.2.1版本的

加入如下依赖

 <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-core</artifactId>
      <version>1.2.1</version>
  </dependency>

加入依赖之后等待下载相关的jar包

2)从hadoop集群中下载配置文件

这里不加也行

下载配置文件:

core-site.sh

hdfs-site.sh

mapred-site.sh

把配置文件加入/main/java/resources/hadoop文件夹下

3) 加入WordCount源码

public class WordCount {

	public static class WordCountMapper extends MapReduceBase implements

	Mapper<Object, Text, Text, IntWritable> {

		private final static IntWritable one = new IntWritable(1);

		private Text word = new Text();

		@Override
		public void map(Object key, Text value,

		OutputCollector<Text, IntWritable> output, Reporter reporter)

		throws IOException {

			StringTokenizer itr = new StringTokenizer(value.toString());

			while (itr.hasMoreTokens()) {

				word.set(itr.nextToken());

				output.collect(word, one);

			}

		}

	}

	public static class WordCountReducer extends MapReduceBase implements

	Reducer<Text, IntWritable, Text, IntWritable> {

		private IntWritable result = new IntWritable();

		@Override
		public void reduce(Text key, Iterator<IntWritable> values,

		OutputCollector<Text, IntWritable> output, Reporter reporter)

		throws IOException {

			// TODO Auto-generated method stub

			int sum = 0;

			while (values.hasNext()) {

				sum += values.next().get();

			}

			result.set(sum);

			output.collect(key, result);

		}

	}

	public static void main(String[] args) throws Exception {

	String input = null;

	String output = null;

	JobConf conf = new JobConf(WordCount.class);

	conf.setJobName("WordCount");

	// 测试环境

	if (args == null || args.length < 2) {

	input = "hdfs://10.2.1.35:9000/usr/hdfs/input_test1";

	output = "hdfs://10.2.1.35:9000/usr/hdfs/test1_result";

	    	/ 加载配置文件,可以注释掉

	conf.addResource("classpath:/hadoop/core-site.xml");

	conf.addResource("classpath:/hadoop/hdfs-site.xml");

	conf.addResource("classpath:/hadoop/mapred-site.xml");

	} else {

	// 正式环境

	input = args[0];

	output = args[1];

	}

	conf.setOutputKeyClass(Text.class);

	conf.setOutputValueClass(IntWritable.class);

	conf.setMapperClass(WordCountMapper.class);

	conf.setCombinerClass(WordCountReducer.class);

	conf.setReducerClass(WordCountReducer.class);

	conf.setInputFormat(TextInputFormat.class);

	conf.setOutputFormat(TextOutputFormat.class);

	FileInputFormat.setInputPaths(conf, new Path(input));

	FileOutputFormat.setOutputPath(conf, new Path(output));

	JobClient.runJob(conf);

	System.exit(0);

	}
}

注:

上述代码根据自己的实际情况编写

4)运行

出现异常

严重: PriviledgedActionException as:liuhuan cause:java.io.IOException: Failed to set permissions of path: \tmp\hadoop-liuhuan\mapred\staging\liuhuan1095504605\.staging to 0700

Exception in thread "main" java.io.IOException: Failed to set permissions of path: \tmp\hadoop-liuhuan\mapred\staging\liuhuan1095504605\.staging to 0700

at org.apache.hadoop.fs.FileUtil.checkReturnValue(FileUtil.java:691)

at org.apache.hadoop.fs.FileUtil.setPermission(FileUtil.java:664)

at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:514)

at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:349)

at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:193)

at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:126)

at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:942)

at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:936)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAs(Subject.java:396)

at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)

at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:936)

at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:910)

at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1353)

at com.lvmama.vst.mr.kpi.WordCount.main(WordCount.java:96)

这个错误是win中开发特有的错误,文件权限问题,在Linux下可以正常运行。

解决方法是,修改/hadoop-1.2.1/src/core/org/apache/hadoop/fs/FileUtil.java文件

690-694行注释,然后重新编译源代码,重新打一个hadoop.jar的包

再次运行

: PriviledgedActionException as:liuhuan cause:org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=liuhuan, access=READ, inode="input_test1":root:supergroup:rw-r-----

Exception in thread "main" org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=liuhuan, access=READ, inode="input_test1":root:supergroup:rw-r-----

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)

at java.lang.reflect.Constructor.newInstance(Constructor.java:513)

at org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteException.java:95)

at org.apache.hadoop.ipc.RemoteException.unwrapRemoteException(RemoteException.java:57)

at org.apache.hadoop.hdfs.DFSClient.callGetBlockLocations(DFSClient.java:697)

at org.apache.hadoop.hdfs.DFSClient.getBlockLocations(DFSClient.java:716)

at org.apache.hadoop.hdfs.DistributedFileSystem.getFileBlockLocations(DistributedFileSystem.java:156)

at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:231)

at org.apache.hadoop.mapred.JobClient.writeOldSplits(JobClient.java:1081)

at org.apache.hadoop.mapred.JobClient.writeSplits(JobClient.java:1073)

at org.apache.hadoop.mapred.JobClient.access$700(JobClient.java:179)

at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:983)

at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:936)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAs(Subject.java:396)

at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)

at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:936)

at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:910)

at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1353)

at com.lvmama.vst.mr.kpi.WordCount.main(WordCount.java:96)

文件没有访问权限,由于我们访问是用window的用户名访问,和集群的用户名并不一样,所以没有访问权限。有三种解决方案,常用的是在hdfs-site.sh中加入

<property>
     <name>dfs.permissions</name>
     <value>false</value>
</property>

不知道你们行不行,试了几次都不行。

没必要在这花费时间,使用hadoop fs -chmod -R  777 /修改权限(这里只能在测试环境这么干)

也可以修改Window的用户名

运行输出即可。

2 hadoop2.x.x的Maven项目构建

本文以2.6.0为例

Maven构建项目上面已经有了,在这不赘述了。

1)直接修改pom.xml文件

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>3.8.1</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-common</artifactId>
  <version>2.6.0</version>
  <exclusions>
   <exclusion>
   <groupId>jdk.tools</groupId>
   <artifactId>jdk.tools</artifactId>
   </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-hdfs</artifactId>
  <version>2.6.0</version>
</dependency>
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-client</artifactId>
  <version>2.6.0</version>
</dependency>
<dependency>
  <groupId>jdk.tools</groupId>
  <artifactId>jdk.tools</artifactId>
  <version>1.6</version>
  <scope>system</scope>
  <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency> 

上述的jdk.tools如果不这样写会报错。

2)加入上述的代码,运行

但是2.6.0不会出现这么多错误,只会出现一个错误。

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

at org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Native Method)

at org.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:557)

at org.apache.hadoop.fs.FileUtil.canRead(FileUtil.java:977)

at org.apache.hadoop.util.DiskChecker.checkAccessByFileMethods(DiskChecker.java:187)

at org.apache.hadoop.util.DiskChecker.checkDirAccess(DiskChecker.java:174)

at org.apache.hadoop.util.DiskChecker.checkDir(DiskChecker.java:108)

at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.confChanged(LocalDirAllocator.java:285)

at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:344)

at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:150)

at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:131)

at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:115)

at org.apache.hadoop.mapred.LocalDistributedCacheManager.setup(LocalDistributedCacheManager.java:131)

at org.apache.hadoop.mapred.LocalJobRunner$Job.<init>(LocalJobRunner.java:163)

at org.apache.hadoop.mapred.LocalJobRunner.submitJob(LocalJobRunner.java:731)

at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:536)

at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1296)

at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1293)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAs(Unknown Source)

at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)

at org.apache.hadoop.mapreduce.Job.submit(Job.java:1293)

at org.apache.hadoop.mapred.JobClient$1.run(JobClient.java:562)

at org.apache.hadoop.mapred.JobClient$1.run(JobClient.java:557)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAs(Unknown Source)

at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)

at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:557)

at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:548)

at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:833)

at com.lvmama.vst.kpi.mr.WordCount.main(WordCount.java:96)

然后把NativeIO的557行注释掉,修改如下

再次运行就可以了。

       注:在Eclipse运行中,如果不出现运行日志,则把hadoop配置文件夹下的log.properties放在项目的/src/main/resources,即可

时间: 2024-08-09 21:52:02

Maven构件Hadoop1.x以及Hadoop2.x项目的相关文章

大话Hadoop1.0、Hadoop2.0与Yarn平台

2016年12月14日21:37:29 Author:张明阳 博文链接:http://blog.csdn.net/a2011480169/article/details/53647012 近来这几天一直在忙于Hbase的实验,也没有太静下心来沉淀自己,今天打算写一篇关于Hadoop1.0.Hadoop2.0与Yarn的博文,从整体上把握三者之间的联系,博客内容如有问题,欢迎留言指正!OK,进入本文正题-- 在开始接触Hadoop的时候,也许大家对于Hadoop是下面的一个概念:Hadoop由两部

Hadoop1.X 与 Hadoop2.X区别及改进

一:Haddop版本介绍 0.20.x版本最后演化成了现在的1.0.x版本 0.23.x版本最后演化成了现在的2.x版本 hadoop 1.0 指的是1.x(0.20.x),0.21,0.22 hadoop 2.0 指的是2.x,0.23.x CDH3,CDH4分别对应了hadoop1.0 hadoop2.0 二.Hadoop1.X与Hadoop2.X区别 1.HDFS的改进 1.1 Hadoop1.x时代的HDFS架构 在Hadoop1.x中的NameNode只可能有一个,虽然可以通过Seco

Hadoop入门进阶步步高(六)-Hadoop1.x与Hadoop2的区别

六.Hadoop1.x与Hadoop2的区别 1.变更介绍 Hadoop2相比较于Hadoop1.x来说,HDFS的架构与MapReduce的都有较大的变化,且速度上和可用性上都有了很大的提高,Hadoop2中有两个重要的变更: l HDFS的NameNodes可以以集群的方式布署,增强了NameNodes的水平扩展能力和可用性: l MapReduce将JobTracker中的资源管理及任务生命周期管理(包括定时触发及监控),拆分成两个独立的组件,并更名为YARN(Yet Another Re

spring+springmvc+hibernate架构、maven分模块开发样例小项目案例

maven分模块开发样例小项目案例 spring+springmvc+hibernate架构 以用户管理做測试,分dao,sevices,web层,分模块开发測试!因时间关系.仅仅測查询成功.其它的准备在ext上做个完整的案例来的,可惜近期时间非常紧. 高级部分也没做測试,比方建私服,其它经常使用插件測试之类的,等用时间了我做个完整ext前端和maven 完整的样例出来,在分享吧. 只是眼下这些撑握了.在项目中做开发是没有问题的,其它高级部分是架构师所做的. 之前我有的资源都加上了积分,有些博友

用maven定制一个车联网的天气预报解析项目

用maven定制一个车联网的天气预报解析项目 1:首先我们要根据之前的学习先创建一个maven项目 本实例以Gao这个项目来介绍,我们要做的功能是把车联网返回的内容解析并格式化后显示出来.车联网天气查询api地址http://developer.baidu.com/map/carapi-7.htm 在此我们需要一个开发者密钥即访问接口中的参数ak.我已经申请好,没有直接使用了,没有的童鞋可以去申请一个. 2:添加新的依赖 由于我们要解析接口默认返回的xml格式的数据,所以我们要用到一些解析xml

使用 maven:archetype 创建JSF2 + EJB3.1 + JPA2项目骨架并在JBoss WildFly 8.1上部署

执行以下命令创建项目骨架: mvn archetype:generate -DarchetypeGroupId=org.jboss.spec.archetypes -DarchetypeArtifactId=jboss-javaee6-webapp-ear-archetype -DarchetypeVersion=7.1.1.Final -DgroupId={你的groupId} -DartifactId={你的artifactId} -Dversion=1.0-SNAPSHOT 项目生成完毕后

Hadoop1.x版本升级Hadoop2.x

引言 随着企业数据化和Hadoop的应用越加广泛,hadoop1.x的框架设计越来越无法满足人们对需求,Apache一直在对Hadoop1.x进行修改,最后推出了新一代的Hadoop2.x.从业界使用分布式系统的变化趋势和 hadoop 框架的长远发展来看,MapReduce 的 JobTracker/TaskTracker 机制需要大规模的调整来修复它在可扩展性,内存消耗,线程模型,可靠性和性能上的缺陷.为从根本上解决旧 MapReduce 框架的性能瓶颈,促进 Hadoop 框架的更长远发展

发布Maven构件到中央仓库

使用maven有一段时间了,不管你同意与否,我都坚决认定maven是很伟大的软件项目,使用它,可以节约很多时间,特别是和git搭配使用的时候,简直就是绝了,就像川菜的花椒和海椒的搭配一样,无与伦比,用过之后肯定会爱上它的.在我的以前的博客里面有关于怎样使用git(eclipse里面的egit插件)管理项目的说明,下面我就怎样将构件发布到maven的中央仓库进行说明.如果你还不知道什么事maven或者git(及时你的工作不会使用到它们,但是都应该有所了解吧),那真的应该去了解一下了. 这里需要说明

maven的安装及构建简单的项目

1.maven的主要功能 可以对项目依赖的jar包进行管理,可以让项目保持基本的依赖,排除冗余jar包,并且可以非常轻松的对依赖的jar包进行版本升级.而这些仅仅是Maven最基本的功能,它可以在这基础上对项目进行清理.编译.测试.打包.发布等等构建项目的工作. 2.maven的下载安装 (1)下载 从http://maven.apache.org/中下载最新版本. (2)解压 解压缩下载的zip文件到本地目录下,我放在了C:\Program Files\apache-maven-3.3.1-b