分布式存储系统:HBase:分布式存储系统概论_第1页
分布式存储系统:HBase:分布式存储系统概论_第2页
分布式存储系统:HBase:分布式存储系统概论_第3页
分布式存储系统:HBase:分布式存储系统概论_第4页
分布式存储系统:HBase:分布式存储系统概论_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

分布式存储系统:HBase:分布式存储系统概论1分布式存储系统基础1.1分布式存储系统概述在分布式计算环境中,分布式存储系统是一种能够跨多个地理位置的多台计算机存储和管理数据的系统。这种系统设计的核心目标是提高数据的可用性、可扩展性和容错性。与传统的集中式存储系统相比,分布式存储系统能够处理更大规模的数据量,同时提供更高的数据访问速度和更低的延迟。1.1.1分布式存储系统的关键特性分布式存储系统的关键特性包括:可扩展性:系统能够随着数据量的增加而扩展,无论是水平扩展(增加更多节点)还是垂直扩展(增加单个节点的存储容量)。容错性:系统设计能够容忍节点故障,确保数据的持久性和一致性。一致性:尽管数据分布在多个节点上,但系统能够保证数据的一致性,即所有节点上的数据都是最新的或一致的版本。高可用性:系统能够在部分节点故障的情况下仍然提供服务,确保数据的访问不受影响。性能:通过数据的分布式存储,系统能够提供更快的数据访问速度,减少单点瓶颈。1.1.2分布式存储系统的分类与比较分布式存储系统可以大致分为以下几类:键值存储:如AmazonDynamoDB,提供简单的键值对存储,适用于需要快速读写操作的场景。文档存储:如MongoDB,允许存储结构化的文档,适用于需要存储复杂数据结构的场景。列族存储:如HBase,基于Hadoop的分布式数据库,适用于需要处理大规模、稀疏数据集的场景。图形存储:如Neo4j,专门用于存储和查询图形数据,适用于社交网络、推荐系统等场景。时序数据库:如InfluxDB,专门用于存储时间序列数据,适用于监控、物联网等场景。每种类型的分布式存储系统都有其特定的应用场景和优势,选择合适的系统类型对于构建高效的数据存储和处理架构至关重要。1.2HBase:列族存储的典范HBase是一个开源的、分布式的、版本化的非关系型数据库,是ApacheHadoop生态系统中的重要组成部分。HBase的设计灵感来源于Google的Bigtable论文,它能够在廉价的商用硬件上存储和处理大规模数据集,提供高吞吐量的随机读写访问。1.2.1HBase的数据模型HBase的数据模型基于列族,每个表由一个或多个列族组成。列族中的列共享相同的存储空间,这意味着同一列族中的列会被存储在相同的文件中,从而优化了数据的读取性能。HBase的表结构如下:行键(RowKey):用于唯一标识表中的每一行,是访问数据的主要索引。列族(ColumnFamily):数据的逻辑分组,同一列族中的列数据存储在一起。列限定符(ColumnQualifier):用于区分同一列族中的不同列。时间戳(Timestamp):记录数据的版本,允许存储历史数据。1.2.2HBase的架构HBase的架构包括以下几个关键组件:HMaster:负责协调HBase集群中的所有RegionServer,管理表和Region的生命周期。RegionServer:负责存储和管理数据的Region,每个RegionServer可以管理多个Region。Region:HBase表的分区,每个Region包含一个或多个列族的数据。Store:每个Region中的列族数据存储单元,由MemStore和HFile组成。MemStore:内存中的数据结构,用于缓存写入的数据,当数据达到一定大小时,会被刷新到磁盘上的HFile。HFile:磁盘上的数据存储格式,提供数据的持久化存储。1.2.3HBase的读写操作HBase提供了丰富的API来支持数据的读写操作。以下是一个使用JavaAPI进行数据读写的示例:importorg.apache.hadoop.hbase.client.*;

importorg.apache.hadoop.hbase.util.*;

importorg.apache.hadoop.hbase.HBaseConfiguration;

importorg.apache.hadoop.conf.Configuration;

