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

在 HBASE 中使用协处理器时的 NullPointerException?

田昊天
2023-03-14

我在HDFS中使用HBASE 0.94.8。我已经实现了数值求和的协处理器。该表只有两行

hbase(主):043:0

行列单元格

行 1 列=信息:类别,时间戳=1375438808010,值=Web 行 1 列=信息:命中,时间戳=1375438797824,值=123 行 2 列=信息:类别,时间戳=

1375438834518,值=邮件
行 2 列=信息:命中,时间戳=1375438822093,值=1321

hbase(主):043:0

“演示”,{方法=

我的代码如下:

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.hbase.HBaseConfiguration; 
import org.apache.hadoop.hbase.HColumnDescriptor; 
import org.apache.hadoop.hbase.HTableDescriptor; 
import org.apache.hadoop.hbase.KeyValue; 
import org.apache.hadoop.hbase.client.HBaseAdmin; 
import org.apache.hadoop.hbase.client.HTable; 
import org.apache.hadoop.hbase.client.Result; 
import org.apache.hadoop.hbase.client.ResultScanner; 
import org.apache.hadoop.hbase.client.Scan; 
import org.apache.hadoop.hbase.client.coprocessor.AggregationClient; 
import org.apache.hadoop.hbase.client.coprocessor.LongColumnInterpreter;
import org.apache.hadoop.hbase.util.Bytes; 
import org.apache.hadoop.hbase.coprocessor.ColumnInterpreter; 
import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;
public class webAggregator {

   // private static final byte[] EDRP_FAMILY = Bytes.toBytes("EDRP");
   // private static final byte[] EDRP_QUALIFIER = Bytes.toBytes("advanceKWh");
   public static void testSumWithValidRange(Configuration conf,
                 String[] otherArgs) throws Throwable {
          byte[] EDRP_TABLE = Bytes.toBytes(otherArgs[0]);
          byte[] EDRP_FAMILY = Bytes.toBytes(otherArgs[1]);
          byte[] EDRP_QUALIFIER = Bytes.toBytes(otherArgs[2]);

          conf.set("hbase.zookeeper.quorum", "master");
          conf.set("hbase.zookeeper.property.clientPort", "2222");

          conf.setLong("hbase.rpc.timeout", 600000);

          conf.setLong("hbase.client.scanner.caching", 1000);
          conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,
                       "org.apache.hadoop.hbase.coprocessor.AggregateImplementation");

          // Utility.CreateHBaseTable(conf, otherArgs[1], otherArgs[2], true);
          /*HBaseAdmin admin = new HBaseAdmin(conf);
          HTableDescriptor desc = new HTableDescriptor(EDRP_TABLE);
          desc.addFamily(new HColumnDescriptor(EDRP_FAMILY));
          admin.createTable(desc);*/

          AggregationClient aClient = new AggregationClient(conf);
          Scan scan = new Scan();
          scan.addColumn(EDRP_FAMILY, EDRP_QUALIFIER);


          HTable table = new HTable(conf, "demo");
          Scan s = new Scan();
          ResultScanner ss = table.getScanner(s);
          for(Result r:ss){
              for(KeyValue kv : r.raw()){
                 System.out.print(new String(kv.getRow()) + " ");
                 System.out.print(new String(kv.getFamily()) + ":");
                 System.out.print(new String(kv.getQualifier()) + " ");
                 System.out.print(kv.getTimestamp() + " ");
                 System.out.println(new String(kv.getValue()));
              }
          }

          final ColumnInterpreter<Long, Long> ci = new LongColumnInterpreter();
          long sum = aClient.sum(Bytes.toBytes(otherArgs[0]), ci, scan);
          System.out.println(sum);
   }

   /**
   * Main entry point.
   *
   * @param argsThe
   *            command line parameters.
   * @throws Exception
   *             When running the job fails.
   */
   public static void main(String[] args) throws Exception {
     Configuration conf = HBaseConfiguration.create();
       String[] otherArgs ={"demo","info","hits"};
      try {
         testSumWithValidRange(conf, otherArgs);
       } catch (Throwable e) {
         e.printStackTrace();
       }
   } }

我的堆栈跟踪如下所示:

web aggregator . main(web aggregator . Java:79)上的java.lang.NullPointerException

请帮忙。

共有2个答案

东门翰
2023-03-14

