lan-base:基于局域网
lan-free:基于SAN
server-free:基于SAN
LAN-FREE
环境:RS6000+FASTT700+3583带库,所谓LAN-free,是指数据不经过局域网直接进行备份,即用户只需将磁带机或磁带库等备份设备连接到SAN中,各服务器就可把需要备份的数据直接发送 到共享的备份设备上,不必再经过局域网链路。由于服务器到共享存储设备的大量数据传输是通过SAN网络进行的,局域网只承担各服务器之间的通信(而不是数 据传输)任务。
LAN_FREE是专门用于SAN环境下的备份,可以使备份的数据直接通过SAN的链路从备份客户端(AIX主机)到备份设备(磁带机,支持光纤),有别 于传统通过LAN链路的备份方式,这样可以不占用以太网络的带宽,一般要求硬件设备支持光纤存储(磁带机,阵列),需要通过SAN交换机(2109等)设 备将这些设备连接起来,软件要求TSM,和TSM对LAN_FREE支持的AGENT数据库可用TDP。
下图展示了Lan Free备份的方案架构图:
在这里插入描述
SERVER-FREE
SAN Server-Free备份 LAN Free备份对需要占用备份主机的CPU资源,如果备份过程能够在SAN内部完成,而大量数据流无需流过服务器,则可以极大降低备份 *** 作对生产系统的影响。SAN Server-Free备份就是这样的技术。
在这里插入描述
一、备份的概念
备份顾名思义,就是将数据以某种形式保存下来,备份的根本目的在于恢复,在这些数据丢失、毁坏和受到威胁的时候,使用数据的备份来恢复数据。虽然备份的定 义可能很简单,不过具体实施存储系统的备份却可能是一份艰巨的任务,其中包含了许多可以预见的以及不易预见的需要考虑的因素。
二、备份与拷贝、归档的区别
备份不能仅仅通过拷贝完成,因为拷贝不能留下系统的注册表等信息;而且也不能留下历史记录保存下来,以做追踪;当数据量很大时,手工的拷贝工作又是何其麻 烦。备份=拷贝+管理。管理包括备份的可计划性、磁带机的自动化 *** 作、历史记录的保存以及日志记录等等。正如生命周期理论将在线数据分级为在线和近线数据 一样,离线数据亦可分为备份与存档数据,以降低投资和运维成本。
存档的目的是将需要长期备查或转移到异地保存/恢复的数据存放到可移动存储介质上。严格意义上讲,存档的目的不是为了保障数据安全,而只是为了实现数据仓 储。如果说备份相当于桌头的字典,工作时会经常翻用,存档则好像日常工作中生成的一些具长期保存价值的文字资料,被转移到书架上或档案馆里备查。
三、常规备份的实现方式
通常一套完整的备份系统包含备份软件、磁带机/磁带库、和备份服务器,具体的备份策略的制定、备份介质的管理以及一些扩展功能的实现,都是由备份软件来最 终完成的。在备份服务器上安装备份软件的服务器端,在应用服务器端安装备份软件的客户端代理,如果是数据库应用还需要相应的数据库接口程序,客户端代理软 件和服务器端软件协调工作,按照预先制定的备份策略自动或手动的将数据备份到磁带上。然而一个具有一定规模的数据中心的数据备份要涉及到多种UNIX平台 和不同的数据库类型,可以想象每天的备份工作对于管理员来说都是一个挑战。
备份策略制定是备份工作的重要部分。一般来说需要备份的数据存在一个2/8原则,即20%的数据被更新的概率是80%。这个原则告诉我们,每次备份都完整的复制所有数据是一种非常不合理的做法。事实上,真实环境中的备份工作往往是基于一次完全备份之后的增量或差量备份。
完全备份很好理解,即把所有数据进行一次完整的备份,当进行恢复的时候只需要一盘磁带;
增量备份是只有那些在上次完全备份或者增量备份后被修改了的文件才会被备份,如下图,优点是备份数据量小,需要的时间短,缺点是恢复的时候需要多盘磁带,出问题的风险较大,
差量备份是备份那些自从上次完全备份之后被修改过的文件,如下图,因此从差量备份中恢复速度是很快的,因为只需要两份磁带(最后一次完全备份和最后一次差量备份),缺点是每次备份需要的时间较长。
备份窗口是在进行备份 *** 作时,应用系统可以接受的最长备份时间,对于某些5X8类型的非关键应用备份窗口可以很大,但是对于7X24小时的应用备份窗口就会很小。
四、LAN Free和Serverless备份
所谓LAN Free Backup顾名思义,就是指释放网络资源的数据备份方式。
在SAN架构中,备份服务器向应用服务器发送指令和信息,指挥应用服务器将数据直接从磁盘阵列中备份到磁带库中。在这个过程中,庞大的备份数据流没有流经 网络,为网络节约了宝贵的带宽资源。在NAS架构中,情形十分类似,磁带库直接连接在NAS文件服务器上,备份服务器通过NDMP协议,指挥NAS文件服 务器将数据备份到磁带库中。细心观察之下会发现,这两种方式虽然都节约了网络资源,但却增加了服务器的工作负荷,缺点是价格非常昂贵,大多数备份软件的 LAN Free功能选项都需要用户付出高昂的价格。
Serverless Backup技术是以全面的释放网络和服务器资源为目的的,技术核心就是在SAN的交换层实现数据的复制工作,这样备份数据不仅无需经过网络,而且也不必 经过应用服务器的总线,完全的保证了网络和应用服务器的高效运行。但是现实情况却没有这么理想,Serverless Backup技术目前只能停留在纸面上,实际实施效果很差,完全不需要主机干预还不现实。
存储基础知识(八):备份技术(下)
一、主流备份软件
备份软件厂商中头把交椅当属Veritas公司。这家公司经过近几年的发展和并购,在备份软件市场已经占据了四成左右的份额。其备份产品主要是两个系列 ——高端的NetBackup和低端的Backup Exec。其中NetBackup适用于中型和大型的存储系统,可以广泛的支持各种开放平台。NetBackup还支持复杂的网络备份方式和LAN Free的数据备份,其技术先进性是业界共同认可的。
Backup Exec是原Seagate Soft公司的产品,在Windows平台具有相当的普及率和认可度,微软公 司不仅在公司内部全面采用这款产品进行数据保护,还将其简化版打包在Windows *** 作系统中,我们现在在Windows系统中使用的“备份”功能,就是 OEM自Backup Exec的简化版。2000年初,Veritas收购了Seagate Soft之后,在原来的基础上对这个产品进一步丰富和加强,现在,这款产品在低端市场的占用率已经稳稳的占据第一的位置。
Legato公司是备份领域内仅次于Veritas公司的主要厂商。作为专业的备份软件厂商,Legato公司拥有着比Veritas公司更久的历史,这 使其具有了相当的竞争优势,一些大型应用的产品中涉及到备份的部分都会率先考虑与Legato的接口问题。而且,像Oracle等一些数据库应用干脆内置 集成了Legato公司的备份引擎。这些因素使得Legato公司成为了高端备份软件领域中的一面旗帜。在高端市场这一领域,Legato公司与 Veritas公司一样具有极强的技术和市场实力,两家公司在高端市场的争夺一直难分伯仲。
Legato公司的备份软件产品以NetWorker系列为主线,与NetBackup一样,NetWorker也是适用于大型的复杂网络环境,具有各种 先进的备份技术机制,广泛的支持各种开放系统平台。值得一提的是, NetWorker中的Cellestra技术第一个在产品上实现了Serverless Backup的思想。仅就备份技术的先进性而言,Legato公司是有实力可以挑战任何强大对手的。
除了Veritas和Legato这备份领域的两大巨头之外,IBM Tivoli也是重要角色之一。其Tivoli Storage Manager产品是高端备份产品中的有力竞争者。与Veritas的NetBackup和Legato的NetWorker相比,Tivoli Storage Manager更多的适用于IBM主机为主的系统平台,但其强大的网络备份功能觉对可以胜任任何大规模的海量存储系统的备份需要。
CA公司是软件领域的一个巨无霸企业,虽然主要精力没有放在存储技术方面,但其原来的备份软件ARCServe仍然在低端市场具有相当广泛的影响力。近年 来,随着存储市场的发展,CA公司重新调整策略,并购了一些备份软件厂商,整合之后今年推出了新一代备份产品——BrightStor,这款产品的定位直 指中高端市场,看来CA公司誓要在高端市场与Veritas和Legato一决雌雄。
二、带机、带库厂商及产品
备份设备的生产厂家很多,每个厂家都有着较长的产品线,由于篇幅所限,我们不可能一一列举。这里主要介绍那些国际知名的、国内有影响力的带机和带库原厂商 及其主打产品。目前,带机正在朝快的数据传输速度和高的单盘磁带存储容量方向发展,具有主流驱动技术的带机厂商包括Quantum、Exabyte和 Sony等。
Quantum带机在中档产品中占据了市场大部分份额,但其中很大一部分走了OEM的销售渠道。其自动加载机SuperLoader可将多个备份目标集中 到一个共享的自动系统中,降低处理成本,而基于磁盘(备份介质是磁盘)又具有磁带海量特性的近线备份设备DX30可显著缩短备份与恢复时间。
Exabyte的磁带驱动技术包括8mm Mammoth和VXA技术,VXA是定位低端的新的磁带技术,它以包的格式读写数据,并可对磁带上的数据记录区进行无空隙扫描,具有高质量、高可靠性、低成本等性能特点。其中VXA-1带机专为苹果机设计的存储方案;VXA-2同样具有较高的性价比,并具有12MB/s传输速率及160GB容量,与VXA-1向下兼容。
这里我们有必要讲一讲Sony的基于AIT技术的带机产品:AIT-1、AIT-2和AIT-3,其中AIT-3是高性能和大容量的新存储方案,容量(未 压缩)为100GB,速率为12MB/s,而且能够与AIT-1、AIT-2完全读和写逆向兼容,并具有分层磁头、创新性的磁带内存储器(MIC) 驱动器接口系统等多项专利技术,提高磁轨密度和存储速度。
磁带库厂商相对品牌较多,用户的选择空间也更大一些。目前主流的磁带库厂商主要有STK,Quantum,Exabyte和IBM等。
在带库厂商中,市场份额最大的当属美国存储技术公司(StorageTek,STK)。STK目前最主要的产品线是L系列,包括L20、L40、L80、 L180、L700、L5500,从最小20磁带槽位到最大5500磁带槽位。在其入门级产品上,支持LTO、DLT和SuperDLT等开放技术,只有 在高端产品上才同时支持其自身拥有的9840、9940驱动技术。
Quantum拥有DLT、SuperDLT技术,其用户基础和发展前景都很好。其P系列的主打产品P4000和P7000分别可以支持几百槽位和十几个 驱动器,适合于企业级用户;M系列是模块化的产品,可根据用户系统需求的增长灵活扩展带库的容量和性能,M1500可从20槽位扩展到200槽 位,M2500则可从100槽位扩展到300槽位,非常适合于那些快速发展的中小企业。美中不足的是,ATL对超大容量的解决方案不是非常理想,在这一部 分市场上的竞争力较弱。
8mm是安百特(Exabyte)公司的独立技术,具有速度快、容量大、可靠性高、价廉、体积小等特点,主要用于带库,其8mm带库的智能机械臂系统可任 意存取磁带,采用模块化设计,产品线全,从VXA自动化/驱动器产品系列AutoPak230/115/110、VXA-1/1到Mammoth Tape自动化/驱动器产品系列X200/80/430M/215M/EZ17、M2/Mammoth/Eliant 820,容量从单盘(非压缩)33GB到整库12TB,涵盖由低到高的用户市场,可实现无人值守自动数据存储管理,适用于服务器备份、网络备份、自动归 档、分级存储管理及图形图像等领域。
IBM,众所周知,生产和销售所有IT类产品,当然也包括带库产品。IBM的带库和带机产品大体可分2个系列:用于IBM环境的和用于开放环境的。如 IBM的3494、3575等带库只支持其专用的驱动器,开放性差,虽然这些带库产品也支持HP、SUN等主流服务器平台,但实际上几乎只用在IBM环境 中。随着SAN技术的普及,追求开放性和互联性成为存储行业的潮流。结合LTO驱动技术的投产,IBM为其开放存储系统解决方案推出了新的带库系列—— 3583和3584。
三、备份技术新趋势
D2D2T是Disk to Disk toTape的缩写,即数据备份从磁盘阵列到磁盘库到磁带的过程。传统的磁带备份总是会带给用户以下苦恼:
1、备份速度慢,备份窗口冗长
2、备份的根本目的在于恢复,而磁带的恢复速度很慢,对于TB级的数据恢复等待时间过长
3、磁带介质受灰尘、温度、湿度影响很大,难以保证已经离线保存的磁带在需要的时候可以正常工作
4、磁带库的机械手等物理设备的故障率和磨损率相对电子元件较高
相信长期从事磁带备份工作的管理员(尤其是大数据量关键应用的磁带备份)对以上几点都会深有感触,尤其是当在线数据受到破坏,需要依靠磁带备份来恢复正常生产的时候,大家都会为能否顺利恢复数据捏一把汗。
有什么办法可以解决磁带备份固有的劣势呢?随着磁盘容量的增长价格的下降,使用磁盘备份作为磁带备份的补充甚至替代都成为可能,当然磁带体积小,便于归档 等特点是磁盘设备不具备的,因此D2D2T即磁盘到磁盘到磁带备份方式有效地中和了磁盘备份和磁带备份的优点,在线数据保存在高速磁盘阵列,备份数据首先 保存在性价比较高的SATA磁盘阵列中,然后定期将磁盘备份的数据保存到磁带上,这样既缩短了备份窗口又增强了数据恢复的可靠性。可以一起查。
1scan原理
HBase的查询实现只提供两种方式:
1、按指定RowKey 获取唯一一条记录,get方法(orgapachehadoophbaseclientGet)
Get 的方法处理分两种 : 设置了ClosestRowBefore 和没有设置的rowlock 主要是用来保证行的事务性,即每个get 是以一个row 来标记的一个row中可以有很多family 和column
2、按指定的条件获取一批记录,scan方法(orgapacheHadoophbaseclientScan)实现条件查询功能使用的就是scan 方式
1)scan 可以通过setCaching 与setBatch 方法提高速度(以空间换时间);
2)scan 可以通过setStartRow 与setEndRow 来限定范围([start,end)start 是闭区间,
end 是开区间)。范围越小,性能越高。
3)、scan 可以通过setFilter 方法添加过滤器,这也是分页、多条件查询的基础。
HBase中scan并不像大家想象的一样直接发送一个命令过去,服务器就将满足扫描条件的所有数据一次性返回给客户端。而实际上它的工作原理如下图所示:
上图右侧是HBase scan的客户端代码,其中for循环中每次遍历ResultScanner对象获取一行记录,实际上在客户端层面都会调用一次next请求。next请求整个流程可以分为如下几个步骤:
next请求首先会检查客户端缓存中是否存在还没有读取的数据行,如果有就直接返回,否则需要将next请求给HBase服务器端(RegionServer)。
如果客户端缓存已经没有扫描结果,就会将next请求发送给HBase服务器端。默认情况下,一次next请求仅可以请求100行数据(或者返回结果集总大小不超过2M)
服务器端接收到next请求之后就开始从BlockCache、HFile以及memcache中一行一行进行扫描,扫描的行数达到100行之后就返回给客户端,客户端将这100条数据缓存到内存并返回一条给上层业务。
HBase 每次 scan 的数据量可能会比较大,客户端不会一次性全部把数据从服务端拉回来。而是通过多次 rpc 分批次的拉取。类似于 TCP 协议里面一段一段的传输,可以做到细粒度的流量控制。至于如何调优,控制每次 rpc 拉取的数据量,就可以通过三个参数来控制。
setCaching => setNumberOfRowsFetchSize (客户端每次 rpc fetch 的行数)
setBatch => setColumnsChunkSize (客户端每次获取的列数)
setMaxResultSize => setMaxResultByteSize (客户端缓存的最大字节数)
hbaseclientscannercaching - (setCaching):HBase-098 默认值为为 100,HBase-12 默认值为 2147483647,即 IntegerMAX_VALUE。Scannext() 的一次 RPC 请求 fetch 的记录条数。配置建议:这个参数与下面的setMaxResultSize配合使用,在网络状况良好的情况下,自定义设置不宜太小, 可以直接采用默认值,不配置。
setBatch() 配置获取的列数,假如表有两个列簇 cf,info,每个列簇5个列。这样每行可能有10列了,setBatch() 可以控制每次获取的最大列数,进一步从列级别控制流量。配置建议:当列数很多,数据量大时考虑配置此参数,例如100列每次只获取50列。一般情况可以默认值(-1 不受限)。
hbaseclientscannermaxresultsize - (setMaxResultSize):HBase-098 无该项配置,HBase-12 默认值为 210241024,即 2M。Scannext() 的一次 RPC 请求 fetch 的数据量大小,目前 HBase-12 在 Caching 为默认值(Integer Max)的时候,实际使用这个参数控制 RPC 次数和流量。配置建议:如果网络状况较好(万兆网卡),scan 的数据量非常大,可以将这个值配置高一点。如果配置过高:则可能 loadCache 速度比较慢,导致 scan timeout 异常
hbaseserverscannermaxresultsize:服务端配置。HBase-098 无该项配置,HBase-12 新增,默认值为 10010241024,即 100M。该参数表示当 Scannext() 发起 RPC 后,服务端返回给客户端的最大字节数,防止 Server OOM。
要计算一次扫描 *** 作的RPC请求的次数,用户需要先计算出行数和每行列数的乘积。然后用这个值除以批量大小和每行列数中较小的那个值。最后再用除得的结果除以扫描器缓存值。 用数学公式表示如下:
RPC 返回的个数 = (row数 每行的列数)/ Min(每行列数,Batch大小) / Caching大小
Result 返回的个数 =( row数 每行的列数 )/ Min(每行列数,Batch大小)
复制
2Hbase Shell中使用
在hbase shell中查询数据,可以在hbase shell中直接使用过滤器:
# hbase shell > scan 'tablename',STARTROW=>'start',COLUMNS=>['family:qualifier'],FILTER=>"ValueFilter(=,'substring:88')"
复制
如上命令所示,查询的是表名为testByCrq,过滤方式是通过value过滤,匹配出value含111的数据。
因在hbase shell中一些 *** 作比较麻烦(比如删除字符需先按住ctrl在点击退格键),且退出后,查询的历史纪录不可考,故如下方式是比较方便的一种:
# echo "scan 'testByCrq', FILTER=>\"ValueFilter(=,'substring:111')\"" | hbase shell
复制
如上命令,可在bash中直接使用,表名是testByCrq,过滤方式是通过value过滤,匹配出value含111的数据,中间的"需要用\转义。
建表
create 'test1', 'lf', 'sf'
-- lf: column family of LONG values (binary value)
-- sf: column family of STRING values
复制
导入数据
put 'test1', 'user1|ts1', 'sf:c1', 'sku1'
put 'test1', 'user1|ts2', 'sf:c1', 'sku188'
put 'test1', 'user1|ts3', 'sf:s1', 'sku123'
put 'test1', 'user2|ts4', 'sf:c1', 'sku2'
put 'test1', 'user2|ts5', 'sf:c2', 'sku288'
put 'test1', 'user2|ts6', 'sf:s1', 'sku222'
put 'test1', 'user3|ts7', 'lf:c1', 12345
put 'test1', 'user3|ts8', 'lf:c1', 67890
复制
1限制条件
scan 'hbase:meta'
scan 'hbase:meta', {COLUMNS => 'info:regioninfo'}
scan 'ns1:t1', {COLUMNS => ['c1', 'c2'], LIMIT => 10, STARTROW => 'xyz'}
scan 't1', {COLUMNS => ['c1', 'c2'], LIMIT => 10, STARTROW => 'xyz'}
scan 't1', {COLUMNS => 'c1', TIMERANGE => [1303668804, 1303668904]}
scan 't1', {REVERSED => true}
复制
2Filter过滤
1rowkey查询
rowkey为user1开头的
scan 'test1', FILTER => "PrefixFilter ('user1')"
ROW COLUMN+CELL
user1|ts1 column=sf:c1, timestamp=1409122354868, value=sku1
user1|ts2 column=sf:c1, timestamp=1409122354918, value=sku188
user1|ts3 column=sf:s1, timestamp=1409122354954, value=sku123
复制
FirstKeyOnlyFilter: 一个rowkey可以有多个version,同一个rowkey的同一个column也会有多个的值, 只拿出key中的第一个column的第一个version KeyOnlyFilter: 只要key,不要value
scan 'test1', FILTER=>"FirstKeyOnlyFilter() AND ValueFilter(=,'binary:sku188') AND KeyOnlyFilter()"
ROW COLUMN+CELL
user1|ts2 column=sf:c1, timestamp=1409122354918, value=
复制
查询rowkey里面包含ts3的
scan 'test1', FILTER=>"RowFilter(=,'substring:ts3')"
ROW COLUMN+CELL
user1|ts3 column=sf:s1, timestamp=1554865926412, value=sku123
复制
从user1|ts2开始,找到所有的rowkey以user1开头的
scan 'test1', {STARTROW=>'user1|ts2', FILTER => "PrefixFilter ('user1')"}
ROW COLUMN+CELL
user1|ts2 column=sf:c1, timestamp=1409122354918, value=sku188
user1|ts3 column=sf:s1, timestamp=1409122354954, value=sku123
复制
从user1|ts2开始,找到所有的到rowkey以user2开头
scan 'test1', {STARTROW=>'user1|ts2', STOPROW=>'user2'}
ROW COLUMN+CELL
user1|ts2 column=sf:c1, timestamp=1409122354918, value=sku188 user1|ts3 column=sf:s1, timestamp=1409122354954, value=sku123
复制
2值查询
谁的值=sku188
scan 'test1', FILTER=>"ValueFilter(=,'binary:sku188')"
ROW COLUMN+CELL
user1|ts2 column=sf:c1, timestamp=1409122354918, value=sku188
复制
谁的值包含88
scan 'test1', FILTER=>"ValueFilter(=,'substring:88')"
ROW COLUMN+CELL
user1|ts2 column=sf:c1, timestamp=1409122354918, value=sku188
user2|ts5 column=sf:c2, timestamp=1409122355030, value=sku288
复制
值小于等于20000
scan 'test1', FILTER=>"ValueFilter(<=,'binary:20000')"
ROW COLUMN+CELL
user3|ts7 column=lf:c1, timestamp=1554866187587, value=12345
复制
注意:如果查询值大于20000,会查出所有值,因为“sku188”等值转为二进制后都大于20000。
substring不能使用小于等于等符号。
3列查询
column为c2,值包含88的用户
scan 'test1', FILTER=>"ColumnPrefixFilter('c2') AND ValueFilter(=,'substring:88')"
ROW COLUMN+CELL
user2|ts5 column=sf:c2, timestamp=1409122355030, value=sku288
复制
通过搜索进来的(column为s)值包含123或者222的用户
scan 'test1', FILTER=>"ColumnPrefixFilter('s') AND ( ValueFilter(=,'substring:123') OR ValueFilter(=,'substring:222') )"
ROW COLUMN+CELL
user1|ts3 column=sf:s1, timestamp=1409122354954, value=sku123
user2|ts6 column=sf:s1, timestamp=1409122355970, value=sku222
复制
列族查询
scan 'test1', FILTER=>"FamilyFilter(=,'substring:lf')"
ROW COLUMN+CELL
user3|ts7 column=lf:c1, timestamp=1554866187587, value=12345
user3|ts8 column=lf:c1, timestamp=1554866294485, value=67890
复制
4时间戳
scan 'test1',{FILTER=>"TimestampsFilter(1448069941270,1548069941230)" }
复制
3java查询
过滤器
HBase 的基本 API,包括增、删、改、查等。
增、删都是相对简单的 *** 作,与传统的 RDBMS 相比,这里的查询 *** 作略显苍白,只能根据特性的行键进行查询(Get)或者根据行键的范围来查询(Scan)。
HBase 不仅提供了这些简单的查询,而且提供了更加高级的过滤器(Filter)来查询。
过滤器的两类参数
过滤器可以根据列族、列、版本等更多的条件来对数据进行过滤,基于 HBase 本身提供的三维有序(行键,列,版本有序),这些过滤器可以高效地完成查询过滤的任务,带有过滤器条件的 RPC 查询请求会把过滤器分发到各个 RegionServer(这是一个服务端过滤器),这样也可以降低网络传输的压力。
使用过滤器至少需要两类参数:
一类是抽象的 *** 作符
HBase 提供了枚举类型的变量来表示这些抽象的 *** 作符:
LESS
LESS_OR_EQUAL
EQUAL
NOT_EQUAL
GREATER_OR_EQUAL
GREATER
NO_OP
另一类是比较器
代表具体的逻辑,例如字节级的比较,字符串级的比较等。
参数基础
有两个参数类在各类Filter中经常出现,统一介绍下:
(1)比较运算符 CompareFilterCompareOp
比较运算符用于定义比较关系,可以有以下几类值供选择:
EQUAL 相等
GREATER 大于
GREATER_OR_EQUAL 大于等于
LESS 小于
LESS_OR_EQUAL 小于等于
NOT_EQUAL 不等于
(2)比较器 ByteArrayComparable
通过比较器可以实现多样化目标匹配效果,比较器有以下子类可以使用:
BinaryComparator 匹配完整字节数组
BinaryPrefixComparator 匹配字节数组前缀
BitComparator
NullComparator
RegexStringComparator 正则表达式匹配
SubstringComparator 子串匹配
1,FilterList
FilterList 代表一个过滤器链,它可以包含一组即将应用于目标数据集的过滤器,过滤器间具有“与” FilterListOperatorMUST_PASS_ALL 和“或” FilterListOperatorMUST_PASS_ONE 关系。
官网实例代码,两个“或”关系的过滤器的写法:
FilterList list = new FilterList(FilterListOperatorMUST_PASS_ONE); //数据只要满足一组过滤器中的一个就可以
SingleColumnValueFilter filter1 = new SingleColumnValueFilter(cf,column,CompareOpEQUAL,BytestoBytes("my value"));
listadd(filter1);
SingleColumnValueFilter filter2 = new SingleColumnValueFilter(cf,column,CompareOpEQUAL,BytestoBytes("my other value"));
listadd(filter2);
Scan scan = new Scan();
scansetFilter(list);
复制