publicclassHBaseExample{

publicstaticvoidmain(String[]args)throwsException{

Configurationconfig=HBaseConfiguration.create();

Connectionconnection=ConnectionFactory.createConnection(config);

Tabletable=connection.getTable(TableName.valueOf("example_table"));

//写入数据

Putput=newPut(Bytes.toBytes("row1"));

put.addColumn(Bytes.toBytes("cf1"),Bytes.toBytes("col1"),Bytes.toBytes("value1"));

table.put(put);

//读取数据

Getget=newGet(Bytes.toBytes("row1"));

Resultresult=table.get(get);

byte[]value=result.getValue(Bytes.toBytes("cf1"),Bytes.toBytes("col1"));

System.out.println("Value:"+Bytes.toString(value));

table.close();

connection.close();

}

}在这个示例中,我们首先创建了一个HBase的配置对象,然后使用这个配置对象创建了一个连接。接着,我们通过这个连接获取了一个表的实例,并使用Put对象写入了一行数据。最后,我们使用Get对象读取了之前写入的数据。1.2.4HBase的应用场景HBase适用于以下几种场景:大规模数据存储:HBase能够存储PB级别的数据,适用于大数据分析和处理。实时数据处理:HBase提供了低延迟的随机读写访问,适用于实时数据处理和分析。稀疏数据集:HBase的列族存储模型非常适合存储稀疏数据集,如用户行为数据、传感器数据等。通过理解HBase的数据模型、架构和操作,我们可以更有效地利用HBase来解决大规模数据存储和处理的问题。2HBase核心概念2.1HBase简介与架构HBase是一个分布式、版本化的非关系型数据库,是ApacheHadoop生态系统中的重要组成部分。它基于Google的Bigtable论文设计,提供高可靠性、高性能、面向列、可伸缩的特性,特别适合于存储海量的、半结构化或非结构化数据。2.1.1架构组件HMaster:主要负责管理RegionServer,包括负载均衡、故障恢复等。RegionServer:负责存储和管理数据,每个RegionServer可以管理多个Region。Region:数据的物理存储单元,每个Region包含一个或多个列族。Store:每个Region内的列族对应一个Store,Store是Region内的数据存储单元。HFile:数据的物理存储格式,是HBase的底层存储文件。2.2HBase数据模型详解HBase的数据模型基于表,每个表由行、列族和列组成。数据存储在单元格中,每个单元格由行键、列族、列限定符和时间戳唯一标识。2.2.1数据模型结构行键(RowKey):用于唯一标识表中的每一行,是访问数据的主要方式。列族(ColumnFamily):表中的列被组织成列族,每个列族在物理上存储在一起。列限定符(ColumnQualifier):用于区分同一列族下的不同列。时间戳(Timestamp):HBase支持数据的版本控制,每个单元格的数据都有一个时间戳。2.2.2示例假设我们有一个用户行为日志表,结构如下:表名:user_behavior

列族:info

列:

-info:userid

-info:timestamp

-info:action

-info:location数据样例:RowKey:12345

info:userid->"user1"

info:timestamp->"1623541200"

info:action->"login"

info:location->"NewYork"2.3HBase的读写操作机制HBase的读写操作机制设计用于处理大规模数据的高效读写。它使用WAL(WriteAheadLog)和MemStore来保证数据的持久性和一致性。2.3.1写操作流程写入WAL:在数据写入MemStore之前,先写入WAL,确保数据在内存中丢失时可以恢复。写入MemStore:数据被写入内存中的MemStore,当MemStore达到一定大小时,数据会被flush到磁盘上的HFile。写入HFile:数据从MemStore被flush到HFile,HFile是HBase的底层存储格式,支持高效的数据读取。2.3.2读操作流程读取MemStore:首先尝试从MemStore中读取数据,因为MemStore中存储的是最新的数据。读取HFile:如果MemStore中没有数据,那么从HFile中读取,HFile中存储的是历史数据。合并数据:如果同一单元格有多个版本,那么根据时间戳和配置的版本控制策略合并数据。2.3.3示例代码以下是一个使用HBaseJavaAPI进行写操作的示例:importorg.apache.hadoop.hbase.client.Put;

importorg.apache.hadoop.hbase.client.Table;

