1

我有一个应用程序,它基本上是 Apache Gora 的 Hbase Mapreduce 作业。我是一个非常简单的案例,我想将一个 Hbase 表数据复制到一个新表中。在哪里写新的表名。我已经查看了本指南,但找不到放置新表名的位置。以下是代码片段,

/* 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 工作非常容易。

4

1 回答 1

1

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

表名在您的映射中定义。检查表映射。也许您有一个名为gora-hbase-mapping.xml映射定义的文件。应该有这样的东西:

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

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

之后,您必须实例化您的输入/输出数据存储inStoreoutStore. 该教程有点混乱,并且创建inStoreoutStore进入了错误的部分。您只需执行以下操作:

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

“以另一种方式”解释:

  • 您使用实例化数据存储DataStoreFactory.getDatastore(key class, entity class, conf).
  • 查询请求的实体gora-hbase-mapping.xml<class name="blah.blah.EntityA"
  • 因为<class>它是属性table=那是你的表名:)

所以:你用它的表名定义一个实体作为输入,你用它的表名定义一个实体作为输出


编辑1:

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

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

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


编辑2(不是这个问题):

如果源表和目标表相同,则有一个版本的 initReducerJob 允许这种行为。一个例子是在Nutch 的GeneratorJob.java

StorageUtils.initMapperJob(currentJob, fields, SelectorEntry.class, WebPage.class, GeneratorMapper.class, SelectorEntryPartitioner.class, true);
StorageUtils.initReducerJob(currentJob, GeneratorReducer.class);
于 2019-08-27T17:31:28.090 回答