2,列值过滤器--SingleColumnValueFilter
SingleColumnValueFilter 用于测试列值相等 (CompareOpEQUAL ), 不等 (CompareOpNOT_EQUAL),或单侧范围 (eg, CompareOpGREATER)。
构造函数:
(1)比较的关键字是一个字符数组
SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareFilterCompareOp compareOp, byte[] value)
(2)比较的关键字是一个比较器(比较器下一小节做介绍)
SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareFilterCompareOp compareOp, ByteArrayComparable comparator)
注意:根据列的值来决定这一行数据是否返回,落脚点在行,而不是列。我们可以设置filtersetFilterIfMissing(true);如果为true,当这一列不存在时,不会返回,如果为false,当这一列不存在时,会返回所有的列信息
测试表user内容如下:
Table table = connectiongetTable(TableNamevalueOf("user"));
SingleColumnValueFilter scvf= new SingleColumnValueFilter(BytestoBytes("account"), BytestoBytes("name"),
CompareOpEQUAL,"zhangsan"getBytes());
scvfsetFilterIfMissing(true); //默认为false, 没有此列的数据也会返回 ,为true则只返回name=lisi的数据
Scan scan = new Scan();
scansetFilter(scvf);
ResultScanner resultScanner = tablegetScanner(scan);
for (Result result : resultScanner) {
List<Cell> cells= resultlistCells();
for (Cell cell : cells) {
String row = BytestoString(resultgetRow());
String family1 = BytestoString(CellUtilcloneFamily(cell));
String qualifier = BytestoString(CellUtilcloneQualifier(cell));
String value = BytestoString(CellUtilcloneValue(cell));
Systemoutprintln("[row:"+row+"],[family:"+family1+"],[qualifier:"+qualifier+"]"+ ",[value:"+value+"],[time:"+cellgetTimestamp()+"]");
}
}
复制

