阅读 16

服务器模式之在本地提交

服务器模式之在本地提交

首先需要在src下放置服务器上的hadoop配置文件



1、在本地直接调用,执行过程在服务器上(调试)

a、把MR程序打包(jar),直接放到本地
b、修改hadoop的源码 ,注意:确保项目的lib需要真实安装的jdk的lib
c、增加一个属性: 
config.set(“mapred.jar”, “C:\Users\Administrator\Desktop\wc.jar”);
d、本地执行main方法,servlet调用MR。
复制代码

配置Eclipse本地hadoop服务器模式出现的问题:
参考:

1、出现了Exception in thread “main” java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

:
一直按照网上的缺少hadoop.dll,没有配置好JAVA_HOME, PATH, CLASSPATH, winutils.exe, 一直没有弄好
解决:
将hadoop的配置文件中的主机名改为ip
发现没有该报错了,但是没有弄清楚原因\

2、ExitCodeException exitCode=1: /bin/bash: 第 0 行:fg: 无任务控制

解决方法:
在Eclipse中配置hadoop的mapred-site.xml,添加下面的配置

<property>  
        <name>mapred.remote.os</name>
        <value>Linux</value>
        <description>Remote MapReduce framework's OS, can be either Linux or Windows</description> 
    </property>
    <property>
        <name>mapreduce.app-submission.cross-platform</name>
        <value>true</value>
    </property>
复制代码

3、historyserver没有启动

cd  {HADOOP_HOME}
./sbin/mr-jobhistory-daemon.sh start historyserver
复制代码

4、No job jar file set. User classes may not be found. See Job or Job#setJar(String)

将原来的有conf来加载jar

conf.set("mapred.jar", "C:\\Users\\Administrator\\Desktop\\wc.jar");
复制代码

改为由Job加载Jar

job.setJar("C:\\Users\\Administrator\\Desktop\\wc.jar");
复制代码

结果成功了!

这里写图片描述

至此windows调试hadoop服务器模式已经成功!!!

接下来谈谈服务器模式

服务器环境:前期要求
首先需要在src下放置服务器上的hadoop配置文件
注意:hadoop的配置文件防src下, 本人尝试在src下创建一个conf的文件夹放置配置文件, 总是出问题。无奈之下,只能老实的放在src下
1、在本地直接调用,执行过程在服务器上(真正企业运行环境)

  • a、把MR程序打包(jar),直接放到本地
  • b、修改hadoop的源码 ,注意:确保项目的lib需要真实安装的jdk的lib
  • c、增加一个属性:
    config.set(“mapred.jar”, “C:\Users\Administrator\Desktop\wc.jar”);
  • ctmp 设置Jar, job.setJar(String);上面按照步骤c, 增加一个属性可能没有作用, 使用job.setJar(String);本人就是出现这种情况, 一致报没有找到mapper和reducer的类
    job.setJar("C:\\Users\\Administrator\\Desktop\\wc.jar");
  • d、本地执行main方法,servlet调用MR。
package com.chb;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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;

public class WC {
    public static void main(String[] args) {
        //设置hadoop用户,我们可能不是使用root用户,要在此处添加
        System.setProperty("HADOOP_USER_NAME", "chb");
        //加载配置
        Configuration conf = new Configuration();
        //使用config.set(jar), 总是报错, 用job.setJar(String), 加载放在本地的程序导出的jar包
        //conf.set("mapred.jar", "C:\\Users\\Administrator\\Desktop\\wc.jar");
        try {
            FileSystem fs = FileSystem.get(conf);
            //创建任务
            Job job =Job.getInstance();
            job.setJarByClass(com.chb.WC.class);
            job.setJar("C:\\Users\\Administrator\\Desktop\\wc.jar");
            job.setJobName("WC");
            //Mapper和Reducer类
            job.setMapperClass(com.chb.WCMapper.class);
            job.setReducerClass(com.chb.WCReducer.class);
            //Mapper的输出类型
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);
            //输入输出路径
            FileInputFormat.addInputPath(job, new Path("/user/chb/input/"));
            Path out = new Path("/user/chb/output/wc");
            if(fs.exists(out)) {
                fs.delete(out, true);
            }
            FileOutputFormat.setOutputPath(job, out);
            boolean f = job.waitForCompletion(true);
            if(f){
                System.out.println("任务已经完成了");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
复制代码
文章分类
代码人生
文章标签