在使用Bulkload向HBase导入数据中, 自己编写Map与使用KeyValueSortReducer生成HFile时, 出现了以下的异常:

java.io.IOException: Non-increasing Bloom keys: 201301025200000000000003520000000000000500 after 201311195100000000000000010000000000001600

at org.apache.hadoop.hbase.regionserver.StoreFile$Writer.appendGeneralBloomfilter(StoreFile.java:869)

    at org.apache.hadoop.hbase.regionserver.StoreFile$Writer.append(StoreFile.java:905)

    at org.apache.hadoop.hbase.mapreduce.HFileOutputFormat$1.write(HFileOutputFormat.java:180)

    at org.apache.hadoop.hbase.mapreduce.HFileOutputFormat$1.write(HFileOutputFormat.java:136)

    at org.apache.hadoop.mapred.ReduceTask$NewTrackingRecordWriter.write(ReduceTask.java:586)

    at org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80)

    at org.apache.hadoop.hbase.mapreduce.KeyValueSortReducer.reduce(KeyValueSortReducer.java:53)

    at org.apache.hadoop.hbase.mapreduce.KeyValueSortReducer.reduce(KeyValueSortReducer.java:36)

    at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:177)

    at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:649)

    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:418)

    at org.apache.hadoop.mapred.Child$4.run(Child.java:255)

    at java.security.AccessController.doPrivileged(Native Method)

    at javax.security.auth.Subject.doAs(Subject.java:396)

    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)

at org.apache.hadoop.mapred.Child.main(Child.java:249)

该异常在源代码的StoreFile类中, 即在使用StoreFile类生成HFile文件时抛出异常, 依据控制台异常信息能够知道异常出如今源代码StoreFile.java:905行处,此处是append方法,该方法调用appendGeneralBloomfilter方法,生成Bloom key, 源代码为:

public static class HFileGenerateMapper extends
Mapper<LongWritable, Text, ImmutableBytesWritable, KeyValue> {
private static int familyIndex = 0;
private static Configuration conf = null;
private static MyMD5 md5 = new MyMD5();
@Override
protected void setup(Context context) throws IOException,
InterruptedException {
conf = context.getConfiguration();
familyIndex = conf.getInt("familyIndex",0);
}
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
ImmutableBytesWritable mykey = new ImmutableBytesWritable(
value.toString().split(",")[0].getBytes());
List<KeyValue> list = null;
list = createKeyValue(value.toString());
Iterator<KeyValue> it = list.iterator();
while (it.hasNext()) {
KeyValue kv = new KeyValue();
kv = it.next();
if (kv != null) {
context.write(mykey, kv);
}
} }
/**
* a.CITY_NO,to_char(DT,'yyyy-MM-dd'),DATA_TYPE,E0,E1,E2,E3,E4,E5,
* MEASUREPOINTID,TRANSFORMERID,ZONEID,CAPACITY
* @param str
* @return
*/
private List<KeyValue> createKeyValue(String str) {
List<KeyValue> list = new ArrayList<KeyValue>(CONSTANT_HBASE.TB2_FNColNames[familyIndex].length);
String[] values = str.toString().split(",");
String[] qualifiersName = CONSTANT_HBASE.TB2_FNColNames[familyIndex];
for (int i = 0; i < qualifiersName.length; i++) {
//须要作为rowKey的各个字段字符串组成RowKey
String rowkey = values[1]+values[0]+values[11]+values[12];
//加上32位的MD5
rowkey += md5.getMD5Code(rowkey);
String family = CONSTANT_HBASE.TB2_FamilyNames[familyIndex];
String qualifier = qualifiersName[i];
String value_str = values[i+CONSTANT_HBASE.TB2_FNColIndex[familyIndex]-1]; KeyValue kv = new KeyValue(Bytes.toBytes(rowkey),
Bytes.toBytes(family), Bytes.toBytes(qualifier),
CONSTANT_HBASE.timeStamp, Bytes.toBytes(value_str));
list.add(kv);
}
return list;
}
}

关键出错的那一句在

ImmutableBytesWritable rowkey = new ImmutableBytesWritable(value.toString().split(",")[0].getBytes());

由于终于导入RowKey的是由多个字段的字符串+32位的MD5值拼接而成的,可是生成ImmutableBytesWritable mykey却仅仅用到第一个字段的字符串,而这个key是用来全局排序用的,所以须要mykey与KeyValue kv 的rowkey相等, 于是更改方法便是将map方法代码改成例如以下:

@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
List<KeyValue> list = null;
list = createKeyValue(value.toString());
Iterator<KeyValue> it = list.iterator();
while (it.hasNext()) {
KeyValue kv = new KeyValue();
kv = it.next();
if (kv != null) {
<span style="color:#FF0000;">context.write(new ImmutableBytesWritable(kv.getKey()), kv);</span>
}
} }

执行之后成功了,能够通过http://localhost:50030/jobtracker.jsp查看任务执行状态.