importorg.apache.hadoop.hbase.util.Bytes;

publicclassHBaseWriteExample{

publicstaticvoidmain(String[]args)throwsException{

Configurationconf=HBaseConfiguration.create();

Tabletable=ConnectionFactory.createConnection(conf).getTable(TableName.valueOf("user_behavior"));

Putput=newPut(Bytes.toBytes("12345"));

put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("userid"),Bytes.toBytes("user1"));

put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("timestamp"),Bytes.toBytes("1623541200"));

put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("action"),Bytes.toBytes("login"));

put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("location"),Bytes.toBytes("NewYork"));

table.put(put);

table.close();

}

}这段代码创建了一个Put对象,用于向user_behavior表中插入数据。每个addColumn方法调用用于添加一个单元格的数据,包括列族、列限定符和值。2.3.4读操作示例以下是一个使用HBaseJavaAPI进行读操作的示例:importorg.apache.hadoop.hbase.client.Get;

importorg.apache.hadoop.hbase.client.Result;

importorg.apache.hadoop.hbase.client.Table;

importorg.apache.hadoop.hbase.util.Bytes;

publicclassHBaseReadExample{

publicstaticvoidmain(String[]args)throwsException{

Configurationconf=HBaseConfiguration.create();

Tabletable=ConnectionFactory.createConnection(conf).getTable(TableName.valueOf("user_behavior"));

Getget=newGet(Bytes.toBytes("12345"));

get.addColumn(Bytes.toBytes("info"),Bytes.toBytes("userid"));

Resultresult=table.get(get);

byte[]value=result.getValue(Bytes.toBytes("info"),Bytes.toBytes("userid"));

System.out.println("userid:"+Bytes.toString(value));

table.close();

}

}这段代码创建了一个Get对象,用于从user_behavior表中读取数据。addColumn方法用于指定要读取的列,table.get(get)执行读操作,返回一个Result对象,其中包含了请求的数据。通过以上介绍,我们了解了HBase的核心概念、数据模型和读写操作机制。HBase通过其独特的架构设计,能够高效地处理大规模数据的存储和检索,是大数据领域中不可或缺的工具。3HBase系统设计3.1HBase的存储机制HBase是一个分布式、版本化的NoSQL数据库,设计用于在廉价硬件上存储海量数据。它基于Google的Bigtable论文,并且是Hadoop生态系统的一部分,利用Hadoop的HDFS作为底层存储系统。HBase的数据模型是列族的,这意味着数据被组织成列族,而不是传统的表格中的行和列。3.1.1数据存储结构HBase中的数据存储在表中,每个表由多个行组成,每行有一个行键(rowkey),用于唯一标识该行。行键是字节序列,可以是任何类型的数据,如数字、字符串或时间戳。列被组织成列族(columnfamily),每个列族包含多个列。列族在表创建时定义,而列在运行时动态添加。示例假设我们有一个用户表,包含用户的基本信息和活动记录。表结构如下:表名:users列族:info和activityinfo列族包含:name和ageactivity列族包含:last_login和last_logout3.1.2数据存储格式HBase使用一种称为HFile的文件格式来存储数据。HFile是HBase的底层存储格式,它支持压缩和数据块缓存,以提高读写性能。HFile还支持数据的版本控制,这意味着可以存储多个版本的数据,每个版本都有一个时间戳。3.1.3数据访问HBase提供了随机访问和范围查询的能力。由于数据是按照行键排序存储的,因此范围查询非常高效。例如,可以查询所有行键在user100和user200之间的用户信息。3.2HBase的分区与负载均衡HBase通过将表分割成多个区域(region)来实现水平扩展。每个区域包含表的一部分行,区域可以分布在不同的RegionServer上,以实现数据的并行处理和负载均衡。3.2.1区域划分区域划分基于行键的范围。例如,一个表可能被划分为多个区域,每个区域负责处理一定范围内的行键。这种划分方式允许HBase在多个服务器上并行处理数据,从而提高整体性能。3.2.2负载均衡HBase的负载均衡器会监控RegionServer的负载,并在需要时重新分配区域,以确保所有服务器的负载均衡。这通过将区域从一个服务器移动到另一个服务器来实现,这个过程称为“区域迁移”。3.3HBase的容错与恢复策略HBase设计时考虑了容错性,它使用多种策略来确保数据的可靠性和系统的高可用性。3.3.1数据冗余HBase在HDFS上存储数据,HDFS本身提供了数据冗余,通常每个数据块有三个副本。这意味着如果一个节点失败,数据可以从其他节点恢复。3.3.2RegionServer故障恢复当一个RegionServer失败时,HBase的Master会检测到这个故障,并将该服务器上的所有区域重新分配给其他可用的RegionServer。这个过程是自动的,用户通常不需要干预。3.3.3数据恢复如果数据丢失或损坏,HBase可以使用HDFS的副本进行恢复。此外,HBase还提供了快照和备份功能,允许用户在需要时恢复到特定的时间点。3.3.4示例:HBase的容错机制假设我们有三个RegionServer(RS1、RS2、RS3),每个服务器上都有多个区域。如果RS2发生故障,HBase的Master会检测到这个故障,并将RS2上的所有区域重新分配给RS1和RS3,以确保数据的可用性和系统的稳定性。|RegionServer|区域|

