本文为您介绍如何使用JindoFS作为HBase的底层存储。
背景信息
HBase是Hadoop生态中的实时数据库,有很高的写入性能,E-MapReduce HBase支持使用JindoFS或OSS作为底层存储,相对于HDFS存储,使用更加灵活。
说明 建议您使用EMR-3.36.0及后续版本的集群。
JindoFS配置
以EMR-3.36.0版本为例,创建名为emr-jfs的命名空间,Bucket名称为oss-bucket,相关配置参数示例如下:
- jfs.namespaces=emr-jfs
- jfs.namespaces.emr-jfs.oss.uri=oss://<oss-bucket>/oss-dir
- jfs.namespaces.emr-jfs.mode=block
指定HBase的存储路径
指定HBase的存储路径,是需要修改hbase-site配置文件中的参数hbase.rootdir的值为JindoFS或OSS地址,修改参数hbase.wal.dir的值为本地的HDFS地址,通过本地HDFS集群存储WAL文件。如果要释放集群,需要先Disable table,确保WAL文件已经完全更新到HFile。
参数 | 描述 |
---|---|
hbase.rootdir | 指定HBase的ROOT存储目录到JindoFS或OSS。
参数值为jfs://emr-jfs/hbase-root-dir。
说明 参数值中的emr-jfs为您配置的命名空间。
|
hbase.wal.dir | 指定HBase的WAL存储目录到本地HDFS集群。
参数值为:
|
创建集群
在创建集群时,添加软件自定义配置,创建集群详情请参见创建集群。
以JindoFS作为HBase后端为例,需要替换
oss_bucket
及对应路径,自定义配置如下。[
{
"ServiceName":"SMARTDATA",
"FileName":"namespace",
"ConfigKey":"jfs.namespaces",
"ConfigValue":"emr-jfs"
},
{
"ServiceName":"SMARTDATA",
"FileName":"namespace",
"ConfigKey":"jfs.namespaces.emr-jfs.oss.uri",
"ConfigValue":"oss://oss-bucket/jindoFS"
},
{
"ServiceName":"SMARTDATA",
"FileName":"namespace",
"ConfigKey":"jfs.namespaces.emr-jfs.mode",
"ConfigValue":"block"
},
{
"ServiceName":"HBASE",
"FileName":"hbase-site",
"ConfigKey":"hbase.rootdir",
"ConfigValue":"jfs://emr-jfs/hbase-root-dir"
},
{
"ServiceName":"HBASE",
"FileName":"hbase-site",
"ConfigKey":"hbase.wal.dir",
"ConfigValue":"hdfs://emr-cluster/hbase"
}
]
常见问题
- 问题现象:MapReduce程序使用TableSnapshotInputFormat读取Hbase数据时,报错信息如下。
java.lang.IllegalArgumentException: Wrong FS: jfs://emr-jfs/tmp/..., expected: hdfs://emr-header-1.cluster-*:9000 at org.apache.hadoop.fs.FileSYstem.checkPath(FileSystem.java:666) at org.apache.hadoop.hbase.regionServer.HRegionFileSystem.createRegionOnFileSystem(HRegionFileSYstem.java:875)
- 问题分析:因为HBase提供的开源MapReduce程序存在缺陷,所以会校验HBase的数据路径跟HDFS中fs.defaultFS路径是否一致。
- 解决方法:
- 使用ExportSnapshot可以正常读取并导出Hbase数据。
- 使用TableSnapshotInputFormat读取Hbase数据时,需要您在阿里云E-MapReduce控制台,HDFS服务的配置页面,在core-site页签,修改fs.defaultFS的参数值为jfs前缀的根目录。例如,修改fs.defaultFS的参数值为上述步骤中配置的jfs://emr-jfs/。