dataflow论文阅读笔记 Polysh的安装使用 SnappyData排序函数比较 Squirrel-sql客户端连接SnappyData手册 在虚拟机里显示Hello World spark学习博客推荐 SnappyData学习博客和官网文章 Docker常用命令 MyBatis支持的OGNL语法 mysql性能优化 mysql性能优化-优化Sql语句 java各版本新特性 mac上命令行操作 explain输出格式 从文件中读取zk配置——ZooKeeper编程技能(1) git进阶经验-从项目中删除移除的目录 Mongodb 学习之shell命令操作(3) mysql命令 git进阶经验-从多模块项目中分理子模块 从零学hadoop-搭建基础(单点)的Hdfs环境 ZooKeeper集群操作脚本 Vue安装使用 2 初学JVM之问答式记住类加载机制 2 初学JVM之问答式记住虚拟机性能监控与故障处理工具 2 初学JVM之问答式记住垃圾收集器 log4j2 按天生成日志文件 1 初学JVM之问答式记住java自动内存管理 MapReduce学习心得之MapReduce初识 log4j2 日志发送到kafka配置实战 log4j2 日志配置实战 Mongodb 学习之shell命令操作(二) Mongodb 学习之linux版本安装(一) Dubbo的初级使用 ServiceLoader内部实现分析 ServiceLoader 初级应用 log4j日志发送邮件配置实战 红黑树笔记 IDEA首次使用之前的配置 java源码学习之Enum java源码学习之String 自定义Spring tag标签 编写一键发布脚本 记一次Spring Scheduler莫名不执行的一次堆栈分析 kafka的基本操作 nginx 5:Nginx内部变量 nginx 4:Nginx日志管理 提高hadoop配置效率的shell脚本 Hive编程指南之一 Hive的安装 Ambari服务器安装 Ambari服务器管理集群 HBase分布式安装 windows下Eclipse远程调试运行MR程序 基于MapReduce新的API的编程Demo-wordCount window下Eclipse远程只读HDFS上的文件 YARN上节点标签 编写第一个MapReduce的wordcount程序 NodeManager的重启 搭建JStorm集群 YARN上的web应用代理 YARN上的ResourceManager的高可用方案 配置vmware中的虚拟机使用宿主机的共享网络 YARN架构简述 HDFS 架构 Spring的统一异常处理机制 Tomcat 配置服务 HDFS的viewfs指南 HDFS的Federation之路 HDFS基于QJM的HA之路 nginx 3:Nginx反向代理 mybatis操作主体流程 1.正则表达式学习-基础篇 log4j日志配置详解 mysql的时间函数 nginx 2:Nginx模块配置理论及实战 HashMap相关解析和测试文章 工作一年后的面试 用私有构造器或枚举类型强化Singleton属性 java中比较重要的图 mybatis处理枚举类 mybatis集成进spring Spring比较重要的几个截图 21.hadoop-2.7.2官网文档翻译-使用NFS的HDFS高可用性 20.hadoop-2.7.2官网文档翻译-使用仲裁日志管理器的HDFS高可用性 markdown在jekyll中支持的一些操作 Spring项目中配置sl4j和log4j的日志配置 19.hadoop-2.7.2官网文档翻译-HDFS命令指南 Spring的profile机制介绍 mybatis-generator反向生成 18.hadoop-2.7.2官网文档翻译-HDFS用户指南 17.hadoop-2.7.2官网文档翻译-实现Hadoop中Dapper-like追踪 16.hadoop-2.7.2官网文档翻译-Hadoop的KMS(key 管理服务器)-文档集 15.hadoop-2.7.2官网文档翻译-Hadoop的http web认证 14.hadoop-2.7.2官网文档翻译-服务级别的授权指南 13.hadoop-2.7.2官网文档翻译-安全模式中的Hadoop 09.hadoop-2.7.2官网文档翻译-Hadoop命令行微型集群 12.hadoop-2.7.2官网文档翻译-机架感知 11.hadoop-2.7.2官网文档翻译-代理用户-超级用户对其他用户的代表 10.hadoop-2.7.2官网文档翻译-原生库指南 08.hadoop-2.7.2官网文档翻译-文件系统规范 07.hadoop-2.7.2官网文档翻译-Hadoop接口类别 (转)浅析 Decorator 模式,兼谈 CDI Decorator 注解 06.hadoop-2.7.2官网文档翻译-Hadoop的兼容性 05.hadoop-2.7.2官网文档翻译-文件系统命令 04.hadoop-2.7.2官网文档翻译-Hadoop命令指南 03.hadoop-2.7.2官网文档翻译-集群安装 02.hadoop-2.7.2官网文档翻译-单节点集群安装 01.hadoop-2.7.2官网文档翻译-概述 Http 协议相应状态码大全及常用状态码 IDEA快捷键 JDBC Type与Java Type redis 12:redis 操作集合 mybatis-generator错误集合 redis 11:redis 错误集合 nginx 1:nginx的安装 redis 10:redis cluster命令操作 redis 9:redis实例集群安装 java设计模式 hadoop集群学习笔记(1) Apache Shiro 简介 vim编辑神器的进阶命令 Eclipse配置 Eclipse快捷键 Linux 测试题 Linux脚本学习(1) Linux启动简要过程 Centos7上安装Mysql hadoop集群学习笔记(1) (转)分布式发布订阅消息系统 Kafka 架构设计 maven 命令 Kafka集群安装 Kafka初步使用 redis 8:redis server 和 scripting命令操作 redis 7:redis transaction 和 connection命令操作 redis 6:redis hash 命令操作 redis 5:redis sorted_set 命令操作 搭建本地Jekyll+Markdown+Github的开发环境 Spring源码阅读笔记(2) redis 4:redis set命令操作 Spring添加任务调度配置 redis 3:Redis list命令操作 redis 2:redis 一般命令操作 redis 1:redis单机安装笔记 redis 0:redis配置属性描述 Spring源码阅读笔记(1) spark 错误集锦 spark集群安装 Linux 基本命令操作 Hadoop错误信息处理 Hadoop代码拾忆 从零开始搭建spring-springmvc-mybatis-mysql和dubbo项目 java知识点札记 java排错 Google Java Style 中文版 git进阶经验 github使用经验 MongoDB用户角色授权与AUTH启用 MongoDB 命令 MongoDB 特定规范 Spring MVC实现跳转的几种方式 史上最全最强SpringMVC详细示例实战教程 Spring 零星笔记 js中(function(){…})()立即执行函数写法理解 如何解决跨域问题 创建ajax简单过程 前端定位 设置MYSQL允许通过IP访问 mybatis异常 :元素内容必须由格式正确的字符数据或标记组成 如何为 WordPress 绑定多个域名的方法s WordPress工作原理之程序文件执行顺序(传说中的架构源码分析) Spring源码导入Eclipse中 基于PHPnow搭建Eclipse开发环境 解决wordpress首页文章内容截断处理的几种方法 ZooKeeper理论知识 ZooKeeper集群安装配置 Git常用命令速查表 Linux 4:磁盘与文件系统管理 Linux 3:文件与目录管理 Linux 2:文件权限与目录配置 Markdown输入LaTeX数学公式
从零学hadoop-搭建基础(单点)的Hdfs环境 MapReduce学习心得之MapReduce初识 Ambari服务器安装 Ambari服务器管理集群 windows下Eclipse远程调试运行MR程序 基于MapReduce新的API的编程Demo-wordCount window下Eclipse远程只读HDFS上的文件 YARN上节点标签 编写第一个MapReduce的wordcount程序 NodeManager的重启 YARN上的web应用代理 YARN上的ResourceManager的高可用方案 YARN架构简述 HDFS 架构 HDFS的viewfs指南 HDFS的Federation之路 HDFS基于QJM的HA之路 21.hadoop-2.7.2官网文档翻译-使用NFS的HDFS高可用性 20.hadoop-2.7.2官网文档翻译-使用仲裁日志管理器的HDFS高可用性 19.hadoop-2.7.2官网文档翻译-HDFS命令指南 18.hadoop-2.7.2官网文档翻译-HDFS用户指南 17.hadoop-2.7.2官网文档翻译-实现Hadoop中Dapper-like追踪 16.hadoop-2.7.2官网文档翻译-Hadoop的KMS(key 管理服务器)-文档集 15.hadoop-2.7.2官网文档翻译-Hadoop的http web认证 14.hadoop-2.7.2官网文档翻译-服务级别的授权指南 13.hadoop-2.7.2官网文档翻译-安全模式中的Hadoop 09.hadoop-2.7.2官网文档翻译-Hadoop命令行微型集群 12.hadoop-2.7.2官网文档翻译-机架感知 11.hadoop-2.7.2官网文档翻译-代理用户-超级用户对其他用户的代表 10.hadoop-2.7.2官网文档翻译-原生库指南 08.hadoop-2.7.2官网文档翻译-文件系统规范 07.hadoop-2.7.2官网文档翻译-Hadoop接口类别 06.hadoop-2.7.2官网文档翻译-Hadoop的兼容性 05.hadoop-2.7.2官网文档翻译-文件系统命令 04.hadoop-2.7.2官网文档翻译-Hadoop命令指南 03.hadoop-2.7.2官网文档翻译-集群安装 02.hadoop-2.7.2官网文档翻译-单节点集群安装 01.hadoop-2.7.2官网文档翻译-概述 hadoop集群学习笔记(1) hadoop集群学习笔记(1) Hadoop错误信息处理 Hadoop代码拾忆