如果setFilterIfMissing(true), 有匹配只会返回当前列所在的行数据,基于行的数据 country 也返回了,因为他么你的rowkey是相同的
[row:zhangsan_1495527850824],[family:account],[qualifier:country],[value:china],[time:1495636452285]
[row:zhangsan_1495527850824],[family:account],[qualifier:name],[value:zhangsan],[time:1495556648729]
复制
如果setFilterIfMissing(false),有匹配的列的值相同会返回,没有此列的 name的也会返回,, 不匹配的name则不会返回。
下面 红色是匹配列内容的会返回,其他的不是account:name列也会返回,, name=lisi的不会返回,因为不匹配。
[row:lisi_1495527849910],[family:account],[qualifier:idcard],[value:42963319861234561230],[time:1495556647872]
[row:lisi_1495527850111],[family:account],[qualifier:password],[value:123451231236],[time:1495556648013]
[row:lisi_1495527850114],[family:address],[qualifier:city],[value:黄埔],[time:1495556648017]
[row:lisi_1495527850136],[family:address],[qualifier:province],[value:shanghai],[time:1495556648041]
[row:lisi_1495527850144],[family:info],[qualifier:age],[value:21],[time:1495556648045]
[row:lisi_1495527850154],[family:info],[qualifier:sex],[value:女],[time:1495556648056]
[row:lisi_1495527850159],[family:userid],[qualifier:id],[value:002],[time:1495556648060]
[row:wangwu_1495595824517],[family:userid],[qualifier:id],[value:009],[time:1495624624131]
[row:zhangsan_1495527850759],[family:account],[qualifier:idcard],[value:9897645464646],[time:1495556648664]
[row:zhangsan_1495527850759],[family:account],[qualifier:passport],[value:5689879898],[time:1495636370056]
[row:zhangsan_1495527850824],[family:account],[qualifier:country],[value:china],[time:1495636452285]
[row:zhangsan_1495527850824],[family:account],[qualifier:name],[value:zhangsan],[time:1495556648729]
[row:zhangsan_1495527850951],[family:address],[qualifier:province],[value:guangdong],[time:1495556648855]
[row:zhangsan_1495527850975],[family:info],[qualifier:age],[value:100],[time:1495556648878]
[row:zhangsan_1495527851080],[family:info],[qualifier:sex],[value:男],[time:1495556648983]
[row:zhangsan_1495527851095],[family:userid],[qualifier:id],[value:001],[time:1495556648996]
复制

3 键值元数据
由于HBase 采用键值对保存内部数据,键值元数据过滤器评估一行的键(ColumnFamily:Qualifiers)是否存在
31 基于列族过滤数据的FamilyFilter
构造函数:
FamilyFilter(CompareFilterCompareOp familyCompareOp, ByteArrayComparable familyComparator)
代码如下:
public static ResultScanner getDataFamilyFilter(String tableName,String family) throws IOException{
Table table = connectiongetTable(TableNamevalueOf("user"));
FamilyFilter ff = new FamilyFilter(CompareOpEQUAL ,
new BinaryComparator(BytestoBytes("account"))); //表中不存在account列族,过滤结果为空
// new BinaryPrefixComparator(value) //匹配字节数组前缀
// new RegexStringComparator(expr) // 正则表达式匹配
// new SubstringComparator(substr)// 子字符串匹配
Scan scan = new Scan();
// 通过scanaddFamily(family) 也可以实现此 *** 作
scansetFilter(ff);
ResultScanner resultScanner = tablegetScanner(scan);
return resultScanner;
}
复制

测试结果:查询的都是account列簇的内容
[row:lisi_1495527849910],[family:account],[qualifier:idcard],[value:42963319861234561230],[time:1495556647872]
[row:lisi_1495527850081],[family:account],[qualifier:name],[value:lisi],[time:1495556647984]
[row:lisi_1495527850111],[family:account],[qualifier:password],[value:123451231236],[time:1495556648013]
[row:zhangsan_1495527850759],[family:account],[qualifier:idcard],[value:9897645464646],[time:1495556648664]
[row:zhangsan_1495527850759],[family:account],[qualifier:passport],[value:5689879898],[time:1495636370056]
[row:zhangsan_1495527850824],[family:account],[qualifier:country],[value:china],[time:1495636452285]
[row:zhangsan_1495527850824],[family:account],[qualifier:name],[value:zhangsan],[time:1495556648729]
复制

