MapReduce任务的三种运行方式

本地运行

  1. 解压Hadoop安装包hadoop-2.5.0-cdh5.3.6.tar.gz
  2. 设置HADOOP_HOME环境变量(最好在用户变量系统变量中均设置)和系统Path变量:
    MapReduce任务的三种运行方式_第1张图片
    用户和系统的环境变量.png

    MapReduce任务的三种运行方式_第2张图片
    Path变量.png
  3. 解压hadoop-common-2.2.0-bin-32.rar,将解压后所有的文件复制到${HADOOP_HOME}/bin文件夹中
  4. 开发MR任务后,直接运行,和普通java任务一样

注意

  1. 无需将各类配置文件(如core-site.xml等)添加至resources资源文件夹中
  2. 访问远程集群时需要添加的参数
    // 访问远程HDFS集群
    conf.set("fs.defaultFS", "hdfs://bigdata.liangxw.com:9000");
    // 访问远程Zookeeper集群
    conf.set("hbase.zookeeper.quorum", "bigdata.liangxw.com:2181");
    

本地提交集群运行

  1. Windwos本地运行
  2. Windwos本地运行
  3. Windwos本地运行
  4. 将各类配置文件(如core-site.xml等)拷贝到项目资源文件中
  5. 添加集群参数
    // 本地提交集群运行, 需要添加的参数(必须的四个参数)
    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");// 集群交叉提交
    
  6. 项目打包
    mvn -P dev clean package
    
  7. 将打包后的jar文件添加到conf环境中去
    // 远程提交, 这里的路径就是打包好后jar文件所在的文件路径
    ((org.apache.hadoop.mapred.JobConf) job.getConfiguration()).setJar("target/analysis-0.0.1-SNAPSHOT.jar");
    

集群运行

  1. 如果MapReduce任务中涉及到第三方的jar包,那么需要将第三方的jar包引入到Hadoop的环境变量中
    etc/hadoop/hadoop-env.sh最后加下面代码:
    export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/modules/hbase-0.98.6-cdh5.3.6/lib/*
    
  2. 打包
    mvn -P dev clean package`
    
  3. 运行
    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造成的,异常描述如下:

MapReduce任务的三种运行方式_第3张图片
权限异常.png

解决方案:

  1. 修改dfs.permissions.enabled参数
    hdfs-site.xml文件中的dfs.permissions.enabled的值设为false,然后重启Hadoop集群即可。使得Hadoop集群不进行用户权限控制(默认为进行控制)。
  2. 客户端使用UserGroupInformation类创建远程代理用户
    比如上述异常的解决方法就是创建一个远程代理用户ibeifeng,然后使用该远程代理用户调用正常的代码即可。
    // 如果参数dfs.permissions.enabled设置为true(默认为true),
    // 而且在本地运行MR程序的用户名和HDFS的有权限的用户名不同,
    // 那么需要使用UserGroupInformation来创建远程用户
    
    final String[] args0 = args;
    UserGroupInformation.createRemoteUser("liang").doAs(new PrivilegedAction() {
    
        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;
        }
    });
      
      
    
                                
                            
                        
                        
                        

    你可能感兴趣的:(MapReduce任务的三种运行方式)