|||

|RS1|R1|

|RS1|R2|

|RS1|R3|

|RS3|R4|

|RS3|R5|

|RS3|R6|在RS2故障后,区域重新分配可能如下所示:|RegionServer|区域|

|||

|RS1|R1|

|RS1|R2|

|RS1|R3|

|RS1|R4|

|RS1|R5|

|RS1|R6|

|RS3|R4|

|RS3|R5|

|RS3|R6|在这个过程中,HBase确保了数据的连续可用性,同时自动处理了故障恢复。通过上述机制,HBase能够提供一个可靠、高性能的分布式存储系统,适用于大规模数据存储和处理场景。4HBase高级特性4.1HBase的压缩与加密4.1.1原理与内容HBase作为一款分布式列式存储系统,提供了数据压缩和加密功能,以提高存储效率和数据安全性。数据压缩可以减少存储空间,提高读写性能,而加密则确保数据在传输和存储过程中的安全性。数据压缩HBase支持多种压缩算法,包括Gzip、LZO、Snappy等。压缩算法的选择取决于数据特性和性能需求。例如,Gzip提供了较高的压缩比,但压缩和解压缩速度较慢;而Snappy则提供了较快的压缩速度,但压缩比相对较低。数据加密HBase的数据加密功能可以防止数据在传输和存储过程中被未授权访问。加密可以在客户端、RegionServer和HDFS三个层面进行。客户端加密确保数据在传输过程中安全;RegionServer加密保护数据在内存中的安全;HDFS加密则确保数据在磁盘上的安全。4.1.2示例压缩示例在HBase中,可以通过修改表的属性来启用压缩。以下是一个使用Snappy压缩算法创建表的例子://创建表时启用压缩

HBaseAdminadmin=newHBaseAdmin(conf);

HTableDescriptortableDescriptor=newHTableDescriptor(TableName.valueOf("testTable"));

HColumnDescriptorcolumnDescriptor=newHColumnDescriptor("cf1");

columnDescriptor.setCompressionType(Compression.Algorithm.SNAPPY);

tableDescriptor.addFamily(columnDescriptor);

admin.createTable(tableDescriptor);加密示例HBase的数据加密可以通过配置Hadoop的Kerberos安全机制来实现。以下是一个简单的Kerberos配置示例:<!--在hadoop-env.sh中设置JAVA_HOME-->

exportJAVA_HOME=/path/to/java

<!--在core-site.xml中启用Kerberos-->

<property>

<name>hadoop.security.authentication</name>

<value>kerberos</value>

</property>

<!--在hbase-site.xml中配置HBase安全-->

<property>

<name>hbase.security.authentication</name>

<value>kerberos</value>

