在 Linux 环境下,向 HBase 导入数据常见有几种方式,下面按使用频率和适用场景给你系统梳理一下。
put 命令hbase shell
create 'test', 'cf'
put 'test', 'row1', 'cf:name', 'zhangsan'
put 'test', 'row1', 'cf:age', '20'
✅ 适合:少量数据、调试
❌ 不适合:大批量数据
ImportTsv + BulkLoad(最常用)vi user.tsv
row1 zhangsan 20
row2 lisi 25
hbase shell
create 'user', 'cf'
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \
-Dimporttsv.columns=HBASE_ROW_KEY,cf:name,cf:age \
-Dimporttsv.bulk.output=/tmp/hbase_bulk \
user /user/data/user.tsv
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles \
/tmp/hbase_bulk user
✅ 适合:千万/亿级数据
✅ 不占用 RegionServer 内存,性能最好
completebulkload(生产推荐)和上面类似,但更标准:
hadoop jar $HBASE_HOME/lib/hbase-server-*.jar \
completebulkload /tmp/hbase_bulk user
Import 工具)hbase org.apache.hadoop.hbase.mapreduce.Import \
user /hbase/export/user
✅ 适合:HBase → HBase 迁移
rdd.saveAsNewAPIHadoopDataset(job.getConfiguration)
✅ 适合:ETL、实时/离线计算
✅ 企业最常用
hbase-client API(Java)Table table = conn.getTable(TableName.valueOf("user"));
Put put = new Put(Bytes.toBytes("row1"));
put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("name"), Bytes.toBytes("tom"));
table.put(put);
✅ 适合:程序化写入
| 问题 | 原因 |
|---|---|
| Region 过多 | 预分区不合理 |
| 导入慢 | 没用 BulkLoad |
| 权限错误 | HDFS / HBase 用户不一致 |
✅ 生产环境强烈建议:BulkLoad
| 场景 | 推荐方式 |
|---|---|
| 测试 | HBase Shell |
| 小批量 | put |
| 大批量 | ImportTsv + BulkLoad |
| 数据迁移 | Import |
| ETL | Spark / MR |
如果你愿意,可以告诉我:
我可以给你 针对性的导入方案 + 命令模板。