当前位置: 首页 > 知识库问答 >
问题:

Hbase mapreduce作业:所有列值均为空

呼延光明
2023-03-14

我正在尝试创建一个地图减少工作在Java的表从一个HBase数据库。使用这里的示例和internet上的其他内容,我成功地编写了一个简单的行计数器。然而,试图编写一个实际对列中的数据执行某些操作的程序是不成功的,因为接收的字节总是空的。

我的司机工作的一部分是这样的:

/* Set main, map and reduce classes */
job.setJarByClass(Driver.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);

Scan scan = new Scan();
scan.setCaching(500);
scan.setCacheBlocks(false);

/* Get data only from the last 24h */
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
try {
    long now = timestamp.getTime();
    scan.setTimeRange(now - 24 * 60 * 60 * 1000, now);
} catch (IOException e) {
    e.printStackTrace();
}

/* Initialize the initTableMapperJob */
TableMapReduceUtil.initTableMapperJob(
        "dnsr",
        scan,
        Map.class,
        Text.class,
        Text.class,
        job);

/* Set output parameters */
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setOutputFormatClass(TextOutputFormat.class);

如您所见,该表称为dnsr。我的映射器如下所示:

@Override
    public void map(ImmutableBytesWritable row, Result value, Context context)
            throws InterruptedException, IOException {
        byte[] columnValue = value.getValue("d".getBytes(), "fqdn".getBytes());
        if (columnValue == null)
            return;

        byte[] firstSeen = value.getValue("d".getBytes(), "fs".getBytes());
        // if (firstSeen == null)
        //     return;

        String fqdn = new String(columnValue).toLowerCase();
        String fs = (firstSeen == null) ? "empty" : new String(firstSeen);

        context.write(new Text(fqdn), new Text(fs));
    }

一些注意事项:

  • dnsr表中的列族只是d。有多个列,其中一些列称为FQDNFS(第一次看到);
  • 即使fqdn值正确显示,但fs始终是“空”字符串(在出现一些错误表示无法将null转换为新字符串后,我添加了此检查);
  • 如果我用其他东西更改fs列名,例如ls(lastSeen),则可以使用;
  • 减速器不做任何事情,只是输出它接收到的所有东西。

我用javascript创建了一个简单的表扫描程序,它查询完全相同的表和列,我可以清楚地看到这些值。使用命令行并手动进行查询,我可以清楚地看到fs值不是null,它们是字节,以后可以转换为字符串(表示日期)。

我总是空的问题是什么?

谢谢!

更新:如果我获得了特定列族中的所有列,我不会收到fs。但是,javascript中实现的简单扫描程序将fs作为dnsr表中的列返回。

@Override
public void map(ImmutableBytesWritable row, Result value, Context context)
        throws InterruptedException, IOException {
    byte[] columnValue = value.getValue(columnFamily, fqdnColumnName);
    if (columnValue == null)
        return;
    String fqdn = new String(columnValue).toLowerCase();

    /* Getting all the columns */
    String[] cns = getColumnsInColumnFamily(value, "d");
    StringBuilder sb = new StringBuilder();
    for (String s : cns) {
        sb.append(s).append(";");
    }

    context.write(new Text(fqdn), new Text(sb.toString()));
}

我用这里的一个答案得到了所有的列名。

共有1个答案

朱锐
2023-03-14

最后,我终于找到了问题所在。Hbase是一个面向列的数据存储。在这里,数据以列形式存储和检索,因此,如果只需要某些数据,则只能读取相关数据。每个列族都有一个或多个列限定符(列),每个列都有多个单元格。有趣的部分是每个细胞都有自己的时间戳。

为什么是这个问题?那么,当您在进行范围搜索时,只返回其时间戳在该范围内的单元格,因此您可能会得到一个“缺少单元格”的行。在我的例子中,我有一个DNS记录和其他字段,如firstseenlastseenlastseen是每次看到该域时都会更新的字段,firstseen在第一次出现后将保持不变。当我将ranged map reduce作业更改为一个简单的map reduce作业(使用所有时间数据)时,一切都很好(但该作业需要更长的时间才能完成)。

干杯!

 类似资料:
  • 问题内容: 我在数据库中有几个表。我想查找哪些列(在哪些表中)没有任何值(列中都为NULL)。在下面的示例中,结果应该是 我不知道如何创建这种查询。非常感谢您的帮助! 问题答案: 对于单列,返回不为null的行数: 您可以为所有列生成查询。根据Martin的建议,您可以使用排除不能为空的列。例如: 如果表的数量很大,则可以类似的方式为所有表生成查询。所有表的列表在中。

  • 问题内容: 我想在Jenkins内部设置一些自动化功能,该功能会定期轮询github组织中的存储库列表,并根据作业模板为每个Git存储库自动设置一个jenkins作业。 实现这一目标的解决方案是什么?谢谢! 问题答案: 如今,Jenkins Pipeline是必经之路。 它使用定义管道,您可以将其签入您的存储库。 最佳实践是这样的文件 如文档中所述。

  • 问题内容: 我阅读了如何使用Jenkins DSL设置作业超时。设置一项作业的超时时间。我想为所有作业设置它,并且设置略有不同:150%,平均超过10个作业,最多30分钟。 根据相关的job-dsl-plugin文档,我应该使用以下语法: 我在http://job-dsl.herokuapp.com/中进行了测试,这是相关的XML部分: 我使用之前手动编辑过的作业进行了验证,并且XML是正确的。因

  • 本文向大家介绍列出所有Apache Kafka业务相关面试题,主要包含被问及列出所有Apache Kafka业务时的应答技巧和注意事项,需要的朋友参考一下 答:Apache Kafka的业务包括: 添加和删除Kafka主题 如何修改Kafka主题 如何关机 在Kafka集群之间镜像数据 找到消费者的位置 扩展您的Kafka群集 自动迁移数据 退出服务器 数据中心

  • 问题内容: 我想检查所有值(即对应于字典中所有键的值)是否为0。是否有没有循环的方法?如果可以,怎么办? 问题答案: 用途: 如果给定的iterable的所有元素都为true,则返回。

  • 问题内容: 我无法获得熊猫列的平均值或均值。有一个数据框。我在下面尝试的任何事情都没有给我该列的平均值 以下返回几个值,而不是一个: 这样: 问题答案: 如果您只想要列的均值,请选择列(这是一个系列),然后调用: