在jobcontext中找不到作业信息

qfe3c7zg  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(358)

我正在远程计算机上运行一个java程序,并尝试使用recordreader对象读取分割的数据,但得到:

Exception in thread "main" java.io.IOException: job information not found in JobContext. HCatInputFormat.setInput() not called?

我已经打了以下电话:

_hcatInputFmt = HCatInputFormat.setInput(_myJob, db,tbl);

然后将recordreader对象创建为:

_hcatInputFmt.createRecordReader(hSplit, taskContext)

在调试时,在尝试创建recordreader对象时,在作业配置对象中搜索key:hcat\u key\u job\u info的值时失败。
如何设置此值?任何提示都会有帮助。
谢谢。

kognpnkq

kognpnkq1#

我们必须使用 getConfiguration() 方法从作业对象获取配置。创建作业对象时使用的配置对象无法执行此操作。

myzjeezk

myzjeezk2#

我也有同样的问题,你应该用:

HCatInputFormat.setInput(job, dbName, inputTableName);
    HCatSchema inputschema = HCatBaseInputFormat.getTableSchema(job.getConfiguration());

HCatInputFormat.setInput(job, dbName, inputTableName);
    HCatSchema inputschema = HCatBaseInputFormat.getTableSchema(getConf());

因为,当你使用 Job.getInstance(conf) ,它将复制conf,您不能使用原始conf。下面是代码:

/**
 * A new configuration with the same settings cloned from another.
 * 
 * @param other the configuration from which to clone settings.
 */
@SuppressWarnings("unchecked")
public Configuration(Configuration other) {
  this.resources = (ArrayList<Resource>) other.resources.clone();
  synchronized(other) {
 if (other.properties != null) {
   this.properties = (Properties)other.properties.clone();
 }

 if (other.overlay!=null) {
   this.overlay = (Properties)other.overlay.clone();
 }

 this.updatingResource = new ConcurrentHashMap<String, String[]>(
     other.updatingResource);
 this.finalParameters = Collections.newSetFromMap(
     new ConcurrentHashMap<String, Boolean>());
 this.finalParameters.addAll(other.finalParameters);
}

 synchronized(Configuration.class) {
  REGISTRY.put(this, null);
}
this.classLoader = other.classLoader;
this.loadDefaults = other.loadDefaults;
setQuietMode(other.getQuietMode());
}

相关问题