windows下Eclipse远程调试运行MR程序

2016年12月15日
摘要:windows下Eclipse远程调试运行MR程序

准备环境

运行环境

  • hadoop2.7.2 集群环境(三个节点,h2m1,h2s1,h2s2)
  • jdk 1.7.0_75版本
  • centos6.5系统

开发环境

  • windows7 企业版 64位
  • 8G内存
  • eclipse 4.5
  • 插件 hadoop-eclipse-plugin-2.6.0.jar,用于查看远端的HDFS上的文件

将Linux上成功配置了YARN集群的相同hadoop版本(hadoop2.7.2)下载一份到开发机器win7上, 下载hadoop2.6(x64)V0.2 或者hadoop.dll、winutils.exe 或者github上的项目将其bin目录下文件或直接文件覆盖到Hadoop2.7.2(windows开发调试环境)的bin下

配置HADOOP_HOMEPATH两个系统环境变量。为了避免不生效,重启电脑。 如果还是会报错:找不到/tmp/hadoop-yarn/staging/JING/.staging/job_1481726235168_0009/job.splitmetainfo, 那就在Eclipse中项目属性中也配置以上的环境变量。

配置eclipse中的环境变量

使用maven创建项目 并编写MR程序

Mapper和Reducer代码参考:编写MR程序