32 基于限定符Qualifier(列)过滤数据的QualifierFilter
构造函数:
QualifierFilter(CompareFilterCompareOp op, ByteArrayComparable qualifierComparator)
Table table = connectiongetTable(TableNamevalueOf("user"));
QualifierFilter ff = new QualifierFilter(
CompareOpEQUAL , new BinaryComparator(BytestoBytes("name")));
// new BinaryPrefixComparator(value) //匹配字节数组前缀
// new RegexStringComparator(expr) // 正则表达式匹配
// new SubstringComparator(substr)// 子字符串匹配
Scan scan = new Scan();
// 通过scanaddFamily(family) 也可以实现此 *** 作
scansetFilter(ff);
ResultScanner resultScanner = tablegetScanner(scan);
复制

测试结果:只返回 name 的列内容
[row:lisi_1495527850081],[family:account],[qualifier:name],[value:lisi],[time:1495556647984]
[row:zhangsan_1495527850824],[family:account],[qualifier:name],[value:zhangsan],[time:1495556648729]
复制
33 基于列名(即Qualifier)前缀过滤数据的ColumnPrefixFilter
( 该功能用QualifierFilter也能实现 )
构造函数:
ColumnPrefixFilter(byte[] prefix)
Table table = connectiongetTable(TableNamevalueOf("user"));
ColumnPrefixFilter ff = new ColumnPrefixFilter(BytestoBytes("name"));
Scan scan = new Scan();
// 通过QualifierFilter的 newBinaryPrefixComparator也可以实现
scansetFilter(ff);
ResultScanner resultScanner = tablegetScanner(scan);
复制

