Hadoop與HBase中遇到的問題(續)java.io.IOException: Non-increasing Bloom keys異常
在使用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檢視任務執行狀態.
相關文章
- 【Spark實戰】Spark操作HBase問題:java.io.IOException: Non-increasing Bloom keysSparkJavaExceptionOOM
- Hadoop與HBase中遇到的問題Hadoop
- hadoop遇到的問題(彙總)Hadoop
- SpringBoot專案中遇到的異常Spring Boot
- hadoop啟動遇到的各種問題Hadoop
- Hadoop 面試中 6 個常見的問題及答案Hadoop面試
- 前端開發中遇到的一些問題----持續更新前端
- 面試中遇到的問題面試
- 異常問題排查之旅
- 微服務異常問題微服務
- 總結Java開發面試常問的問題,持續更新中~Java面試
- workerman開發過程中遇到的一些常見的問題與解決方法
- javaweb中自己遇到的問題JavaWeb
- laravel使用中遇到的問題Laravel
- Hodoop配置中遇到的問題OdooOOP
- 工作中遇到的問題
- Hadoop異常總結Hadoop
- FLEX4與JAVA通訊中遇到的問題FlexJava
- Swift 中的錯誤與異常Swift
- 異常解決java.io.IOException: invalid constant type: 15JavaException
- 10.Java異常問題Java
- Hbase面試題(持續更新)面試題
- .net異常處理的效能問題
- JVM 異常退出的問題解決JVM
- JavaCV與OpenCV的區別和使用中遇到的問題JavaOpenCV
- Kaldi執行過程中遇到的一些問題(持續更新...)
- 【轉】程式設計師求職面試中經常遇到的面試問題程式設計師求職面試
- SpringBoot中SpringSecurity 中不能丟擲異常UserNameNotFoundException 問題解析與處理Spring BootGseException
- hadoop 日常問題彙總(持續更新)Hadoop
- 關於Apache Hadoop的常見問題解答ApacheHadoop
- kafka 運維中遇到的問題Kafka運維
- weex學習中遇到的問題
- hive學習中遇到的問題Hive
- rdpclip 遠端桌面協議常遇到的問題協議
- linux新手最經常遇到的問題(轉)Linux
- Docker實踐過程中遇到的一些問題總結(持續更新中)Docker
- Redis 中 Keys 與 Scan 的使用Redis
- 異常處理遇到過的那些坑