HBase put数据丢失的问题

wangzhen199009 2014-12-03 10:45:54
HBase下使用API数据写入,写完之后立刻scan,新写入的数据可用看到。但是当机器重启之后,再进行scan的化,就很不稳定,重启前写入到数据有的时候数据能看到,有的时候就看不到。autoflush和wal选项都设置了。代码如下:

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HBaseTestCase;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
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.util.Bytes;

import java.util.*;


public class HBaseTest {
//声明静态配置 HBaseConfiguration
static Configuration cfg=HBaseConfiguration.create();

//创建一张表,通过HBaseAdmin HTableDescriptor来创建
public static void creat(String tablename,String columnFamily) throws Exception {
HBaseAdmin admin = new HBaseAdmin(cfg);
if (admin.tableExists(tablename)) {
System.out.println("table Exists!");
//System.exit(0);
}
else{
HTableDescriptor tableDesc = new HTableDescriptor(tablename);
tableDesc.addFamily(new HColumnDescriptor(columnFamily));
admin.createTable(tableDesc);
System.out.println("create table success!");
}
}

//添加一条数据,通过HTable Put为已经存在的表来添加数据
@SuppressWarnings("deprecation")
public static void put(String tablename,String row, String columnFamily,String column,String data) throws Exception {
HTable table = new HTable(cfg, tablename);
table.setAutoFlush(true);


Put p1=new Put(Bytes.toBytes(row));

p1.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(data));
p1.setWriteToWAL(true);
table.put(p1);
System.out.println("put '"+row+"','"+columnFamily+":"+column+"','"+data+"'");
}

public static void get(String tablename,String row) throws IOException{
HTable table=new HTable(cfg,tablename);
Get g=new Get(Bytes.toBytes(row));
Result result=table.get(g);
System.out.println("Get: "+result);
}
//显示所有数据,通过HTable Scan来获取已有表的信息
public static void scan(String tablename) throws Exception{
HTable table = new HTable(cfg, tablename);
Scan s = new Scan();
ResultScanner rs = table.getScanner(s);
for(Result r:rs){
System.out.println("Scan: "+r);
}
}

public static boolean delete(String tablename) throws IOException{

HBaseAdmin admin=new HBaseAdmin(cfg);
if(admin.tableExists(tablename)){
try
{
admin.disableTable(tablename);
admin.deleteTable(tablename);
}catch(Exception ex){
ex.printStackTrace();
return false;
}

}
return true;
}

public static void main (String [] agrs) {
String tablename="table1";
String columnFamily="cf1";

try {
HBaseTest.creat(tablename, columnFamily);

for(int i=700;i<800;i++)
{
String rowID="row"+String.format("%03d", i);

Random r=new Random();

String columnName="";

//col1--name
columnName="Name";
byte[] bytes=new byte[100];
r.nextBytes(bytes);
String name=bytes.toString();
HBaseTest.put(tablename, rowID, columnFamily, columnName, name);

//col2--age
columnName="Age";
int age=r.nextInt(100);
HBaseTest.put(tablename, rowID, columnFamily, columnName, String.valueOf(age));

//col3--height
columnName="Height";
double height=r.nextDouble()*100;
HBaseTest.put(tablename, rowID, columnFamily, columnName, String.format("%.2f", height) );

}
//HBaseTest.put(tablename, "row1", columnFamily, "cl1", "data");


//HBaseTest.get(tablename, "row1");
//HBaseTest.scan(tablename);
/* if(true==HBaseTestCase.delete(tablename))
System.out.println("Delete table:"+tablename+"success!");
*/
}
catch (Exception e) {
e.printStackTrace();
}
}
}
...全文
1066 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
X345885864 2014-12-11
  • 打赏
  • 举报
回复
ls看错了,这种情况,应该是你的hdfs或者hbase不稳定吧
X345885864 2014-12-11
  • 打赏
  • 举报
回复
数据丢失在,rowkey相同,我看你的程序用的是random ,这种情况下很容易出现rowkey相同的。
wangzhen199009 2014-12-05
  • 打赏
  • 举报
回复
引用 4 楼 sky_walker85 的回复:
HBase是运行在本地文件系统上还是HDFS上的?如果是本地文件系统就会出现数据丢失的情况
肯定HDFS上呀,Linux下单机进行的实验
wangzhen199009 2014-12-05
  • 打赏
  • 举报
回复
引用 3 楼 wulinshishen 的回复:
引用 2 楼 wangzhen199009 的回复:
[quote=引用 1 楼 wulinshishen 的回复:] 试试 table.flushCommits()
用 你的方法我刚刚 添加了 100条 记录 进去了 ,然后重启后发现又没有了。但是 奇怪的是,昨天我添加到数据昨天没看到,但是今天看到了
HBase版本是?试试table.close()[/quote]hadoop2.2,HBASE0.96.2
skyWalker_ONLY 2014-12-05
  • 打赏
  • 举报
回复
保存数据的目录是哪个?楼主在scan前先看看数据还在不或者直接在hadoop上查看
skyWalker_ONLY 2014-12-05
  • 打赏
  • 举报
回复
保存数据的目录是哪个?楼主在scan前先看看数据还在不或者直接在hadoop上查看
skyWalker_ONLY 2014-12-05
  • 打赏
  • 举报
回复
保存数据的目录是哪个?楼主在scan前先看看数据还在不或者直接在hadoop上查看
skyWalker_ONLY 2014-12-04
  • 打赏
  • 举报
回复
引用 4 楼 sky_walker85 的回复:
HBase是运行在本地文件系统上还是HDFS上的?如果是本地文件系统就会出现数据丢失的情况
参考http://blog.csdn.net/skywalker_only/article/details/17506333
skyWalker_ONLY 2014-12-04
  • 打赏
  • 举报
回复
HBase是运行在本地文件系统上还是HDFS上的?如果是本地文件系统就会出现数据丢失的情况
  • 打赏
  • 举报
回复
引用 2 楼 wangzhen199009 的回复:
引用 1 楼 wulinshishen 的回复:
试试 table.flushCommits()
用 你的方法我刚刚 添加了 100条 记录 进去了 ,然后重启后发现又没有了。但是 奇怪的是,昨天我添加到数据昨天没看到,但是今天看到了
HBase版本是?试试table.close()
wangzhen199009 2014-12-04
  • 打赏
  • 举报
回复
引用 1 楼 wulinshishen 的回复:
试试 table.flushCommits()
用 你的方法我刚刚 添加了 100条 记录 进去了 ,然后重启后发现又没有了。但是 奇怪的是,昨天我添加到数据昨天没看到,但是今天看到了
  • 打赏
  • 举报
回复
试试 table.flushCommits()

20,808

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