hbase存储小文件
① hadoop有哪些优缺点
一、HDFS缺点:
1、不能做到低延迟:由于hadoop针对高数据吞吐量做了优化,牺牲了获取数据的延迟,所以对于低延迟数据访问,不适合hadoop,对于低延迟的访问需求,HBase是更好的选择,
2、不适合大量的小文件存储:由于namenode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件总数受限于namenode的内存容量,根据经验,每个文件、目录和数据块的存储信息大约占150字节。
3、不适合多用户写入文件,修改文件:Hadoop2.0虽然支持文件的追加功能,但是还是不建议对HDFS上的 文件进行修改,因为效率低。
4、对于上传到HDFS上的文件,不支持修改文件,HDFS适合一次写入,多次读取的场景。
5、HDFS不支持多用户同时执行写操作,即同一时间,只能有一个用户执行写操作。
二、HDFS优点:
1、高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖。
2、高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。
3、高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
4、高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。
5、低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低。
6、Hadoop带有用java语言编写的框架,因此运行在 Linux 生产平台上是非常理想的。Hadoop 上的应用程序也可以使用其他语言编写,比如 C++。
② 关于hbase的问题,开启hbase后一会hmaster和hregionserver就没了
一、通常向HBase批量导入数据有三种常用方式
1、使用HBase提供的TableOutputFormat,原理是通过一个Maprece作业将数据导入HBase
2、还有一种方式就是使用HBase原生Client API(put)
3、前两种方式因为须要频繁的与数据所存储的RegionServer通信。一次性入库大量数据时,特别占用资源,所以都不是很有效。因为HBase在HDFS中是以HFile文件结构存储的,所以高效便捷的方法就是直接生成HFile文件然后使用Bulk Load方法,即HBase提供的HFileOutputFormat类。
二、Bulk Load基本原理
Bulk Load处理由两个主要步骤组成:
1、生成HFile文件
Bulk Load的第一步会执行一个Maprece作业,其中使用到了HFileOutputFormat输出HBase数据文件:StoreFile。
HFileOutputFormat的作用在于使得输出的HFile文件能够适应单个region。使用TotalOrderPartitioner类将map输出结果分区到各个不同的key区间中,每一个key区间都相应着HBase表的region。
2、导入HBase表
第二步使用completebulkload工具将第一步的结果文件依次交给负责文件相应region的RegionServer,并将文件move到region在HDFS上的存储文件夹中。一旦完毕。将数据开放给clients。
假设在bulk load准备导入或在准备导入与完毕导入的临界点上发现region的边界已经改变,completebulkload工具会自己主动split数据文件到新的边界上。可是这个过程并非最佳实践,所以用户在使用时须要最小化准备导入与导入集群间的延时,特别是当其它client在同一时候使用其它工具向同一张表导入数据。
Bulk Load常遇到的一个ERROR:”java.io.IOException: Retry attempted 10 times without completing, ling out”
错误解析:
我们使用的Hbase1.0.2版本下,如果Hfile文件 跨越多个region,bulkload会自动地将Hfile文件split,但是对于每次retry只会将指定的Hfile文件split一次。但是在hbase-site.xml配置文件里有个参数hbase.bulkload.retries.number控制了hbase对一个hfile最多plit多少次。这个参数默认是10,如果某个hfile跨越的region数超过10个就会报上述Exception。
解决方案:
将hbase.bulkload.retries.number这个参数设置为更大的值,比如目标表的region数量或者将这个参数设置成0,0表示不断重试直到成功。设置之后问题解决。
③ HBase什么时候作minor major compact
HBaseAdmin提供compact方法来手动合并小文件 public void compact(final byte [] tableNameOrRegionName) public void majorCompact(final byte [] tableNameOrRegionName) majorCompact会对所有的文件进行Compact,而compact会选取合适的进行co。
④ HBase支持的数据格式有哪些
HBase 通过 Put 操作和 Result 操作支持 “byte-in / bytes-out” 接口,所以任何可以转换为字节数组的内容都可以作为一个值存储。输入可以是字符串、数字、复杂对象、甚至可以是图像,只要它们可以呈现为字节。
值的大小有实际的限制(例如,在 HBase 中存储 10-50MB 的对象可能太多了)。在邮件列表中搜索关于此主题的对话。HBase 中的所有行都符合数据模型,并包含版本控制。在进行设计时考虑到这一点,以及 ColumnFamily 的块大小。
⑤ hbase的作用
HBase 是典型的 NoSQL 数据库,通常被描述成稀疏的、分布式的、持久化的,由行键、列键和时间戳进行索引的多维有序映射数据库,主要用来存储非结构化和半结构化的数据。因为 HBase 基于 Hadoop 的 HDFS 完成分布式存储,以及 MapRece 完成分布式并行计算,所以它的一些特点与 Hadoop 相同,依靠横向扩展,通过不断增加性价比高的商业服务器来增加计算和存储能力。
HBase 虽然基于 Bigtable 的开源实现,但它们之间还是有很多差别的,Bigtable 经常被描述成键值数据库,而 HBase 则是面向列存储的分布式数据库。
下面介绍 HBase 具备的显着特性,这些特性让 HBase 成为当前和未来最实用的数据库之一。
容量巨大
HBase 的单表可以有百亿行、百万列,可以在横向和纵向两个维度插入数据,具有很大的弹性。
当关系型数据库的单个表的记录在亿级时,查询和写入的性能都会呈现指数级下降,这种庞大的数据量对传统数据库来说是一种灾难,而 HBase 在限定某个列的情况下对于单表存储百亿甚至更多的数据都没有性能问题。
HBase 采用 LSM 树作为内部数据存储结构,这种结构会周期性地将较小文件合并成大文件,以减少对磁盘的访问。
扩展性强
HBase 工作在 HDFS 之上,理所当然地支持分布式表,也继承了 HDFS 的可扩展性。HBase 的扩展是横向的,横向扩展是指在扩展时不需要提升服务器本身的性能,只需添加服务器到现有集群即可。
HBase 表根据 Region 大小进行分区,分别存在集群中不同的节点上,当添加新的节点时,集群就重新调整,在新的节点启动 HBase 服务器,动态地实现扩展。这里需要指出,HBase 的扩展是热扩展,即在不停止现有服务的前提下,可以随时添加或者减少节点。
高可靠性
HBase 运行在 HDFS 上,HDFS 的多副本存储可以让它在岀现故障时自动恢复,同时 HBase 内部也提供 WAL 和 Replication 机制。
WAL(Write-Ahead-Log)预写日志是在 HBase 服务器处理数据插入和删除的过程中用来记录操作内容的日志,保证了数据写入时不会因集群异常而导致写入数据的丢失;而 Replication 机制是基于日志操作来做数据同步的。
⑥ HBase是什么呢,都有哪些特点呢
Hbase是一种NoSQL数据库,这意味着它不像传统的RDBMS数据库那样支持SQL作为查询语言。Hbase是一种分布式存储的数据库,技术上来讲,它更像是分布式存储而不是分布式数据库,它缺少很多RDBMS系统的特性,比如列类型,辅助索引,触发器,和高级查询语言等待
那Hbase有什么特性呢?如下:
强读写一致,但是不是“最终一致性”的数据存储,这使得它非常适合高速的计算聚合
自动分片,通过Region分散在集群中,当行数增长的时候,Region也会自动的切分和再分配
自动的故障转移
Hadoop/HDFS集成,和HDFS开箱即用,不用太麻烦的衔接
丰富的“简洁,高效”API,Thrift/REST API,Java API
块缓存,布隆过滤器,可以高效的列查询优化
操作管理,Hbase提供了内置的web界面来操作,还可以监控JMX指标
首先数据库量要足够多,如果有十亿及百亿行数据,那么Hbase是一个很好的选项,如果只有几百万行甚至不到的数据量,RDBMS是一个很好的选择。因为数据量小的话,真正能工作的机器量少,剩余的机器都处于空闲的状态
其次,如果你不需要辅助索引,静态类型的列,事务等特性,一个已经用RDBMS的系统想要切换到Hbase,则需要重新设计系统。
最后,保证硬件资源足够,每个HDFS集群在少于5个节点的时候,都不能表现的很好。因为HDFS默认的复制数量是3,再加上一个NameNode。
存储业务数据:车辆GPS信息,司机点位信息,用户操作信息,设备访问信息。。。
存储日志数据:架构监控数据(登录日志,中间件访问日志,推送日志,短信邮件发送记录。。。),业务操作日志信息
存储业务附件:UDFS系统存储图像,视频,文档等附件信息
什么时候用Hbase?
Hbase不适合解决所有的问题:
Hbase在单机环境也能运行,但是请在开发环境的时候使用。
内部应用
不过在公司使用的时候,一般不使用原生的Hbase API,使用原生的API会导致访问不可监控,影响系统稳定性,以致于版本升级的不可控。
HFile
HFile是Hbase在HDFS中存储数据的格式,它包含多层的索引,这样在Hbase检索数据的时候就不用完全的加载整个文件。索引的大小(keys的大小,数据量的大小)影响block的大小,在大数据集的情况下,block的大小设置为每个RegionServer 1GB也是常见的。
探讨数据库的数据存储方式,其实就是探讨数据如何在磁盘上进行有效的组织。因为我们通常以如何高效读取和消费数据为目的,而不是数据存储本身。
Hfile生成方式
起初,HFile中并没有任何Block,数据还存在于MemStore中。
Flush发生时,创建HFile Writer,第一个空的Data Block出现,初始化后的Data Block中为Header部分预留了空间,Header部分用来存放一个Data Block的元数据信息。
而后,位于MemStore中的KeyValues被一个个append到位于内存中的第一个Data Block中:
注:如果配置了Data Block Encoding,则会在Append KeyValue的时候进行同步编码,编码后的数据不再是单纯的KeyValue模式。Data Block Encoding是HBase为了降低KeyValue结构性膨胀而提供的内部编码机制。
⑦ 硬盘是如何存储和读取零碎的文件的
如果数据量不是很大(G级别以下),文件不是特别零碎,可以直接存在硬盘上。
但是如果数据量已经/可能超过T级别,或者文件小且零碎,建议还是放在HDFS等分布式文件系统上。
我存储爬虫的html以及图片数据,是通过HDFS的MapFile格式存储的。MapFile是个已排序的键值对文件格式,我的键采用的是url的hash+采集时间,值就是文件内容。并且封装了原生的MapFile.Reader实现了读取和一定程度的缓存(目前只用了LRU)。
在HDFS提倡一次写入,多次读取的前提下,文件的更新只能是通过失效旧,使用新的策略。即把旧的元数据标记为失效,插入新的元数据,并把更新的文件写入HDFS。读取是通过新的元数据定位到文件。同时,要定期的清除已失效的文件,即把未失效的元数据读出来,将对应的文件写到新的MapFile,删除旧的MapFile,即可实现物理删除。
当然还可以使用HBase。HBase是面向列的,二进制存储的,可横向拓展的NoSQL。可以把不大于64M的数据作为单元格数据直接写进去。但是有一定的学习成本,而且对集群的硬件要求比较
⑧ hadoop框架是如何处理大量小文件的
hdfs不适合存小文件,要处理大量小文件,2个办法。一 ,小文件合并成大文件再存。二,安装hbase,以数据的形式存小文件。
⑨ hbase是什么工具
将数据导入HBase中有如下几种方式:使用HBase的API中的Put方法使用HBase 的bulk load 工具使用定制的MapRece Job方式 使用HBase的API中的Put是最直接的方法,用法也很容易学习。但针对大部分情况,它并非都是最高效的方式。当需要将海量数据在规定时间内载入HBase中时,效率问题体现得尤为明显。待处理的数据量一般都是巨大的,这也许是为何我们选择了HBase而不是其他数据库的原因。在项目开始之前,你就该思考如何将所有能够很好的将数据转移进HBase,否则之后可能面临严重的性能问题。 HBase有一个名为 bulk load的功能支持将海量数据高效地装载入HBase中。Bulk load是通过一个MapRece Job来实现的,通过Job直接生成一个HBase的内部HFile格式文件来形成一个特殊的HBase数据表,然后直接将数据文件加载到运行的集群中。使用bulk load功能最简单的方式就是使用importtsv 工具。importtsv 是从TSV文件直接加载内容至HBase的一个内置工具。它通过运行一个MapRece Job,将数据从TSV文件中直接写入HBase的表或者写入一个HBase的自有格式数据文件。尽管importtsv 工具在需要将文本数据导入HBase的时候十分有用,但是有一些情况,比如导入其他格式的数据,你会希望使用编程来生成数据,而MapRece是处理海量数据最有效的方式。这可能也是HBase中加载海量数据唯一最可行的方法了。当然我们可以使用MapRece向HBase导入数据,但海量的数据集会使得MapRece Job也变得很繁重。若处理不当,则可能使得MapRece的job运行时的吞吐量很小。在HBase中数据合并是一项频繁执行写操作任务,除非我们能够生成HBase的内部数据文件,并且直接加载。这样尽管HBase的写入速度一直很快,但是若合并过程没有合适的配置,也有可能造成写操作时常被阻塞。写操作很重的任务可能引起的另一个问题就是将数据写入了相同的族群服务器(region server),这种情况常出现在将海量数据导入到一个新建的HBase中。一旦数据集中在相同的服务器,整个集群就变得不平衡,并且写速度会显着的降低。我们将会在本文中致力于解决这些问题。我们将从一个简单的任务开始,使用API中的Put方法将MySQL中的数据导入HBase。接着我们会描述如何使用 importtsv 和 bulk load将TSV数据文件导入HBase。我们也会有一个MapRece样例展示如何使用其他数据文件格式来导入数据。上述方式都包括将数据直接写入HBase中,以及在HDFS中直接写入HFile类型文件。本文中最后一节解释在向HBase导入数据之前如何构建好集群。本文代码均是以Java编写,我们假设您具有基本Java知识,所以我们将略过如何编译与打包文中的Java示例代码,但我们会在示例源码中进行注释。
⑩ hbase是如何做到并发写的和随机写的
阅读数:9381
Hbase概述
hbase是一个构建在HDFS上的分布式列存储系统。HBase是Apache Hadoop生态系统中的重要 一员,主要用于海量结构化数据存储。从逻辑上讲,HBase将数据按照表、行和列进行存储。
如图所示,Hbase构建在HDFS之上,hadoop之下。其内部管理的文件全部存储在HDFS中。与HDFS相比两者都具有良好的容错性和扩展性,都可以 扩展到成百上千个节点。但HDFS适合批处理场景,不支持数据随机查找,不适合增量数据处理且不支持数据更新。
Hbase是列存储的非关系数据库。传统数据库MySQL等,数据是按行存储的。其没有索引的查询将消耗大量I/O 并且建立索引和物化视图需要花费大量时间和资源。因此,为了满足面向查询的需求,数据库必须被大量膨胀才能满 足性能要求。
Hbase数据是按列存储-每一列单独存放。列存储的优点是数据即是索引。访问查询涉及的列-大量降低系统I/O 。并且每一列由一个线索来处理,可以实现查询的并发处理。基于Hbase数据类型一致性,可以实现数据库的高效压缩。
HBase数据模型
HBase是基于Google BigTable模型开发的, 典型的key/value系统。一个Row key对应很多Column Family,Column Family中有很多Column。其中,保存了不同时间戳的数据。
如图所示,Rowkey cutting对应列簇info和roles。其中,info中有key-value对hight-9ft,state-CA。更清晰的结构如下图所:
Hbase的所有操作均是基于rowkey的。支持CRUD(Create、Read、Update和Delete)和 Scan操作。 包括单行操作Put 、Get、Scan。多行操作包括Scan和MultiPut。但没有内置join操作,可使用MapRece解决。
HBase物理模型
Hbase的Table中的所有行都按照row key的字典序排列。Table 在行的方向上分割为多个Region。、Region按大小分割的,每个表开始只有一个region,随 着数据增多,region不断增大,当增大到一个阀值的时候, region就会等分会两个新的region,之后会有越来越多的 region。
Region是HBase中分布式存储和负载均衡的最小单元。 不同Region分布到不同RegionServer上。
Region虽然是分布式存储的最小单元,但并不是存储 的最小单元。Region由一个或者多个Store组成,每个store保存一个 columns family。每个Strore又由一个memStore和0至多个StoreFile组成。memStore存储在内存中,StoreFile存储在HDFS上。
HBase基本架构
HBase构建在HDFS之上,其组件包括 Client、zookeeper、HDFS、Hmaster以及HRegionServer。Client包含访问HBase的接口,并维护cache来加快对HBase的访问。Zookeeper用来保证任何时候,集群中只有一个master,存贮所有Region的寻址入口以及实时监控Region server的上线和下线信息。并实时通知给Master存储HBase的schema和table元数据。HMaster负责为Region server分配region和Region server的负载均衡。如果发现失效的Region server并重新分配其上的region。同时,管理用户对table的增删改查操作。Region Server 负责维护region,处理对这些region的IO请求并且切分在运行过程中变得过大的region。
HBase 依赖ZooKeeper,默认情况下,HBase 管理ZooKeeper 实例。比如, 启动或者停止ZooKeeper。Master与RegionServers 启动时会向ZooKeeper注册。因此,Zookeeper的引入使得 Master不再是单点故障。
Client每次写数据库之前,都会首先血Hlog日志。记录写操作。如果不做日志记录,一旦发生故障,操作将不可恢复。HMaster一旦故障,Zookeeper将重新选择一个新的Master 。无Master过程中,数据读取仍照常进行。但是,无master过程中,region切分、负载均衡等无法进行。RegionServer出现故障的处理原理是定时向Zookeeper汇报心跳,如果一旦时 间内未出现心跳HMaster将该RegionServer上的Region重新分配到其他RegionServer上。失效服务器上“预写”日志由主服务器进行分割并派送给新的 RegionServer 。Zookeeper是一个可靠地服务,一般配置3或5个Zookeeper实例。
寻找RegionServer定位的顺序是ZooKeeper --ROOT-(单Region) -.META. -用户表 。如上图所示。-ROOT- 表包含.META.表所在的region列表,该表只会有一 个Region。 Zookeeper中记录了-ROOT-表的location。 .META. 表包含所有的用户空间region列表,以及 RegionServer的服务器地址。
HBase应用举例
Hbase适合需对数据进行随机读操作或者随机写操作、大数据上高并发操作,比如每秒对PB级数据进行上千次操作以及读写访问均是非常简单的操作。
淘宝指数是Hbase在淘宝的一个典型应用。交易历史纪录查询很适合用Hbase作为底层数据库。