BulkLoad将大规模数据导入HBase
有个1个T的文件,我要导入Hbase有什么方法?
Java API 用I/O读数据,用Put方式把数据导进去。
还有什么好的方法?我的表已经设计好了?
我????
一、数据准备
rowkey_1,a,12
rowkey_2,b,32
rowkey_3,c,43
rowkey_4,d,42
创建一个表空间和表
创建一个表空间
create_namespace 'mdemo'
创建表,列簇cf
create 'mdemo:bload','cf'
二、上传到HDFS上
[root@yang ~]# hdfs dfs -mkdir /bload
[root@yang ~]# hdfs dfs -put /opt/data/tests.csv /bload
三、通过MR生成Hfile文件
命令格式:
HADOOP_CLASSPATH=[HBase的bin路径]/hbase classpath hadoop jar [HBase的lib路径]/hbase-server-version.jar importtsv -Dimporttsv.bulk.output=<输出文件夹路径> -Dimporttsv.separator=<分割符> -Dimporttsv.columns=<row_key和修饰符映射> <目标表> <数据源路径>
PS:
hbase-server
的jar包版本可以去hbase下的lib目录查看,我的是1.2.0CDH版
Dimporttsv.bulk.output
中的bulkload_result_1
目录在hdfs上不能存在,
Dimporttsv.separator
是数据的分隔符,
Dimporttsv.columns=HBASE_ROW_KEY
表示以数据的第一列作为行键(这里行键是rowkey_1、rowkey_2、rowkey_3、rowkey_4),cf:name 表示 列簇:修饰符,hdfs://192.168.56.171:8020/bload/tests.csv
表示hdfs://主机名:hadoop端口号/文件在hdfs上的路径
可以使用
hdfs getconf -confKey fs.default.name
命令查看你的hdfs地址和端口号
Linux终端命令:
HADOOP_CLASSPATH=`/opt/soft/hbase120/bin/hbase classpath`
hadoop jar /opt/soft/hbase120/lib/hbase-server-1.2.0-cdh5.14.2.jar
importtsv -Dimporttsv.bulk.output=hdfs://192.168.56.171:9000/bload/output/bload_1_result
-Dimporttsv.separator=','
-Dimporttsv.columns=HBASE_ROW_KEY,cf:name,cf:number "mdemo:bload" hdfs://192.168.56.171:9000/bload/tests.csv
生成HFile文件
四、加载到HBase中
HADOOP_CLASSPATH=`/opt/soft/hbase120/bin/hbase classpath`
hadoop jar /opt/soft/hbase120/lib/hbase-server-1.2.0-cdh5.14.2.jar
completebulkload hdfs://yang:9000/bload/output/bload_1_result "mdemo:bload"
五、查看数据HBase中数据
参考博客:https://blog.csdn.net/wjt199866/article/details/103158326?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1
报错:Failed on local exception: com.google.protobuf.InvalidProtocolBufferException: Protocol message
解决:https://blog.csdn.net/a_hui_tai_lang/article/details/81676429