完整本地调试的主Job类

package cn.followtry.hadoop.demo.v2.mr;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.followtry.hadoop.demo.hdfs.HDFSOper;
import cn.followtry.hadoop.demo.util.DebugConfUtil;

/**
 * 
 * brief-hadoop-demo/cn.followtry.hadoop.demo.v2.mr.WordCountV2
 * 
 * @author jingzz
 * @since 2016年12月14日 上午10:03:48
 */
public class WordCountV2 {

	private static final Logger LOGGER = LoggerFactory.getLogger(WordCountV2.class);

	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
		Configuration conf = new Configuration();
		String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
		if (otherArgs == null || otherArgs.length < 2) {
			System.out.println("用法:\n" + "     至少需要两个参数,最后一个为输出目录,其他为输入文件路径");
			System.exit(-1);
		}
		StringBuilder inputPaths = new StringBuilder();
		String outpathDir;
		int len = otherArgs.length - 1;
		for (int i = 0; i < len; i++) {
			inputPaths.append(otherArgs[i]);
			if (i < len - 1) {
				inputPaths.append(",");
			}
		}
		outpathDir = otherArgs[len];
		// 检查输出目录是否存在,存在则直接删除目录
		HDFSOper.rmExistsOutputDir(outpathDir);

		// 只有在当前系统为windows是设置该debug配置
		String osName = System.getProperties().getProperty("os.name").toLowerCase();
		if (osName.contains("windows")) {
			LOGGER.info("运行在windows平台,需要设置配置");
			String jarPath = "d:\\mapreduce.jar";
			DebugConfUtil.setLocalDebugConfiguration(jarPath, conf);
		} else {
			LOGGER.info("运行在{}平台", osName);
		}
		Job job = Job.getInstance(conf, "wordCount v2 demo 2");

		job.setJarByClass(WordCountV2.class);

		job.setMapperClass(WordCountMapV2.class);
		job.setCombinerClass(WordCountReduceV2.class);
		job.setReducerClass(WordCountReduceV2.class);

		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);

		FileInputFormat.setInputPaths(job, inputPaths.toString());
		FileOutputFormat.setOutputPath(job, new Path(outpathDir));

		System.exit(job.waitForCompletion(true) ? 0 : 1);
	}
}

