hbase 海量小文件是怎么解决小文件问题的

相关文章12345678910
相关问题发布时间:发布时间:发布时间:发布时间:发布时间:发布时间:发布时间:发布时间:发布时间:发布时间:发布时间:发布时间:
版权所有 (C) . All Right Reserved. 为中华文化之崛起而奋斗!基于HBase的海量小文件低延时存储方法
专利名称基于HBase的海量小文件低延时存储方法
技术领域本发明涉及一种,尤其是指一种基于HBase的海量小文件低延时存储方法。
背景技术Hadoop提供的分布式文件系统(HDFS-Hadoop Distributed File System)作为一种低成本的分布式存储解决方案,近年来得到广泛的应用。HDFS的设计目标主要是针对大文件,比如几百MB、上GB的大文件,不适合存储小文件,原因是作为Hadoop主数据服务的NameNode节点,需要在内存中保存所有文件的关键信息,据估算,一千万个文件需要占用2 3GB的内存,可想而知,更多的文件带来的内存问题将给目前主流的服务器硬件带来很大压力,甚至不能通过硬件增配解决问题。另外,HDFS偏向于高吞吐 量的读写做优化,带来的负面影响是有一定的延时性,比如文件写入后,不能马上反应到其他正在读取该文件的客户端上,要等HDFS同步之后才行。所以HDFS本身不适合用于存储有低延时要求的数据。目前已有一些方法用于解决HDFS不适合存储小文件的问题,其中Hadoop官方的解决办法包括HAR (Hadoop Archives),即把一批小文件归档到一个大文件中存储,但是存在很多问题,一是小文件的URI (统一资源标识符)变了,对构建于HDFS之上的应用系统不友好,应用系统需要重新修改以适应这个变化;二是这种归档不支持压缩;三是归档文件中的内容无法修改,比如往归档文件中新增或者删除一个小文件,需要重新进行归档。另外一些解决办法是通过Hadoop提供的SequenceFile、MapFile,把小文件先组合成一个大文件进行存储,但是也存在一些问题,比如无法简单快速的列出小文件目录,并且这个解决办法主要是面向Java语言的,对其他语言的支持不好。已有的专利中,《一种基于Hadoop的海量非独立小文件关联存储方法》(专利申请号:.8),《一种基于Hadoop的海量可归类小文件关联存储方法》(专利申请号=.9),也是采用先组合成大文件的方法,对上层应用系统的开发有要求,或者说无法对上层应用完全透明。另外也不具备低延时性的特性。
本发明的目的在于克服了上述缺陷,提供一种可实现海量小文件的合理存储和低延时性,并且对上层应用系统完全透明的基于HBase的海量小文件低延时存储方法。本发明的目的是这样实现的:一种基于HBase的海量小文件低延时存储方法,其特征在于:在Hadoop、HBase环境下建立小文件存储环境后提供包括小文件写入、小文件续写及小文件读取应用的步骤;其中,建立小文件存储环境,包括,建立HBase小文件表,在HBase数据库中创建一个小文件表的步骤;所述小文件表
1.一种基于HBase的海量小文件低延时存储方法,其特征在于:在Had00p、HBaSe环境下建立小文件存储环境后供包括小文件写入、小文件续写及小文件读取应用的步骤;其中,建立小文件存储环境,包括,
建立HBase小文件表,在HBase数据库中创建一个小文件表的步骤;所述小文件表如下,
2.如权利要求1所述的基于HBase的海量小文件低延时存储方法,其特征在于:所述行主键的值通过取UUID值,对此值做MD5摘要计算,再取摘要值的十六进制表示形成的字符串;所述列族i的键名由切片序列号和当前切片长度组成,键值内存储有当前切片序列号对应的切片内容的字节数组。
3.如权利要求1所述的基于HBase的海量小文件低延时存储方法,其特征在于:所述小文件写入应用包括步骤,
Al)、初始化小文件输出流,获得目标小文件的引用后在小文件输出流内部开辟内存缓冲区,向输出流传递目标小文件的URI ;所述URI中包含了写入小文件表的目标行主键;所述缓冲区空间不小于定义的小文件切片大小;
A2)、检查小文件表中列族m的键名锁的键值,若为否,则行可操作,新增锁;
A3)、从源文件中读取字节流,输入到缓冲区中,当一个缓冲区被写满后,将此时缓冲区中的内容形成新的切片,并获得切片序列号,并获取该切片的真实字节长度,与切片序列号共同预组装为HBase小文件表i列族下的键名,而切片的内容存储到对应的键值中;
A4)、连接HBase,将新的完整切片输出到小文件表中,小文件表中列族i动态扩展出新的一个列用于存储新切片;
A5)、重置缓冲区,回到步骤A2 ;
A6)、源文件所有内容读取完毕后,在小文件输出流被关闭前,将缓冲区中剩余的未达到切片定义大小阈值的内容组装为此次写入的最后一个切片,输出到HBase小文件表相同的行中;
A7)、释放锁。
4.如权利要求3所述的基于HBase的海量小文件低延时存储方法,其特征在于:所述步骤A7后还可包括步骤,
A8)、通过小文件存储的行主键,配合HBase的KeyOnlyFilter抓取对应行i列族下的所有列名,进而从列名中解析出目前状态下已有的所有切片序列号;
A9)、判定小文件行主键对应的m列族下锁的键值为是/否,若否则继续步骤;
A10)、排序得到当前最大的切片序列号;
AU)、递增最大序列号并开始切片写入,后续与完整小文件写入流程相同。
5.如权利要求1所述的基于HBase的海量小文件低延时存储方法,其特征在于:所述小文件读取应用包括步骤,
BI)、初始化小文件输入流,小文件输入流内部开辟缓冲区,获得HBase小文件表的读写权限;所述缓冲区空间不小于定义的小文件最大切片大小;
B2)、根据欲读取的小文件在小文件表中的行主键,查询对应行的列族i下的所有列信息;利用HBase的KeyOnlyFilter,仅从小文件表读取列族i的键名;
B3)、当应用层对小文件输入流中读取数据时,小文件输入流检查其缓冲区内是否有可用的数据,如果没有可用数据,诱发小文件输入流流向HBase请求新的切片数据;
B4)、应用层消 费完当前缓冲区的数据,返回步骤B2 ;
B5)、当小文件输入流定位并处理完小文件对应的最后一个切片后,返回结束信号完成整个小文件的读取。
6.如权利要求1所述的基于HBase的海量小文件低延时存储方法,其特征在于:所述小文件删除操作,依赖HBase对需删除小文件的行主键进行快速定位,然后直接使用HBase的API删除对应行。
7.如权利要求1-6任意一项所述的基于HBase的海量小文件低延时存储方法,其特征在于:建立一个文件存储抽象层,用于接收来自应用层的文件大小报告,并根据预定义的大小文件区分阈值构件对应的URI后返回给应用层,而后接收应用层送来的欲进行读/写的文件输入流及URI传递来时解析URI,并自动将文件的读/写操作对应指向HDFS文件系统或者HBase的小文件表中。
8.如权利要求7所述的基于HBase的海量小文件低延时存储方法,其特征在于:所述阈值大小为10兆字节。
本发明提供了一种基于HBase的海量小文件低延时存储方法,其通过在Hadoop、HBase环境下建立一种包括一个行主键及两个列族的小文件表,从而建立适合小文件存储环境,并配套包括小文件写入、小文件续写及小文件读取应用流程,进而实现海量小文件的合理存储和低延时性读写,满足实际需求。
文档编号G06F17/30GKSQ
公开日日 申请日期日 优先权日日
发明者魏超, 鄢小征, 栾江霞 申请人:厦门市美亚柏科信息股份有限公司在这先谢谢,通过他的指点集群改成了奇数个,版本也做了如下对应的更新,但是问题还是那样,实在不知道到底在哪里出问题了,希望知道的大家能帮帮忙
实验环境:
节点数:3个 1主2从
hadoop:hadoop-2.2.0& &zookeeper:zookeeper-3.4.5& &Hbase: hbase-0.96.2-hadoop2jdk :jkd-1.7.0
对应参数:
hbase-env.sh:
export HBASE_OPTS=&-XX:+UseConcMarkSweepGC&
export JAVA_HOME=/usr/java/jdk1.7.0
export HBASE_HOME=/home/hbase-0.98.5-hadoop2
export HADOOP_HOME=/home/hadoop-2.2.0
export HBASE_CLASSPATH=/home/hadoop-2.2.0/etc/hadoop
export PATH=$PATH:$HBASE_HOME/bin
export HBASE_MANAGES_ZK=false
hbase-site:
&property&
&name&hbase.rootdir&/name&
&value&hdfs://172.18.11.1:9000/hbase&/value&
&/property&
&property&
&name&hbase.cluster.distributed&/name&
&value&true&/value&
&/property&
&property&
&name&hbase.tmp.dir&/name&
&value&file:/usr/hbase/tmp&/value&
&/property&
&property&
&name&hbase.zookeeper.property.dataDir&/name&
&value&file:/usr/hbase/zookeeper&/value&
&/property&
&property&
&name&hbase.zookeeper.clientPort&/name&
&value&2181&/value&
&/property&
&property&
&name&hbase.master&/name&
&value&hdfs://172.18.11.1:60000&/value&
&/property&
&property&
&name&hbase.zookeeper.quorum&/name&
&value&172.18.11.1,172.18.11.5,172.18.11.73&/value&
&/property&
在本地对应的/usr 路径下 已经建立了hbase目录,并在其中建立了zookeeper和tmp目录
启动情况:
hadoop可以正常启动
zookeeper可以正常启动 通过./zkServer.sh status 各个节点分别显示了leader和foller
Hbases 启动后主节点HMaster自动消失,并且./stop-hbase.sh时发现 从节点的HRegionServer并不能关闭,并且Hbases的HMaster会突然启动一会上面问题非常奇怪,希望知道的大神给小白科普下
主节点报错信息如下:
09:16:59,827 FATAL [master:master:60000] master.HMaster: Unhandled exception. Starting shutdown.
java.lang.IllegalArgumentException: .META. no longer exists. The table has been renamed to hbase:meta
& && &&&at org.apache.hadoop.hbase.TableName.valueOf(TableName.java:292)
& && &&&at org.apache.hadoop.hbase.zookeeper.ZKTable.populateTableStates(ZKTable.java:82)
& && &&&at org.apache.hadoop.hbase.zookeeper.ZKTable.&init&(ZKTable.java:69)
& && &&&at org.apache.hadoop.hbase.master.AssignmentManager.&init&(AssignmentManager.java:281)
& && &&&at org.apache.hadoop.hbase.master.HMaster.initializeZKBasedSystemTrackers(HMaster.java:677)
& && &&&at org.apache.hadoop.hbase.master.HMaster.finishInitialization(HMaster.java:809)
& && &&&at org.apache.hadoop.hbase.master.HMaster.run(HMaster.java:603)
& && &&&at java.lang.Thread.run(Thread.java:662)
INFO&&[master:master:60000] master.HMaster: HMaster main thread exiting
09:16:59,878 ERROR [main] master.HMasterCommandLine: Master exiting
java.lang.RuntimeException: HMaster Aborted
& && &&&at org.apache.hadoop.hbase.master.HMasterCommandLine.startMaster(HMasterCommandLine.java:192)
& && &&&at org.apache.hadoop.hbase.master.HMasterCommandLine.run(HMasterCommandLine.java:134)
& && &&&at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
& && &&&at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:126)
& && &&&at org.apache.hadoop.hbase.master.HMaster.main(HMaster.java:2787)
从节点:Hbases日志,从节点状态时一直有HRegionServer但是关闭Hbases脚本时候从节点的HRegionServer要手动kill才行
15:47:00,717 INFO&&[regionserver60020] zookeeper.ZooKeeper: Client environment:java.library.path=/home/hadoop-2.2.0/lib/native
15:47:00,717 INFO&&[regionserver60020] zookeeper.ZooKeeper: Client environment:java.io.tmpdir=/tmp
15:47:00,717 INFO&&[regionserver60020] zookeeper.ZooKeeper: Client piler=&NA&
15:47:00,717 INFO&&[regionserver60020] zookeeper.ZooKeeper: Client environment:os.name=Linux
15:47:00,717 INFO&&[regionserver60020] zookeeper.ZooKeeper: Client environment:os.arch=amd64
15:47:00,717 INFO&&[regionserver60020] zookeeper.ZooKeeper: Client environment:os.version=3.11.10
15:47:00,717 INFO&&[regionserver60020] zookeeper.ZooKeeper: Client environment:user.name=root
15:47:00,717 INFO&&[regionserver60020] zookeeper.ZooKeeper: Client environment:user.home=/root
15:47:00,717 INFO&&[regionserver60020] zookeeper.ZooKeeper: Client environment:user.dir=/home/hbase-0.96.2-hadoop2
15:47:00,718 INFO&&[regionserver60020] zookeeper.ZooKeeper: Initiating client connection, connectString=wc073:2181,wc005:2181 sessionTimeout=90000 watcher=regionserver:60020, quorum=wc073:2181,wc005:2181, baseZNode=/hbase
15:47:00,733 INFO&&[regionserver60020] zookeeper.RecoverableZooKeeper: Process identifier=regionserver:60020 connecting to ZooKeeper ensemble=wc073:2181,wc005:2181
15:47:00,735 INFO&&[regionserver60020-SendThread(wc005:2181)] zookeeper.ClientCnxn: Opening socket connection to server wc005/172.18.11.5:2181. Will not attempt to authenticate using SASL (unknown error)
15:47:00,736 INFO&&[regionserver60020-SendThread(wc005:2181)] zookeeper.ClientCnxn: Socket connection established to wc005/172.18.11.5:2181, initiating session
15:47:00,746 INFO&&[regionserver60020-SendThread(wc005:2181)] zookeeper.ClientCnxn: Session establishment complete on server wc005/172.18.11.5:2181, sessionid = 0x24d41f, negotiated timeout = 40000
15:47:00,798 INFO&&[main] regionserver.ShutdownHook: Installed shutdown hook thread: Shutdownhook:regionserver60020
这个错误信息在贴吧已经看到了解决方法:
1.清除tmp目录,不知道什么原因我的/usr/hbase/ 下面的zookeeper和tmp中在启动后并没有内容存储进去,同时也做不了清楚zookeeper的data这一步
2.确定版本,我的这些版本应该是正确的,并且对应的Hbases的lib目录下的.jar文件也对应了hadoop-2.2.0的lib
3.执行权限 权限是root的高级用户应该没问题
4.时间,各个节点的时间已经同步5.hadoop 安全模式已经关闭
主题帖子积分
高级会员, 积分 2029, 距离下一级还需 2971 积分
高级会员, 积分 2029, 距离下一级还需 2971 积分
看来是配置问题了
楼主对比这个文档,看看那里有问题
主题帖子积分
中级会员, 积分 639, 距离下一级还需 361 积分
中级会员, 积分 639, 距离下一级还需 361 积分
本帖最后由 夏洛特猫 于
16:17 编辑
看来是配置问题了
楼主对比这个文档,看看那里有问题
hbase 0.96整合到hadoop2.2三个节点全分布式安 ...
谢谢您的回复,那个帖子我已经看过了,照着改也不行。hadoop-2.2.0的配置绝对没问题,因为在上面跑了很多负载
zookeeper的配置也只是修改zoo.cfg中的文件
具体记录如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/zookeeper-3.4.5/zookeeper-data
dataLogDir=/home/zookeeper-3.4.5/logs
clientPort=2181
server.1=172.18.11.1:
server.2=172.18.11.5:
server.3=172.18.11.73:
hbase中的hbase-env.sh和hbase-site.xml则是照着你建议的那篇修改的,但是报错一样,都崩溃了,完全不知道哪里的问题。。。
主题帖子积分
高级会员, 积分 1323, 距离下一级还需 3677 积分
高级会员, 积分 1323, 距离下一级还需 3677 积分
谢谢您的回复,那个帖子我已经看过了,照着改也不行。hadoop-2.2.0的配置绝对没问题,因为在上面跑了很多 ...
配置的过程中,尽量不要选择home,很容易发生权限问题
dataDir=/home/ljw/zookeeper-3.4.5/zookeeper-data
dataLogDir=/home/ljw/zookeeper-3.4.5/logs
主题帖子积分
高级会员, 积分 1323, 距离下一级还需 3677 积分
高级会员, 积分 1323, 距离下一级还需 3677 积分
谢谢您的回复,那个帖子我已经看过了,照着改也不行。hadoop-2.2.0的配置绝对没问题,因为在上面跑了很多 ...
这里改一下
[Bash shell] 纯文本查看 复制代码export HBASE_MANAGES_ZK=true
主题帖子积分
高级会员, 积分 1323, 距离下一级还需 3677 积分
高级会员, 积分 1323, 距离下一级还需 3677 积分
zookeeper是使用自带的,还是外部的
主题帖子积分
中级会员, 积分 639, 距离下一级还需 361 积分
中级会员, 积分 639, 距离下一级还需 361 积分
zookeeper是使用自带的,还是外部的
谢谢您的回答,zookeeper使用的自己下载的版本也对应,没使用hbases 自带的,在hbases的变量中hbase-env.sh 中已经关闭了主动启动“export HBASE_MANAGES_ZK=false”
主题帖子积分
高级会员, 积分 1323, 距离下一级还需 3677 积分
高级会员, 积分 1323, 距离下一级还需 3677 积分
&property&
&name&hbase.zookeeper.clientPort&/name&
&value&2181&/value&
&/property&
这个端口hbase.zookeeper.clientPort,是根据那个文档配置的,没有见过啊。
hbase.zookeeper.property.clientPort:ZooKeeper的zoo.conf中的配置。 客户端连接的端口。
主题帖子积分
高级会员, 积分 1323, 距离下一级还需 3677 积分
高级会员, 积分 1323, 距离下一级还需 3677 积分
&property&
&name&hbase.zookeeper.quorum&/name&
&value&172.18.11.1,172.18.11.5,172.18.11.73&/value&
&/property&
这里面含有一个中文字符,楼主忽略了,这个是很小的细节。
主题帖子积分
中级会员, 积分 639, 距离下一级还需 361 积分
中级会员, 积分 639, 距离下一级还需 361 积分
hbase.zookeeper.quorum
172.18.11.1,172.18.11.5,172.18.11.73
那个中文字符的“逗号”是我后加的,就是在网页上加的,配置里面没有错,但是我更换了路径 换成不在/home下就可以了 谢谢您的热心帮助
积极上进,爱好学习
站长推荐 /4
云计算hadoop视频大全(新增 yarn、flume|storm、hadoop一套视频
等待验证会员请验证邮箱
新手获取积分方法
技术类问答,解决学习openstack,hadoop生态系统中遇到的问题
Powered by}

我要回帖

更多关于 hbase配置文件详解 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信