问题在于数据类型。

A. put.addColumn(Bytes.toBytes("objects"), Bytes.toBytes("info"), Bytes.toBytes(1.0));

max/min/sum可以。但是

B. put.addColumn(Bytes.toBytes("objects"), Bytes.toBytes("info"), Bytes.toBytes("1.0"));

这是不好的。从hbase shell,我们可以看到

A. column=objects:info, timestamp=1525942759312, value=?\xF0\x00\x00\x00\x00\x00\x00
B. column=objects:info, timestamp=1525941054901, value=1.0
慕逸仙
2023-03-14

我和你犯了同样的错误。经过一些调查,我发现问题是我的列类型是整数,所以LongColumnInterpreter。getValue方法返回null。

从您的代码和结果来看,我确定您的“info:hits”列是字符串列,而不是长列。

只需考虑将hits改为真正的long列,从hbase shell来看,它的值应该如下所示

11Ak8Z4Mswtk00:MXf1NZ                        column=f1:dp, timestamp=1400144073173, value=\x00\x00\x00\x00\x00\x00\x00b 

或者你可以自己编写一个 ColumnInterpreter 来处理字符串值总和。

 类似资料:
  • HBase 协处理器以 Google BigTable 的协处理器实现为模型( http://research.google.com/people/jeff/SOCC2010-keynote-slides.pdf 第 41-42 页。)。 协处理器框架提供了直接在管理数据的 RegionServers 上运行自定义代码的机制。正在努力弥合 HBase 实施与 BigTable 架构之间的差距。有关

  • 一、简述 在使用 HBase 时,如果你的数据量达到了数十亿行或数百万列,此时能否在查询中返回大量数据将受制于网络的带宽,即便网络状况允许,但是客户端的计算处理也未必能够满足要求。在这种情况下,协处理器(Coprocessors)应运而生。它允许你将业务计算代码放入在 RegionServer 的协处理器中,将处理好的数据再返回给客户端,这可以极大地降低需要传输的数据量,从而获得性能上的提升。同时

  • 11.2.3 控制寄存器 控制寄存器主要用于浮点数精度选择的控制、四舍五入的控制和无穷大的控制等,其低6位还可用来决定是否屏蔽协处理器的异常。指令FLDCW可用来设置控制寄存器的值。控制寄存器中控制位的分布如图11.6所示,其控制位的含义如表11.3所列。 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0       IC RC PC     PM UM OM ZM DM

  • 11.2 协处理器的结构 协处理器,顾名思义,是为与CPU协同工作而设计的,其主要用来提高进行数学和超越函数计算的速度。在80486DX和Pentium处理器中都内置一个与80387完全兼容的协处理器。CPU执行所有的常规指令,协处理器则执行协处理器指令,它们能同时并行地执行各自的指令。由于现在Pentium处理器内部结构的特点,该处理器能同时执行一条协处理器指令和二条整数指令。 11.2.1 协

  • 我想知道什么时候应该使用

  • 1、HBase版本hbase-0.20.5,Hadoop的版本hadoop-0.20.2,JDK1.6 2、在HBase中创建了表,如果想通过控制台使用命令写入含有汉字的数据,录入是不成功的。 3、如果想对汉字进行录入,可以通过代码实现,这里我使用的是java,代码如下: /** * 向指定的表插入单个Put对象 * * @param tablename * @param

  • 我的处理器中有一个简单的注释,如下所示: 这适用于java文件,但一旦我将文件转换为kotlin,注释的导入就不再有效。为什么? 我需要改变什么才能让他的注释也在Kotlin中工作?从文档中,我可以看到kotlin与java注释100%兼容,所以我有点困惑这里有什么问题...如果处理器不工作,需要调整以与kotlin一起工作,我会理解,但我不知道为什么导入本身不工作... 我说的图书馆在这里:ht

  • 了解您可以如何在 Dreamweaver 中处理和编译 CSS 预处理器文件。 CSS 预处理器可将用预处理语言编写的代码编译到最熟悉的 CSS 中。预处理语言可将 CSS 提升到更接近编程语言的级别。 具体来说,预处理器允许您使用变量、组合单元、函数以及许多其他 在 CSS 中无法使用的方法。通过 CSS 预处理器,您只需定义所有内容一次,然后即可反复重用它们,从而产生可维护、主题化、可扩展的