版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、版权所有 2015 华为技术有限公司HBase介绍第1页.前言.第1页HBase是一个高可靠性、高性能、面向列、可伸缩的分布式 数据库,设计目标是用来解决关系型数据库在处理海量数据 时的局限性。本章主要介绍HBase的应用场景、功能与架构、关键流程、 常用命令和参数。目标.第2页学完本课程后,您将能够:了解HBase的组成架构熟悉HBase的基本功能目录.第3页1.HBase应用场景HBase功能与架构HBase关键流程4.HBase常用命令和参数简介.第4页HBase是一个开源的非关系型分布式数据库(NoSQL),它 参考了谷歌的BigTable建模,实现的编程语言为 Java。HBase是
2、一个分布式存储系统,具有高可靠性、高性能、面向列、可伸缩的特点。HBase利用Hadoop HDFS作为其文件存储系统需求场景.第5页HBase适合具有如下需求的应用:海量数据(TB、PB)高吞吐量需要在海量数据中实现高效的随机读取需要很好的性能伸缩能力能够同时处理结构化和非结构化的数据不需要完全拥有传统关系型数据库所具备的ACID特性谁在用HBase ?.第6页目录.第7页1.HBase应用场景HBase功能与架构HBase关键流程4.HBase常用命令和参数部署架构 架构.第8页HBase模块 RegionRow001 Row002.Row010Row011 Row012.Row020Ro
3、w021Row022. Row030Row031.Region-1StartKey,EndKeyRegion-2StartKey,EndKeyRegion-3StartKey,EndKeyRegion-4StartKey,EndKey 将一个数据表按Key值范围横向划分为一个个 的子表,实现分布式存储。 这个子表,在HBase中被称作“Region”。每一个Region都关联一个Key值范围,即一个 使用StartKey和EndKey描述的区间。事实上,每 一个Region仅仅记录StartKey就可以了,因为它 的EndKey就是下一个Region的StartKey。Region是HBase
4、分布式存储的最基本单元。TableName? StartKey?Region.第9页Row001Row002.Row010Row011Row012.Row020Row021Row022.Row030Row031.HBase模块 Region与RegionServerRegionServer是HBase的数据服务进程。负责处理 用户数据的读写请求。Region被交由RegionServer管理。实际上,所有 用户数据的读写请求,都是和RegionServer上的 Region进行交互。Region可以在RegionServer之间发生转移。RegionRegionRegionServer思考:一
5、个Region包含了一个Startkey和EndKey范围;一条用户数据KeyValue必然属于一个唯一的Region; Region由RegionServer来管理,那么,这个路由信 息保存在哪里呢?Region如何才可以转移?由谁负责转移?Region.第10页HBase模块 Region分类Region分为元数据Region以及用 户Region两类。Meta Region记录了每一个User Region的路由信息。读写Region数据的路由,包括如下 几步:找寻Meta Region地址。再由Meta Region找寻User Region地址。RegionRegionRegionR
6、egionRegionMETARegion.第11页HBase模块 HMasterMaster进程负责管理所有的RegionServer。新RegionServer的注册。RegionServer Failover处理。 负责建表/修改表/删除表以及一些集群操作。Master进程负责所有Region的转移操作。 新表创建时的Region分配。 运行期间的负载均衡保障。RegionServer Failover后的Region接管。 Master进程有主备角色。集群可以配置多个 Master角色,集群启动时,这些Master角色通过竞 争获得主Master角色。主Master只能有一个,所有 的
7、备Master进程在集群运行期间处于休眠状态,不 干涉任何集群事务。疑问: 主备Master进程角色是如何进行裁决的?RegionServerRegionServerRegionServer“Hey, Region-A! Please move to RegionServer2!”“RegionServer1 was gone! Let others take control of it!”“Good! 1 new RegionServer iscoming.”.第12页HBase模块 Zookeeper 提供分布式锁的服务例如,多个Master进程竞争主Master角色时,怎么样 保证仅有一
8、个Active角色存在?这就需要一个分布式的 锁机制来保证。多个Master进程都尝试着去 ZooKeeper中写入一个对应的节点,该节点只能被一个 Master进程创建成功,创建成功的Master进程就是 Active角色。提供了事件监听机制例如,主Master进程宕掉之后,其它的备Master如何 能够快速的接管?这个过程中,备Master在监听那个 对应的ZooKeeper节点。主Master进程宕掉之后,该 节点会被删除,那么,其它的备Master就可以收到相 应的消息。个别场景,可充当一个微型数据库角色例如,在ZooKeeper中存放了Region Server的地址, 此时,可以将
9、它理解成一个微型数据库。“Master-1, Congratulations! You are the active one!”“Sorry, Master-2. The active seat has been taken by others. Please be patient!”.第13页数据结构介绍 三种结构具有固定的结构,属性划分,以及类型等信息。我们通常所理解的关系 型数据库中所存储的数据信息,大多是结构化数据, 如职工信息表,拥 有ID、Name、Phone、Address等属性信息。通常直接存放在数据库表中。数据记录的每一个属性对应数据表的一个 字段。结构化数据非结构化数据.第
10、14页半结构化数据无法用统一的结构来表示,如文本文件、图像、视频、声音、网页等信 息。数据记录较小时(如KB级别),可考虑直接存放到数据库表中(整条记录 映射到某一个列中),这样也有利于整条记录的快速检索。数据较大时,通常考虑直接存放在文件系统中。数据库可用来存放相关 数据的索引信息。具有一定的结构,但又有一定的灵活可变性。典型如XML、HTML等数 据。其实也是非结构化数据的一种。可以考虑直接转换成结构化数据进行存储。根据数据记录的大小和特点,选择合适的存储方式。这一点与非结构化 数据的存储类似。数据结构介绍 按行存储按列存储IDNameAddressPhone按行存储:数据按行存储在底层文
11、件系统中。通常,每一 行会被分配固定的空间。 优点:有利于增加/修改整行记录等操作; 有利于整行数据的读取操作; 缺点:单列查询时,会读取一些不必要 的数据。按列存储:数据以列为单位,存储在底层文件系统中。 优点:有利于面向单列数据的读取/统计等操作。 缺点:整行读取时,可能需要多次I/O操 作。可以看出,无论是按行存储,还是按列存储,都有明显的优缺点。是否存在一种折衷的方案?.第15页IDNamePhoneAddress数据结构介绍 KeyValue结构(1)IDNameAddressPhoneKeyValue具有特定的结构。Key部分被用来快速的检索一条数据记录,Value部分用来存储实际
12、的用户数据信息。KeyValue作为承载用户数据的基本单元,需要保存一些对自身的描述信息,例如,时间戳,类型等等。那么,势必 会有一定的结构化空间开销。一个Key值对应一个Value?还是一个Key值可以对应多个Value?Value-ID01Key-01Value-Name01Key-01Value-Phone01Key-01Value-Address01Key-01.第16页Relational DatabaseKeyValue DatabaseDatabase contains tables, tables contain columns and rows, and rows are m
13、ade up of column values. Rows within a table all have the same schema.The data model is well defined in advance. A schema is strongly typed and it has constraints and relationships that enforce data integrity.The data model is based on a “natural” representation of the data it contains, not on an ap
14、plications functionality.The data model is normalized to remove data duplication. Normalization establishes table relationships.Relationships associate data between tables.Domains can initially be thought of like a table, but unlike a table you dont define any schema for a domain. A Domain is basica
15、lly a bucket that you put items into. Items within a single domain can have differing schemas.Items are identified by keys, and a given item can have a dynamic set of attributes attached to it.In some implementations, attributes are all of a string type. In other implementations, attributes have sim
16、pletypes that reflect code types, such as ints, string arrays, and lists.No relationships are explicitly defined between domains or within a given domain.数据结构介绍 KeyValue结构(2)初始运行阶段,将Hash环划分为几个相等弧长 的区间,每一个Hash区间对应一个Node。对用户数据KeyValue的Key值进行Hash,落到 哪个Hash区间,就属于哪个Node。节点出现宕机时,将由该节点顺时针方向的下 一个节点接管相应的数据,避
17、免出现大范围的Re- Hash操作。新节点加入时,从上一个节点到新节点之间的 数据,需要Re-Hash到新的节点中。一致性Hash尽管一定程度上可以保证负载的均 匀性,但在节点频繁宕机,或频繁重启的情形下, 可能会导致负载的极不均匀。.第17页KeyValue型数据库数据分区方式-一致性Hash分区数据结构介绍 KeyValue结构(3)0102050603040708091011121314151601050206091310140307111504081216数据按照RowKey的范围(按一定的排序算法排序的结果,如按RowKey的字典顺序),划分为一个个的子区间。每 一个子区间都是一个分
18、布式存储的基本单元.第18页Node1Node2Node3Node4KeyValue型数据库数据分区方式-按Key值连续范围分区HBase数据模型 Column Family/hbase/table/region-1/region-2/region-3HDFSColumnFamily是Region的一个物理存储单元。同一个Region下面的多个ColumnFamily,位于不同的路径下面。ColumnFamily信息是表级别的配置。也就是说,同一个表的多个Region,都拥有相同的ColumnFamily信息(例如,都有两个ColumnFamily,且不同Region的同一个ColumnFam
19、ily配置信息相同)/hbase/table/region-1/ColumnFamily-1/region-1/ColumnFamily-2/region-2/ColumnFamily-1/region-2/ColumnFamily-2/region-3/ColumnFamily-1/region-3/ColumnFamily-2RegionRegionRegionRegion思考:ColumnFamily = HBase面向列存储?.第19页HBase数据模型 KeyVaueHBase的底层数据都是以KeyValue的形式存在的。KeyValue具有特定的格式。KeyValue中拥有时间戳、
20、类型等关键信息。同一个Key值可以关联多个KeyValue,每一个KeyValue都拥有一个Qualifier标识。即使是Key值相同,Qualifier也相同的多个KeyValue,也可能有多个,此时使用时间戳来区分,这就是同一条 数据记录的多版本。/hbase/table/region-1/ColumnFamily-1/region-1/ColumnFamily-2/region-2/ColumnFamily-1/region-2/ColumnFamily-2/region-3/ColumnFamily-1/region-3/ColumnFamily-2HFile.第20页HBase数据模
21、型 HFile从HFile文件中读取数据的流程:Trailer.第21页Root Data IndexMeta IndexFileInfoLeaf Data IndexLeaf Data IndexLeaf Data IndexData BlockData BlockData Block目录.第22页1.HBase应用场景2.HBase功能与架构3.HBase关键流程4.HBase常用命令和参数写流程 涉及的关键角色RegionRegionServerZooKeeperClient.第23页写流程 客户端发起写数据请求Client客户端写数据代码示例:/ 初始化配置信息Configuratio
22、n conf = HBaseConfiguration.create();/ 插入一行数据HTable table = new HTable(conf, tableName);Put put = new Put(Bytes.toBytes(012005000201); put.add(FAMILIES, Bytes.toBytes(name), Bytes.toBytes(张三); put.add(FAMILIES, Bytes.toBytes(gender), Bytes.toBytes(男);put.add(FAMILIES, Bytes.toBytes(address), Bytes.t
23、oBytes(广东省深圳市);table.put(put);.第24页构建Put对象:一个Put对象代表一行数据记录,可以添加多个列的数据。 如上例所示,RowKey为“012005000201”,包含3个列:name,gender,address。Put or PutList?HBase提供了两个主要的写数据接口,一个可以写入单行数据,即Put接口,另一个可以批量写入多行数据,即PutList接口。事实上,Put仅是PutList的一种特殊情形。因此,后面的流程介绍仅仅涉及PutList。写流程 定位RegionUser RegionMETARegionRegion Location.第25
24、页写流程 数据分组整个数据分组,涉及到两步“分篮子”操作: 将所有的记录按Region划分。将所有的记录按RegionServer划分。每个RegionServer上的数据会一起发送,这 样,发送的数据中,都是已经按照Region分 好组了。.第26页写流程 往RegionServer发送写数据请求利用HBase自身封装的RPC框架,来完成数据发送操作。往多个RegionServer发送请求是并行 操作。客户端发送完写数据请求后,会自动 等待请求处理结果。如果客户端没有捕获到任何的异常,则认为所有的数据都已经被写入成功。如果全部写入失败,或者部分写入失败,客户端能够获知详细的失败Key值列表。
25、从这里也可以看出,PutList操作是不 保证原子性的。.第27页写流程 Region写数据流程获取Region操作锁依次获取各行行锁写入到MemStore中写数据到WAL中释放已获取的行锁释放Region锁读写锁既然是Write- Ahead-Log,为何 先写内存再写WAL?一个内存排序集合.第28页HBase提供了一个MVCC机制,来保障写数据阶段的 数据可见性。先写MemStore再写WAL,是为了一些 特殊场景下,内存中的数据能够更及时的可见。如 果写WAL失败的话,MemStore中的数据会被回滚。写流程 HBase LSM Tree 将Put/Delete的数据暂时保存在每个Re
26、gion的内存中,即MemStore中。写内存,避免多Region情形下带来的过多 的分散IO操作。 数据在写入到MemStore之后,也会顺序 写入到HLog中,来保证数据的安全。.第29页写流程 FlushRegionMemStore-1(ColumnFamily-1)MemStore-2(ColumnFamily-2)HFileHFile存在如下两种场景,会触发一个Region的Flush操作:该Region的MemStore的总大小,达到了预设的Flush Size阈值。这种场景下的 Flush操作,通常仅瞬间堵塞用户的读写操作。但如果超出预设Flush Size阈值 过多的话,也可能
27、会引起较长时间的堵塞。 RegionServer的总内存大小超出了预设的阈值大小。这种场景下,在总内存没 有降低到预设的阈值以下之前,可能会较长时间堵塞。.第30页写流程 多HFile的影响随着时间的不断迁移,HFile文件数目越来越多,读取时延也越来越大!.第31页写流程 CompactionCompaction的主要目的,是为了减少同一个Region同一个ColumnFamily 下面的小文件数目,从而提升读取的性能。Compaction分为Minor、Major两类:Minor:小范围的Compaction。有最 少和最大文件数目限制。通常会选择 一些连续时间范围的小文件进行合并。Maj
28、or:涉及该Region该ColumnFamily下面的所有的HFile文件。Major Compaction过程中,会清理被 删除的数据。Minor Compaction选取文件时,遵 循一定的算法。HFileHFileHFileHFileHFileHFileMinor CompactionHFileMemStoreputHFileHFileHFileHFileMajor CompactionFlushWrite.第32页写流程 SplitDaughter Region-1Daughter Region-2 普通的Region Split操作,是指集群运行期间,某一 个Region的数据大小
29、超出了预设的阈值,则需要将该 Region自动分裂成为两个子Region。 分裂过程中,被分裂的Region会暂停一些读写服务。 由于分裂过程中,父Region的数据文件并不会真正的 分裂并重写到两个子Region中,而是仅仅通过在新 Region中创建引用文件的方式,来实现快速的分裂。 因此,Region暂停服务的时间会比较短暂。 客户端侧所缓存的父Region的路由信息需要被更新。思考:普通的Region Split操作,为何仅仅将一 个Region分裂成两个Region?能否分裂成 多个?Parent Region.第33页读流程 Get or ScanRegionScanGetGet操
30、作代码示例: HTable table = null; try table = new HTable(conf, tableName);Get get = new Get(rowKey.getBytes();/ 设定列族名和列名get.addColumn(family, qualifier);/ 设定列族名get.addFamily(family);Result result = table.get(get);for (KeyValue kv : result.raw() System.out.println(kv.getRow() + + (kv.getFamily() + + (kv.ge
31、tQualifier() + + kv.getTimestamp() + + kv.getValue() + ); catch (IOException e) / TODO finally if (null != table) try table.close(); catch (IOException e) / TODOscan.setCaching(1000);Get操作在提供精确的Key值的情形下,读取单行用户数据Scan操作代码示例:HTable table = null; ResultScanner rScanner = null; try table = new HTable(con
32、f, tableName); Scan scan = new Scan(); scan.setStartRow(startRow);scan.setStopRow(stopRow);/ 重要参数:每次RPC从服务端取回的记录数rScanner = table.getScanner(scan);for (Result r = rScanner.next(); r != null; r = rScanner.next()for (KeyValue kv : r.raw() / TODO catch (IOException e) / TODO finally if (null != rScanne
33、r) rScanner.close();if (null != table) try table.close(); catch (IOException e) / TODOScan操作是为了批量扫描限定Key值范围内的用户数据.第34页读流程 OpenScannerRegionColumnFamily-1 MemStoreHFile-11 HFile-12 HFile-13ColumnFamily-2 MemStoreHFile-21 HFile-22 HFile-23思考:一个Region可能有多个列族一个列族,可能包含有多个HFile文件,同时,还有部分数据存在于MemStore中,尚未固
34、 化如何读取,才可以读到想要的用户数据?OpenScanner的过程,会为MemStore,以及各个HFile创建所对应的Scanner:.第35页MemStore对应的Scanner为MemStoreScanner。HFile对应的Scanner为StoreFileScanner。读流程 NextScanner A Current KeyValue: Row01,FamiA:col1Scanner B Current KeyValue: Row01,FamiB:col1Scanner C Current KeyValue: Row01,FamiC:col1Scanner D Current
35、KeyValue: Row01,FamiD:col1Scanner AScanner B Current KeyValue: Row01,FamiB:col1Scanner C Current KeyValue: Row01,FamiC:col1Scanner D Current KeyValue: Row01,FamiD:col1PollFinished?YcloseThis is a PriorityQueue, it uses a Comparator to sort all elements.Scanner A Current KeyValue: Row01,FamiA:col2Sca
36、nner B Current KeyValue: Row01,FamiB:col1Scanner C Current KeyValue: Row01,FamiC:col1Scanner D Current KeyValue: Row01,FamiD:col1Suppose the scanning for Row01 is not finished in Scanner A. So this scanner will still present at the first place of the QueueScanner A Current KeyValue: Row02,FamiA:col1
37、N: Put backScanner AFinished?YcloseN: Put backPollSuppose the scanning for Row01 is finished in Scanner A. So this scanner will be put at the end of the Queue.第36页 每一个Scanner中,都有一个指 针,指向接下来要读取的用户数据 KeyValue是哪一个。 同一级的Scanner,被放在同一 个优先级队列中。通过不断的对比 每一个Scanner的指针所指向的 KeyValue,将这些Scanner进行排 序。 每一次next请求,
38、都是从该优 先级队列中,Poll出一个Scanner, 然后,读取该Scanner的当前指针 所指向的KeyValue即可。 每一次读完一个Scanner,指针 都会往下移一个KeyValue。而后, 该Scanner被返还到队列中。如果 已经读完,则直接关闭。nextnext读流程 FilterScan过程中使用Filter代码示例:Scan s = new Scan();/ 前缀过滤器,查找RowKey以“132”开头的行s.setFilter(new PrefixFilter(Bytes.toBytes(132);/ 查找符合条件的6行数据s.setFilter(new PageFilt
39、er(6);/ 多个过滤器结合使用FilterList list = new FilterList(Operator.MUST_PASS_ALL);list.addFilter(new SingleColumnValueFilter(family, qualifier,CompareOp.EQUAL, value); list.addFilter(new PageFilter(6); s.setFilter(list);Filter允许在Scan过程中,设定一定的过滤条件。符合条件的用户数据才返回。当前包含的一些典型的Filter有:RowFilter.第37页SingleColumnValu
40、eFilterKeyOnlyFilterFilterList使用Filter时,可能会扫描大量的用户数据,才可以找到所期望的满足条件的数据。因此,一些场景下的性能是不可预估的。Satisfied RowSatisfied RowSatisfied Row读流程 BloomFilter BloomFilter被用来优化一些随机读取的场景, 即Get场景。 它可以被用来快速的判断一条用户数 据在一个大的数据集合(该数据集合的大部分数据 都没法被加载到内存中)中是否存在。右图给出了BloomFilter的基础原理。 BloomFilter在判断一个数据是否存在时,拥有 一定的误判率。但对于“用户数据
41、 XXXX不存在” 的判断结果是可信的。HBase的BloomFilter的相关数据,被保存在 HFile中。数据写入阶段,对用户数据进行N次Hash,并且将映射到的对应的位改为1.第38页数据读取阶段,对用户数据进行N次Hash,判断对应的位是否为1目录.第39页1.HBase应用场景HBase功能与架构HBase关键流程4.HBase常用命令和参数常用接口.第40页客户端使用主要方式:HBase ShellHBase的命令行工具,最简单的接口,适合 HBase管理使用。Java API HBase客户端程序通过底层RPC接口与HBase集群进行通信,客户程序直接集成HBase的Java包,
42、通过调用相关API即可完成操作。其余接口:REST 接口REST(Representational State Transfer)表述性状态转移 接口。Thrift接口Thrift 是一个基于静态代码生成的跨语言的RPC协议栈实现,它可以生成包括C+, Java, Python, Ruby, PHP 等主流语言的代码,这些代码实现了 RPC 的协议层和传输层功能,从 而让用户可以集中精力于服务的调用和实现。Avro接口Avro是一个数据序列化系统,设计用于支持大批量数据交换 的应用。HBase Shell 连接通过/hbase shell来连接正在运行的HBase Shell客户端用法:.第4
43、1页# .bin/hbase shellHBase Shell; enter help for list of supported Type exit to leave the HBase ShellVersion 0.94.0, r, Sun Aug 26 22:12:56 CST 2012commands.hbase(main):001:0HBase Shell 创建表创建表时,可以选择多个参数,但表名和列族名是必须的参数,其它参数还包括版本数、TTL 以及预分Region建表的key数组等用法:hbase create t1, NAME = f1, VERSIONS = 5hbase c
44、reate t1, NAME = f1, NAME = f2, NAME = f3hbase # The above in shorthand would be the following: hbase create t1, f1, f2, f3hbase create t1, NAME = f1, VERSIONS = 1, TTL = 2592000, BLOCKCACHE = true hbase create t1, f1, SPLITS = 10, 20, 30, 40hbase create t1, f1, SPLITS_FILE = splits.txt hbase # Opti
45、onally pre-split the table into NUMREGIONS, usinghbase # SPLITALGO (HexStringSplit, UniformSplit or classname)hbase create t1, f1, NUMREGIONS = 15, SPLITALGO = HexStringSplit.第42页HBase Shell 插入一行数据PutPut数据时,必选参数是表名、RowKey、列名(包括列族和列名)和值,可选参数包括时间戳用法:hbase put t1, r1, c1, value, ts1例如,向表test中put三条数据,并通
46、过count命令计算test表中的数据的条数 示例:/向表test中put数据,RowKey为rowkey1,列族名为cf,列名为qualifier1,值为value1.第43页hbase(main):002:0 0 row(s) in 0.5940 hbase(main):003:0 0 row(s) in 0.0080/指定时间戳为3 hbase(main):011:0 0 row(s) in 0.0510 hbase(main):013:0 3 row(s) in 0.0160put test,rowkey1,cf:qualifier1,value1 secondsput test,ro
47、wkey2,cf:qualifier2,value2 secondsput test,rowkey3,cf:qualifier3,value3,3 secondscount test secondsHBase Shell 读取一行数据Get查询一行数据时,必选参数是表名和RowKey,可选参数包括列名(包括列族和列名)、时间戳、版本数等用法:.第44页hbase hbase hbase hbase hbase hbaseget t1,get t1,get t1,get t1,get t1,get t1,r1 r1,r1,r1,r1,r1,TIMERANGE= ts1, ts2= c1= c1,
48、 c2, c3=COLUMNCOLUMNCOLUMNCOLUMNc1,c1,TIMESTAMP TIMERANGE= ts1= ts1,ts2,VERSIONS = 4hbase get VERSIONS = 4t1,r1,COLUMN = c1,c1c1, c2c1, c2TIMESTAMP= ts1,hbase hbase hbaseget t1,get t1,get t1,r1,r1,r1,HBase Shell 读取多行数据Scan查询多行数据,必选参数是表名,可选参数包括列名(包括列族和列名)、起止Key、Filter用法:/查询元表.第45页hbase hbase hbase hb
49、ase hbasescan scan scan scan scan.META.META., COLUMNS = info:regioninfot1,t1,t1,COLUMNS = c1, c2, LIMIT = 10, STARTROW = xyzCOLUMNS = c1, TIMERANGE = 1303668804, 1303668904FILTER = (PrefixFilter (row2) AND (QualifierFilter s(=,binary:xyz)AND (TimestampsFilter hbase scan t1,( 123, 456)FILTER =org.apa
50、che.hadoop.hbase.filter.ColumnPaginationFilter.new(1, 0) hbase scan t1, COLUMNS = c1, c2, CACHE_BLOCKS = false hbase scan t1, RAW = true, VERSIONS = 10HBase Shell 其他常用命令HBase还提供了一些其它的Shell API,包括general、ddl、dml、tools、replication和security六组,每 组又包括多个Shell命令。每组命令和每个命令的用法均可以通过help查询其用法COMMAND GROUPS:Group name: gen
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 股骨转子间骨折的护理目标
- 整合网络信息合同
- 线上话务员培训实习协议范本
- 返程投资项目可行性分析协议
- 投资回报2026年股权合同
- 2026年大学生士兵典型人物事迹启示
- 2026年医院冰蓄冷空调系统移峰填谷
- 棋道馆2026年学员积分兑换协议
- 2025年工业物联网数据分析
- 2026年大班语言领域学期教学计划
- 戏剧与美育智慧树知到期末考试答案章节答案2024年长江人民艺术剧院
- 输液泵的使用培训课件
- 【复习资料】10398现代汉语语法修辞研究(练习测试题库及答案)
- 第五章-立地条件划分
- 说专业-物流管理专业
- 高三历史一轮复习研讨会经验交流课件
- 抖音小店出售协议书
- 广东深圳红岭中学物理自主招生试卷
- (完整word)幼小衔接拼音试卷十套打印版981
- 中国传统故事英文哪吒闹海二篇
- 西方经济学宏观第十四章
评论
0/150
提交评论