Hadoop与HBase中遇到的问题(续)java.io.IOException: Non-increasing Bloom keys异常的更多相关文章

  1. hadoop报错java.io.IOException: Incorrect configuration: namenode address dfs.namenode.servicerpc-address or dfs.namenode.rpc-address is not configured

    不多说,直接上干货! 问题详情 问题排查 spark@master:~/app/hadoop$ sbin/start-all.sh This script is Deprecated. Instead ...

  2. 什么是Zookeeper,Zookeeper的作用是什么,在Hadoop及hbase中具体作用是什么

    什么是Zookeeper,Zookeeper的作用是什么,它与NameNode及HMaster如何协作?在没有接触Zookeeper的同学,或许会有这些疑问.这里给大家总结一下. 一.什么是Zooke ...

  3. Zookeeper的作用,在Hadoop及hbase中具体作用

    什么是Zookeeper,Zookeeper的作用是什么,在Hadoop及hbase中具体作用是什么 一.什么是Zookeeper ZooKeeper 顾名思义 动物园管理员,他是拿来管大象(Hado ...

  4. HBase中此类异常解决记录org.apache.hadoop.ipc.RemoteException(java.io.IOException):

    ERROR: Can't get master address from ZooKeeper; znode data == null   一定注意这只是问题的第一层表象,真的问题是: File /hb ...

  5. windows 中使用hbase 异常:java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

    平时一般是在windows环境下进行开发,在windows 环境下操作hbase可能会出现异常(java.io.IOException: Could not locate executable nul ...

  6. 运行基准测试hadoop集群中的问题:org.apache.hadoop.ipc.RemoteException: java.io.IOException: File /benchmarks/TestDFSIO/io_data/test_

    在master(即:host2)中执行 hadoop jar hadoop-test-1.1.2.jar DFSCIOTest -write -nrFiles 12 -fileSize 10240 - ...

  7. java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries

    在已经搭建好的集群环境Centos6.6+Hadoop2.7+Hbase0.98+Spark1.3.1下,在Win7系统Intellij开发工具中调试Spark读取Hbase.运行直接报错: ? 1 ...

  8. hbase异常:java.io.IOException: Unable to determine ZooKeeper ensemble

    项目中用到hbase,有时候可能会报一些异常,比如java.io.IOException: Unable to determine ZooKeeper ensemble 等等,当出现这个问题时,根据个 ...

  9. hadoop异常: 到目前为止解决的最牛逼的一个异常(java.io.IOException: Incompatible clusterIDs)

    (注意: 本人用的版本为hadoop2.2.0, 旧的版本和此版本的解决方法不同) 异常为: 9 (storage id DS-2102177634-172.16.102.203-50010-1384 ...

随机推荐

  1. Linux经常使用的命令(十) - nl

    nl命令在linux系统中用来计算文件里行号. nl 能够将输出的文件内容自己主动的加上行号.其默认的结果与 cat -n 有点不太一样. nl 能够将行号做比較多的显示设计,包含位数与是否自己主动补 ...

  2. JAVA设计模式(08):结构化-飞锤(Flyweight)

    当前咱们国家正在大力倡导构建和谐社会,当中一个非常重要的组成部分就是建设资源节约型社会,"浪费可耻,节俭光荣". 在软件系统中,有时候也会存在资源浪费的情况,比如在计算机内存中存储 ...

  3. Redis源代码分析(二十八)--- object创建和释放redisObject物

    今天的学习更有效率.该Rio分析过,学习之间的另一种方式RedisObject文件,只想说RedisObject有些生成和转换.都是很类似的.列出里面长长的API列表: /* ------------ ...

  4. Windows Phone 启动器

    http://msdn.microsoft.com/zh-CN/library/gg278408(v=vs.92)#BKMK_Launchers using Microsoft.Phone.Contr ...

  5. Scan IP relocate/failover其它段后不能ping通过

    或手动集群重启单个节点srvctl relocate scan_listener后.群集网络段ping IP,VIP.SCAN IP正常.其他段ping SCAN IP 不通.其原因是,该路由ARP表 ...

  6. 一个简单的Java死锁示例(转)

    在实际编程中,要尽量避免出现死锁的情况,但是让你故意写一个死锁的程序时似乎也不太简单(有公司会出这样的面试题),以下是一个简单的死锁例子,程序说明都写着类的注释里了,有点罗嗦,但是应该也还是表述清楚了 ...

  7. 一个Bug的反思

    对输入数据判重,使用Map,将对象作为Key,使用map的containsKey方法来着重是否是重复记录.正常的处理流程:(1)将输入的数据封装成对象(2)判重,将没有重复的数据存储到map(3)对没 ...

  8. 蜗牛—苍茫IT文章大学的路(十)

    昨晚,有个叫***培训机构鼓吹我们学校.起初我还以为是介绍这个游戏吧.谁知道.它原来是一个培训结构.去年我买的表啊 我知道这会不会去,我也浪费了时间审查.因为今天下午和晚上来测试啊.我没有审查,. 当 ...

  9. jQuery性能优化篇

    jQuery高级技巧——性能优化篇 阅读目录 通过CDN(Content Delivery Network)引入jQuery库 减少DOM操作 适当使用原生JS 选择器优化 缓存jQuery对象 定义 ...

  10. SpringMVC现实

    夹 一个.前言 两.spring mvc 核心类和接口 三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说 ...