返回结果:
[row:lisi_1495527850081],[family:account],[qualifier:name],[value:lisi],[time:1495556647984]
[row:zhangsan_1495527850824],[family:account],[qualifier:name],[value:zhangsan],[time:1495556648729]
复制
34 基于多个列名(即Qualifier)前缀过滤数据的MultipleColumnPrefixFilter
MultipleColumnPrefixFilter 和 ColumnPrefixFilter 行为差不多,但可以指定多个前缀
byte[][] prefixes = new byte[][] {BytestoBytes("name"), BytestoBytes("age")};
//返回所有行中以name或者age打头的列的数据
MultipleColumnPrefixFilter ff = new MultipleColumnPrefixFilter(prefixes);
Scan scan = new Scan();
scansetFilter(ff);
ResultScanner rs = tablegetScanner(scan);
复制

结果:
[row:lisi_1495527850081],[family:account],[qualifier:name],[value:lisi],[time:1495556647984]
[row:lisi_1495527850144],[family:info],[qualifier:age],[value:21],[time:1495556648045]
[row:zhangsan_1495527850824],[family:account],[qualifier:name],[value:zhangsan],[time:1495556648729]
[row:zhangsan_1495527850975],[family:info],[qualifier:age],[value:100],[time:1495556648878]
复制
35 基于列范围过滤数据ColumnRangeFilter
构造函数:
ColumnRangeFilter(byte[] minColumn, boolean minColumnInclusive, byte[] maxColumn, boolean maxColumnInclusive)
参数解释:
minColumn - 列范围的最小值,如果为空,则没有下限;
minColumnInclusive - 列范围是否包含minColumn ;
maxColumn - 列范围最大值,如果为空,则没有上限;
maxColumnInclusive - 列范围是否包含maxColumn 。
代码:
Table table = connectiongetTable(TableNamevalueOf("user"));
byte[] startColumn = BytestoBytes("a");
byte[] endColumn = BytestoBytes("d");
//返回所有列中从a到d打头的范围的数据,
ColumnRangeFilter ff = new ColumnRangeFilter(startColumn, true, endColumn, true);
Scan scan = new Scan();
scansetFilter(ff);
ResultScanner rs = tablegetScanner(scan);
复制