</property>4.2HBase的备份与恢复4.2.1原理与内容HBase的备份与恢复机制用于防止数据丢失,确保数据的高可用性和持久性。备份可以是全量备份或增量备份,而恢复则可以是完全恢复或部分恢复。全量备份全量备份是指备份整个HBase集群的数据,包括所有的表和Region。全量备份通常在数据量较小或需要完全恢复的情况下使用。增量备份增量备份是指备份自上次备份以来发生更改的数据。这种方式可以节省存储空间,但恢复时需要结合上次的全量备份和所有增量备份。完全恢复完全恢复是指从备份中恢复整个HBase集群的数据,包括所有的表和Region。部分恢复部分恢复是指从备份中恢复特定的表或Region,适用于数据部分丢失或需要恢复特定数据的情况。4.2.2示例全量备份示例使用HBase的hbase-dump和hbase-load工具进行全量备份和恢复:#备份

hbase-dumphbase:table>/path/to/backup/table.dump

#恢复

hbase-loadhbase:table</path/to/backup/table.dump增量备份示例HBase的增量备份可以通过定期快照和差异备份实现。以下是一个使用HBase的snapshot命令创建快照的例子:#创建快照

hbaseshell

>snapshot'myTable','myTableSnapshot'

#恢复快照

>clone_snapshot'myTableSnapshot','myTable'4.3HBase的性能调优与监控4.3.1原理与内容HBase的性能调优涉及多个方面,包括硬件配置、HBase配置参数、数据模型设计等。监控则是性能调优的重要辅助手段,通过监控可以实时了解HBase的运行状态,及时发现和解决问题。硬件配置调优硬件配置直接影响HBase的性能,包括CPU、内存、磁盘和网络。例如,增加内存可以减少RegionServer的GC时间,提高性能。HBase配置参数调优HBase提供了大量的配置参数,用于调整其性能。例如,hbase.regionserver.hlog.roll.period参数用于控制HLog的滚动周期,合理的设置可以提高写性能。数据模型设计调优数据模型设计对HBase的性能有重要影响。例如,通过合理设计列族,可以减少数据的读写延迟。监控HBase的监控可以通过Hadoop的内置监控工具,如Ganglia、Nagios等,也可以使用HBase自带的监控工具,如HBaseMasterUI、HBaseShell等。4.3.2示例HBase配置参数调优示例调整HBase的hbase.regionserver.hlog.roll.period参数,以提高写性能:<!--在hbase-site.xml中配置-->

<property>

<name>hbase.regionserver.hlog.roll.period</name>

<value>120</value>

</property>监控示例使用HBaseMasterUI监控HBase的运行状态:#访问HBaseMasterUI

http://master-host:60010在MasterUI中,可以查看集群的总体状态,包括Region分布、RegionServer状态、HLog状态等,也可以查看特定表的详细信息,包括读写延迟、Region数量、StoreFile数量等。5HBase应用实践5.1HBase的安装与配置在开始HBase的安装与配置之前,我们需要确保环境已经安装了Java和Hadoop,因为HBase依赖于这两个软件。以下步骤将指导你如何在Linux环境下安装和配置HBase。5.1.1环境准备Java:确保Java环境已安装,版本建议为1.8或以上。Hadoop:安装Hadoop并配置好,版本建议为2.7或以上。5.1.2下载HBase从Apache官网下载HBase的最新稳定版本,例如HBase2.2.6。下载链接如下:wget/hbase/stable/hbase-2.2.6-bin.tar.gz5.1.3解压并安装HBasetar-zxvfhbase-2.2.6-bin.tar.gz

cdhbase-.4配置HBase编辑conf/hbase-site.xml文件,配置HBase与Hadoop的集成,以及HBase的一些基本参数。<!--hbase-site.xml-->

<configuration>

<property>

<name>hbase.rootdir</name>

<value>hdfs://localhost:9000/hbase</value>

</property>

<property>

<name>hbase.zookeeper.quorum</name>

<value>localhost</value>

</property>

<property>

<name>perty.dataDir</name>

<value>/usr/local/zookeeper/data</value>

</property>