提取的工具类DebugConfUtil.java

package cn.followtry.hadoop.demo.util;

import org.apache.hadoop.conf.Configuration;

/**
 *  brief-hadoop-demo/cn.followtry.hadoop.demo.util.DebugConfUtil
 * @author 
 *		jingzz 
 * @since 
 *		2016年12月15日 下午12:32:02
 */
public class DebugConfUtil {
	
	private DebugConfUtil() {
	}
	
	/**
	 * 设置win本地调试提交MR程序到远程YARN集群上的配置信息
	 * @author jingzz
	 * @param jarPath 生成的jar的位置
	 * @param conf 传入Configuration类
	 */
	public static void setLocalDebugConfiguration(String jarPath, Configuration conf) {
		
		conf.set("mapreduce.framework.name", "yarn");  
		/*
		 * 避免/tmp/hadoop-yarn/staging/JING/.staging/job_1481726235168_0009/job.splitmetainfo找不到的错误
		 * value为hdfs-site.xml的dfs.namenode.rpc-address.ns1属性指定的值。
		 */
		conf.set("fs.defaultFS", "hdfs://h2m1:8220");  
		
		//避免ExitCodeException exitCode=1: /bin/bash: line 0: fg: no job control
		conf.set("mapred.remote.os", "Linux");  
		conf.set("mapreduce.app-submission.cross-platform", "true"); 
		
		/*
		 * 避免Retrying connect to server: 0.0.0.0/0.0.0.0:8030
		 * 一般为默认设置,value为主yarn的resourcemanager节点的host:port
		 */
		conf.set("yarn.resourcemanager.scheduler.address", "h2m1:8030");  
		conf.set("yarn.resourcemanager.address", "192.168.2.201:8032");
		
		/*
		 * 避免java.lang.ClassNotFoundException: Class cn.followtry.hadoop.demo.v2.mr.WordCountMapV2 not found问题
		 * 日志提示:No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String)
		 * 所以不管是在Eclipse中直接调试运行还是上传到Yarn集群,都需要先打成Jar包。
		 * "mapred.jar"不需要动,只要将"d:\\mapreduce.jar"处替换为打好包的jar的位置。
		 * "mapred.jar" 已经过期,请替换为"mapreduce.job.jar"
		 */
		//conf.set("mapred.jar", "d:\\mapreduce.jar");
		conf.set("mapreduce.job.jar", jarPath);
	}
	
}

为了在本地远程调试和提交到远程YARN集群上执行间最小的变动,将输入输出配置为参数执行。如下:

项目右击 –> Run As –> Run Configurations –> Arguments –> 在下面空白框内设置input和output两个实际的参数 –> Run 。

参数配置

这样就可以在本地调试MapReduce程序了。

执行结果:

目录webhdfs://h2m1:50070/user/root/output不存在
 INFO - 目录webhdfs://h2m1:50070/user/root/output不存在
  INFO - Connecting to ResourceManager at /192.168.2.201:8032
  WARN - Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
  INFO - Total input paths to process : 2
  INFO - number of splits:2
  INFO - Submitting tokens for job: job_1481717720063_0021
  INFO - Submitted application application_1481717720063_0021
  INFO - The url to track the job: http://h2m1:8088/proxy/application_1481717720063_0021/
  INFO - Running job: job_1481717720063_0021
  INFO - Job job_1481717720063_0021 running in uber mode : false
  INFO -  map 0% reduce 0%
  INFO -  map 50% reduce 0%
  INFO -  map 100% reduce 0%
  INFO -  map 100% reduce 100%
  INFO - Job job_1481717720063_0021 completed successfully

查看执行结果

可以通过已经配置好的Hadoop-eclpse-plugin查看/user/root/output下的part-r-00000结果文件。

问题解决参考:

  1. Exceptionin thread “main” java.lang.UnsatisfiedLinkError:org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSumsByteArray(II[BI[BIILjav
  2. Eclipse下配置应用运行的环境变量
  3. hadoop-eclipse插件配置
  4. 编译Eclipse中hadoop插件hadoop2x-eclipse-plugin
  5. java.lang.RuntimeException: java.lang.ClassNotFoundException的原因
  6. YARN中JVM的重用功能(UBER)