Apache gora,在减速器中设置新 table 名称的位置

Apache gora, where to set new table name in reducer

我有一个基本上是 Apache Gora 的 Hbase Mapreduce 作业的应用程序。 我的情况很简单,我想将一个 Hbase table 数据复制到一个新的 table。在哪里写新的 table 名字。我查看了 this Guide 但找不到放置新 table 名称的位置。 以下是代码片段,

/* Mappers are initialized with GoraMapper.initMapper() or 
   * GoraInputFormat.setInput()*/
  GoraMapper.initMapperJob(job, inStore, TextLong.class, LongWritable.class,
      LogAnalyticsMapper.class, true);

  /* Reducers are initialized with GoraReducer#initReducer().
   * If the output is not to be persisted via Gora, any reducer 
   * can be used instead. */
  GoraReducer.initReducerJob(job, outStore, LogAnalyticsReducer.class);

对于这种情况,简单的 MR 作业非常容易。

我会将您重定向到 tutorial,但我会尝试在这里澄清 :)

table 名称在您的映射中定义。检查 Table Mappings。也许您有一个名为 gora-hbase-mapping.xml 的文件,其中定义了映射。 应该是这样的:

<table name="Nameofatable">
...
<class name="blah.blah.EntityA" keyClass="java.lang.Long" table="Nameofatable">

在那里配置 table 名称(如果找到两者,请输入相同的名称)。可以有多个<table><class>。也许一个用于您的输入,一个用于您的输出。

在那之后,您必须实例化您的 input/output 数据存储 inStoreoutStore。教程有点乱,inStoreoutStore 的创建得到了 to the wrong section。您只需执行以下操作:

inStore = DataStoreFactory.getDataStore(String.class, EntityA.class, hadoopConf);
outStore = DataStoreFactory.getDataStore(Long.class, OtherEntity.class, hadoopConf);

解释"in the other way":

  • 您使用 DataStoreFactory.getDatastore(key class, entity class, conf).
  • 实例化数据存储
  • 请求的实体 class 正在 gora-hbase-mapping.xml 中查找 <class name="blah.blah.EntityA"
  • 其中<class>就是属性table=那是你的table名字:)

因此:您将一个实体定义为具有 table 名称的输入,并将一个实体定义为具有其 table 名称

的输出

编辑 1:

如果实体class相同,但table名称不同,我能想到的唯一解决方案是创建两个classes Entity1Entity2 具有相同的架构,并在您的 gora-hbase-mapping.xml 中创建两个 <table><class>。 然后像这样实例化商店:

inStore = DataStoreFactory.getDataStore(String.class, Entity1.class, hadoopConf);
outStore = DataStoreFactory.getDataStore(String.class, Entity2.class, hadoopConf);

它不是很干净,但应该可以工作:\


编辑 2(不适用于此问题):

如果源 table 和目标 table 相同,则 initReducerJob 的版本允许此 behavior.An 示例在 Nutch's GeneratorJob.java 中:

StorageUtils.initMapperJob(currentJob, fields, SelectorEntry.class, WebPage.class, GeneratorMapper.class, SelectorEntryPartitioner.class, true);
StorageUtils.initReducerJob(currentJob, GeneratorReducer.class);