本地运行
- 解压Hadoop安装包
hadoop-2.5.0-cdh5.3.6.tar.gz
- 设置
HADOOP_HOME
环境变量(最好在用户变量和系统变量中均设置)和系统Path
变量:
用户和系统的环境变量.png
Path变量.png - 解压
hadoop-common-2.2.0-bin-32.rar
,将解压后所有的文件复制到${HADOOP_HOME}/bin
文件夹中 - 开发MR任务后,直接运行,和普通java任务一样
注意
- 无需将各类配置文件(如core-site.xml等)添加至
resources
资源文件夹中 - 访问远程集群时需要添加的参数
// 访问远程HDFS集群 conf.set("fs.defaultFS", "hdfs://bigdata.liangxw.com:9000"); // 访问远程Zookeeper集群 conf.set("hbase.zookeeper.quorum", "bigdata.liangxw.com:2181");
本地提交集群运行
- 同Windwos本地运行
- 同Windwos本地运行
- 同Windwos本地运行
- 将各类配置文件(如
core-site.xml
等)拷贝到项目资源文件中 - 添加集群参数
// 本地提交集群运行, 需要添加的参数(必须的四个参数) this.conf.set("fs.defaultFS", "hdfs://bigdata.liangxw.com:9000"); this.conf.set("mapreduce.framework.name", "yarn"); this.conf.set("yarn.resourcemanager.address", "bigdata.liangxw.com:8032"); this.conf.set("mapreduce.app-submission.cross-platform", "true");// 集群交叉提交
- 项目打包
mvn -P dev clean package
- 将打包后的jar文件添加到conf环境中去
// 远程提交, 这里的路径就是打包好后jar文件所在的文件路径 ((org.apache.hadoop.mapred.JobConf) job.getConfiguration()).setJar("target/analysis-0.0.1-SNAPSHOT.jar");
集群运行
- 如果MapReduce任务中涉及到第三方的jar包,那么需要将第三方的jar包引入到Hadoop的环境变量中
在etc/hadoop/hadoop-env.sh
最后加下面代码:export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/modules/hbase-0.98.6-cdh5.3.6/lib/*
- 打包
mvn -P dev clean package`
- 运行
yarn jar xxx.jar com.xxx.xxx input_data_dir output_result_dir`
关于HBase任务的提交
从HBase读数据
设置TableMapReduceUtil.initTableMapperJob
方法,各项参数分别为:表名,查询范围,Mapper类,输出键类型,输出值类型,job,是否添加依赖包
// 方式一:本地运行测试
// 本地测试无需添加依赖包
TableMapReduceUtil.initTableMapperJob("weibo:weibo-content", scan, ReadDataFromHBaseMapper.class, Text.class, Text.class, job, false);
// 方式二:打成jar放到集群上运行
// 集群运行默认添加依赖包
TableMapReduceUtil.initTableMapperJob("weibo:weibo-content", scan, ReadDataFromHBaseMapper.class, Text.class, Text.class, job);
向HBase写数据
// 方式一:本地运行测试
TableMapReduceUtil.initTableReducerJob("weibo:weibo-content", null, job, null, null, null, null, false);
// 方式二:打成jar放到集群上运行
TableMapReduceUtil.initTableReducerJob("weibo:weibo-content", null, job);
常见异常
权限异常
通常是由于没有权限的用户进行访问HDFS造成的,异常描述如下:
解决方案:
- 修改
dfs.permissions.enabled
参数
将hdfs-site.xml
文件中的dfs.permissions.enabled
的值设为false,然后重启Hadoop集群即可。使得Hadoop集群不进行用户权限控制(默认为进行控制)。 - 客户端使用
UserGroupInformation
类创建远程代理用户
比如上述异常的解决方法就是创建一个远程代理用户ibeifeng
,然后使用该远程代理用户调用正常的代码即可。// 如果参数dfs.permissions.enabled设置为true(默认为true), // 而且在本地运行MR程序的用户名和HDFS的有权限的用户名不同, // 那么需要使用UserGroupInformation来创建远程用户 final String[] args0 = args; UserGroupInformation.createRemoteUser("liang").doAs(new PrivilegedAction<Object>() { public Object run() { try { int exitCode = ToolRunner.run(new AnalyserLogDataRunner(), args0); if (exitCode == 0) { System.out.println("运行成功"); } else { System.out.println("运行失败"); } } catch (Exception e) { e.printStackTrace(); } return null; } });
网友评论