MapReduce之----往hbase資料庫寫入資料時, 出現資料異常
問題 :
寫入HBase的資料不對
如
讀入的資料是
hello nihao hadoop hehe byebye
hello nihao hadoop
spark scale
存入資料庫就成了
hbase(main):038:0> scan 't_user2'
ROW COLUMN+CELL
byebye column=MR_column:wordcount, timestamp=1529670719617, value=1
hadoop column=MR_column:wordcount, timestamp=1529670719617, value=2
heheop column=MR_column:wordcount, timestamp=1529670719617, value=1
hellop column=MR_column:wordcount, timestamp=1529670719617, value=2
nihaop column=MR_column:wordcount, timestamp=1529670719617, value=2
scalep column=MR_column:wordcount, timestamp=1529670719617, value=1
sparkp column=MR_column:wordcount, timestamp=1529670719617, value=1
資料出現了異常, 有沒有看到前面的rowkey長度都是一致的 ... 且與hadoop長度不一致的全在最後面補全hadoop後面的字母 ?
原因如下:
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
public class MRWriterToHbaseTableDriver {
static class MRWriterToHbaseTableMapper extends
Mapper<LongWritable, Text, Text, IntWritable> {
@Overrideprotected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
String[] arr = line.split("\t");
for (String name : arr) {
context.write(new Text(name), new IntWritable(1));
}
}
}
static class MRWriterToHbaseTableReducer extends
TableReducer<Text, IntWritable, ImmutableBytesWritable> {
@Overrideprotected void reduce(Text key, Iterable<IntWritable> value,
Context context) throws IOException, InterruptedException {
int count = 0;
for (IntWritable iw : value) {
count += iw.get();
}
// Put put = new Put(key.getBytes());
// 這裡就是異常所在,換成下面語句即可解決
Put put = new Put(key.toString().getBytes()); //新增rowkeyput.addColumn("MR_column".getBytes(), "wordcount".getBytes(),
(count + "").getBytes()); //新增列族,列限定符和值
// context.write(new ImmutableBytesWritable(key.getBytes()), put);
// 括號裡面的ImmutableBytesWritable可以換成其他型別,例如null, Text型別都可以
// 只要和上面的keyout泛型一致即可
context.write(new ImmutableBytesWritable(key.toString().getBytes()), put);}
}
public static void main(String[] args) throws IOException,
ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum", "min1");
Job job = Job.getInstance(conf, "myjob");
job.setJarByClass(MRWriterToHbaseTableDriver.class);
job.setMapperClass(MRWriterToHbaseTableMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
FileInputFormat.setInputPaths(job, "/aa");
TableMapReduceUtil.initTableReducerJob("t_user2",
MRWriterToHbaseTableReducer.class, job);
boolean waitForCompletion = job.waitForCompletion(true);
System.exit(waitForCompletion ? 0 : 1);
}
}
分析 :
Put型別裡String.getBytes() 和 Text.getBytes()兩個方法得到的位元組陣列的長度不同, String.getBytes()會動態獲得當前位元組陣列的長度,該是多長就是多長; Text.getBytes()獲得的是當前位元組陣列, 但是會與上一個獲得的位元組陣列長度進行比較, 當長度比上一個短時會自動補全上一個位元組後面的內容至當前位元組, 若長度比上一個長時會獲得當前位元組陣列內容 . 再看下面的表進行驗證:
String.getBytes()寫入到hbase後內容:
byebye column=MR_column:wordcount, timestamp=1529674870277, value=1
hadoop column=MR_column:wordcount, timestamp=1529674870277, value=2
hehe column=MR_column:wordcount, timestamp=1529674870277, value=1
hello column=MR_column:wordcount, timestamp=1529674870277, value=2
looperqu column=MR_column:wordcount, timestamp=1529674870277, value=1
nihao column=MR_column:wordcount, timestamp=1529674870277, value=2
scale column=MR_column:wordcount, timestamp=1529674870277, value=1
spark column=MR_column:wordcount, timestamp=1529674870277, value=1
zookeeper column=MR_column:wordcount, timestamp=1529674870277, value=1
Text.getBytes()寫入到hbase後內容 : byebye column=MR_column:wordcount, timestamp=1529675062950, value=1
hadoop column=MR_column:wordcount, timestamp=1529675062950, value=2
heheop column=MR_column:wordcount, timestamp=1529675062950, value=1
hellop column=MR_column:wordcount, timestamp=1529675062950, value=2
looperqu column=MR_column:wordcount, timestamp=1529675062950, value=1
nihaorqu column=MR_column:wordcount, timestamp=1529675062950, value=2
scalerqu column=MR_column:wordcount, timestamp=1529675062950, value=1
sparkrqu column=MR_column:wordcount, timestamp=1529675062950, value=1
zookeeper column=MR_column:wordcount, timestamp=1529675062950, value=1
相關文章
- 如何將 EXCEL 資料寫入資料庫Excel資料庫
- HBase BulkLoad批量寫入資料實戰
- MySQLNonTransientConnectionException資料庫連線異常MySqlException資料庫
- 資料庫 MySQL 資料匯入匯出資料庫MySql
- MYSQL資料庫匯入資料時出現亂碼的解決辦法MySql資料庫
- Spring系列之不同資料庫異常如何抽象的?Spring資料庫抽象
- HBase資料的讀寫流程
- Oracle資料庫——資料匯出時出現匯出成功終止, 但出現警告。Oracle資料庫
- Apache HBase 1.7.1 釋出,分散式資料庫Apache分散式資料庫
- Sqoop匯入資料異常處理OOP
- 做資料庫分離讀寫時,sqlServer資料庫資料同步的問題:資料庫SQLServer
- DataIntegrityViolationException異常:java利用mymatis連線資料庫異常AIExceptionJava資料庫
- Hbase資料庫安裝部署資料庫
- 使用scrapy框架把資料非同步寫入資料庫框架非同步資料庫
- 實時資料庫與時序資料庫資料庫
- [python] 基於PyOD庫實現資料異常檢測Python
- 資料庫連線異常處理思路資料庫
- 資料庫異常智慧分析與診斷資料庫
- 資料庫連線異常故障報告資料庫
- 資料匯入終章:如何將HBase的資料匯入HDFS?
- 往hdfs寫資料無許可權
- 【YashanDB知識庫】資料庫審計shutdown immediate操作導致資料庫異常退出資料庫
- 【資料庫資料恢復】MS SQL資料庫附加資料庫出錯怎麼恢復資料?資料庫資料恢復SQL
- 10.註冊和登入功能實現(3)—— 註冊資料寫入資料庫資料庫
- Spring系列之JDBC對不同資料庫異常如何抽象的?SpringJDBC資料庫抽象
- 常見資料庫資料庫
- 《分散式資料庫HBase案例教程》分散式資料庫
- HBase資料庫效能調優OW資料庫
- 每一個異常資料
- 【資料庫資料恢復】Oracle資料庫檔案出現壞塊報錯的資料恢復案例資料庫資料恢復Oracle
- PostgreSQL資料庫匯入大量資料時如何最佳化SQL資料庫
- oracle 備份資料庫,匯出資料庫Oracle資料庫
- 資料庫升級之-資料泵資料庫
- 前腳剛往資料庫插入資料,後腳就查不出來?資料庫
- 關於PHP往mysql資料庫中批次插入資料例項教程PHPMySql資料庫
- YII2 一次性往資料庫插入多行資料資料庫
- 淺談時序資料庫核心:如何用單機扛住億級資料寫入資料庫
- 【北亞資料恢復】異常斷電導致Oracle資料庫報錯的oracle資料恢復資料恢復Oracle資料庫