结果:返回列名开头是a 到 d的所有列数据
[row:lisi_1495527850114],[family:address],[qualifier:city],[value:黄埔],[time:1495556648017]
[row:lisi_1495527850144],[family:info],[qualifier:age],[value:21],[time:1495556648045]
[row:zhangsan_1495527850824],[family:account],[qualifier:country],[value:china],[time:1495636452285]
[row:zhangsan_1495527850975加载工具具备如下一些特性和优点:
1)与集群高度集成,方便部署;
2)支持 SQL 及外部工具的加载方式;面向用户的 SQL 接口方式使集群和单机加载方式统一,更符合用户的使用习惯;
3)支持单表多数据源并行加载,支持多加载机对单表的并行加载,最大化加载性能;
4)支持从通用数据服务器拉取数据,支持 ftp/>Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。
广义的Hadoop,一般称为Hadoop生态系统,如下所示。
Hadoop生态系统中这些软件的作用:
HDFS 采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点(NameNode)和若干个数据节点(DataNode)。
HDFS采用Java语言开发,因此任何支持JVM的机器都可以部署名称节点和数据节点。
在配置好Hadoop 集群之后,可以通过浏览器访问 >json和base64存储的优缺点如下:
1、优点:JSON具有广泛的应用范围,可以用于不同编程语言之间的数据传输,也可以用于浏览器和服务器之间的通信。其次,JSON格式简单明了,易于阅读和编写,而且可以轻松地被解析和生成。此外,JSON还具有较小的数据量和快速的解析速度,对于网络传输和数据存储都非常有利。而base64存储可以加密,减少了>支持。
多CPU并行:GBase 8t动态服务器的核心技术是基于GBase 8t的动态可伸缩结构(DSA),该技术使GBase8T成为强大的多线索数据库服务器,利用该技术使得数据库系统能充分发挥对称多处理器或单处理器结构服务器的能力,并在数据库可伸缩性、可管理性和性能等方面有很大突破。GBase 8t可以配置CPU VP的数量,系统需要有足够多的CPU VP来加速线索的执行从而保证系统中其它进程能占用足够的CPU时间,GBase 8t同时支持处理器绑定(processor affinity),处理器绑定是特定的进程只能在特定的CPU上执行。特定的CPU仍然能为其它进程服务,但特定的进程只能在该CPU上执行,如果平台支持,INFORMIX动态服务器可以将CPU VP(oninit)绑定到指定的处理器上。处理器从0开始连续编号。在某些SMP平台上,由一个CPU专门处理系统中断。如果配置的CPU VP数量小于物理处理器数量,则应避免将CPU VP绑定到处理中断的CPU上。
多服务器并行:GBase 8t支持高可用集群方案,GBase 8t的HDR、SDS、RSS等技术实现了数据的高可用灾备技术,而该技术的处理需要多服务器并行计算技术。
事务处理的完整性控制技术:为了保证事务的完整性,GBase 8t数据库通过逻辑日志 (logical log) 来记录所有的事务 *** 作及其处理的数据。逻辑日志的作用之一在于对数据所发生的变化进行记录以满足可能的回滚需要。GBase 8t允许用户在一个事务中,从多个数据服务器查询或更新一个或者多个数据库。数据服务器可以在同一个主机上,或是在同一网络的不同主机上。两阶段提交协议确保了从多个数据服务器提交或回滚事务的一致性。GBase 8t对异构分布式数据库的支持是通过X/OPEN、XA实现的。
支持并行查询/DML、备份/恢复、导入/导出、索引创建:GBase 8t的OLTP引擎通过DSA多线程和PDQ(Parallel database query)技术可实现并行数据库并行查询/DML/索引创建;DML利用GBase 8t不同级别的锁管理和隔离机制,有效保障了数据库的DML *** 作的并发性;备份/恢复利用GBase 8t的onbar备份恢复模块支持并行备份与恢复;导入/导出利用GBase 8t的HPL(High Performance Loader)工具可通过并发方式完成数据库的导入导出 *** 作。
作用是,如果用户需要Command+R进入恢复模式,他会使电脑会自动从网上下载Base System系统并加载。
BaseSystem是一个 *** 作环境,由Darwin部分内核部件组成。Base system是Mac上的一个功能强大的恢复环境。BaseSystem可以在Mac非物理性故障(丢失 *** 作系统,系统故障,分区表(或分区)损坏)恢复系统。
扩展资料:
注意事项
1、如果想使用外接磁盘中的Mac OS可以使用磁盘工具将系统恢复到外接磁盘中。
2、如果想给别人的Mac电脑重装Mac OS,可以使用磁盘工具先将系统安装到U盘,然后使用恢复系统,将U盘的系统恢复恢复到其他电脑中,几分钟解决。
3、进入U盘中系统也是很快的,这篇博客就是使用U盘中的Mac OS 完成的。
4、如果使用在线安装系统一定要保证网络连接,如果中间出现网络不好,无法继续下载时,可以选择手动终止,并重新下载。
5、安装系统前可以使用磁盘工具保存备份文件到U盘中。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)