</configuration>5.1.5启动HBase在HBase目录下,执行以下命令启动HBase:sbin/start-hbase.sh5.1.6验证HBase使用HBase的Shell工具验证HBase是否启动成功:bin/hbaseshell5.2HBase应用案例分析HBase是一个分布式、版本化的NoSQL数据库,它在Hadoop之上提供了类似Bigtable的能力。下面我们将通过一个具体的案例来分析HBase的应用场景。5.2.1案例:实时日志分析系统假设我们正在构建一个实时日志分析系统,需要存储和查询大量的日志数据。日志数据具有以下特点:高写入频率:每秒可能有成千上万条日志写入。海量数据:日志数据量可能达到PB级别。实时查询需求:需要能够快速查询特定时间、特定设备的日志。数据模型设计在HBase中,数据存储在表中,表由行、列族和列组成。对于日志数据,我们可以设计如下数据模型:表名:logs行键:设备ID+时间戳,确保数据的唯一性和时间顺序。列族:info,存储日志的详细信息。列:log_level、log_message、log_time等。数据写入使用HBase的JavaAPI写入数据:importorg.apache.hadoop.hbase.client.Put;

importorg.apache.hadoop.hbase.client.Table;

importorg.apache.hadoop.hbase.util.Bytes;

publicclassLogWriter{

publicstaticvoidmain(String[]args)throwsException{

Configurationconf=HBaseConfiguration.create();

Tabletable=ConnectionFactory.createConnection(conf).getTable(TableName.valueOf("logs"));

Putput=newPut(Bytes.toBytes("device12345"));

put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("log_level"),Bytes.toBytes("ERROR"));

put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("log_message"),Bytes.toBytes("Diskspacelow"));

put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("log_time"),Bytes.toBytes("1592345678901"));

table.put(put);

}

}数据查询使用HBase的JavaAPI查询数据:importorg.apache.hadoop.hbase.client.Get;

importorg.apache.hadoop.hbase.client.Result;

importorg.apache.hadoop.hbase.client.Table;

importorg.apache.hadoop.hbase.util.Bytes;

publicclassLogReader{

publicstaticvoidmain(String[]args)throwsException{

Configurationconf=HBaseConfiguration.create();

Tabletable=ConnectionFactory.createConnection(conf).getTable(TableName.valueOf("logs"));

Getget=newGet(Bytes.toBytes("device12345"));

get.addColumn(Bytes.toBytes("info"),Bytes.toBytes("log_message"));

Resultresult=table.get(get);

System.out.println("LogMessage:"+Bytes.toString(result.getValue(Bytes.toBytes("info"),Bytes.toBytes("log_message"))));

}

}5.3HBase与大数据生态的集成HBase作为ApacheHadoop生态系统的一部分,可以与Hadoop的其他组件如HDFS、MapReduce、Spark等无缝集成,提供更强大的数据处理能力。5.3.1与HDFS集成HBase使用HDFS作为底层存储,所有的数据最终都存储在HDFS上。HBase的hbase.rootdir配置指定了HBase数据在HDFS上的存储位置。5.3.2与MapReduce集成HBase可以作为MapReduce的输入和输出格式,允许MapReduce任务直接读写HBase表。以下是一个使用HBase作为MapReduce输入的例子:importorg.apache.hadoop.hbase.HBaseConfiguration;

importorg.apache.hadoop.hbase.client.HTable;

importorg.apache.hadoop.hbase.io.ImmutableBytesWritable;

importorg.apache.hadoop.hbase.mapreduce.TableInputFormat;

importorg.apache.hadoop.hbase.mapreduce.TableOutputFormat;

importorg.apache.hadoop.hbase.util.Bytes;

importorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.fs.Path;

importorg.apache.hadoop.io.Text;

importorg.apache.hadoop.mapreduce.Job;

importorg.apache.hadoop.mapreduce.Mapper;

importorg.apache.hadoop.mapreduce.Reducer;

importjava.io.IOException;

publicclassLogAnalyzer{

publicstaticclassLogMapperextendsMapper<ImmutableBytesWritable,Result,Text,Text>{

@Override

protectedvoidmap(ImmutableBytesWritablekey,Resultvalue,Contextcontext)throwsIOException,InterruptedException{

StringlogMessage=Bytes.toString(value.getValue(Bytes.toBytes("info"),Bytes.toBytes("log_message")));

context.write(newText("ERROR"),newText(logMessage));

}

}

publicstaticclassLogReducerextendsReducer<Text,Text,Text,Text>{

@Override

protec

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论