大数据技术基础教程全套教学课件_第1页
大数据技术基础教程全套教学课件_第2页
大数据技术基础教程全套教学课件_第3页
大数据技术基础教程全套教学课件_第4页
大数据技术基础教程全套教学课件_第5页
已阅读5页,还剩389页未读 继续免费阅读

下载本文档

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

文档简介

第1章绪论《大数据技术基础教程》第1章绪论第2章分布式计算编程基础第3章大数据处理框架ApacheHadoop第4章分布式文件系统HDFS第5章分布式数据库HBase第6章分布式计算框架MapReduce第7章数据仓库Hive第8章流计算SparkStreaming第9章数据可视化第10章基于大数据的电商精准营销第11章好友推荐案例分析全套可编辑PPT课件学习目标/Target掌握大数据技术的基本理论和方法了解大数据的概念、特点、应用场景等了解大数据处理的相关流程和技术章节概述/

Summary大约从2009年开始,随着以博客、社交网络、基于位置的服务LBS为代表的新型信息发布方式的不断涌现,以及云计算、物联网等技术的兴起,数据正以前所未有的速度在不断的增长和累积,大数据时代已经来到,“大数据”才真正成为互联网信息技术行业的流行词汇。本章将简要介绍大数据处理相关的基本概念、技术、发展状况、应用及大数据面临的挑战。目录/Contents01020304大数据发展历程大数据的概念大数据的特征大数据的应用05大数据分析与处理方法简介06大数据面临的挑战大数据发展历程1.11.1大数据发展历程1.1.1萌芽阶段(1997-2006)1997年10月,迈克尔·考克斯和大卫·埃尔斯沃思发表了《为外存模型可视化而应用控制程序请求页面调度》的文章1999年8月,史蒂夫·布赖森、大卫·肯怀特等发表了《千兆字节数据集的实时性可视化探索》2000年10月,彼得·莱曼与哈尔·R·瓦里安在加州大学伯克利分校网站上发布了一项研究成果:《信息知多少?》2001年2月,梅塔集团分析师道格·莱尼发布了一份研究报告《3D数据管理:控制数据容量、处理速度及数据种类》2005年9月,蒂姆·奥莱利发表了《什么是Web2.0》1.1大数据发展历程1.1.2成熟阶段(2006-2012)2007年3月,约翰·F·甘茨、大卫·莱茵泽尔及互联网数据中心(IDC)《膨胀的数字宇宙:2010年世界信息增长预测》。2008年6月,思科发布了《思科视觉网络指数——预测与方法,2007-2012》2010年2月,肯尼斯·库克尔在《经济学人》上发表了一份关于管理信息的特别报告《数据,无所不在的数据》

2011年2月,马丁·希尔伯特和普里西拉·洛佩兹在《科学》杂志上发表了《世界存储、传输与计算信息的技术能力》一文1.1大数据发展历程1.1.2成熟阶段(2006-2012)2011年5月,全球知名咨询公司麦肯锡(McKinsey&Company)肯锡全球研究院(MGI)发布了——《大数据:创新、竞争和生产力的下一个新领域》2012年7月,联合国在纽约发布了关于大数据政务的白皮书1.1大数据发展历程1.1.3应用发展阶段(2012-至今)2012年,牛津大学教授维克托·迈尔-舍恩伯格(Viktor Mayer-Schnberger)在其畅销著作《Big Data: A Revolution That Will Transform How We Live,Work,and Think》2014年,Spark逐渐替代Mapreduce的地位,受到业界追捧。由于实时计算的需求,流式计算引擎开始出现,包括Storm、Flink、SparkStreaming。大数据存储和处理技术的发展同时也带动了数据分析、机器学习的蓬勃发展,也促使了新兴产业的不断涌现。大数据的概念1.21.2大数据的概念MervAdrian:大数据是一种在正常的时间和空间范围内,常规的软件工具难以计算、提出相关数据分析的能力。麦肯锡研究院:大数据指的是规模已经超出了传统的数据库软件工具收集、存储、管理和分析能力的数据集。美国国家标准技术研究(NIST):具有规模巨大(Volume)、种类繁多(Variety)、增长速度快(Velocity)和变化频率(Variability)的特征,且需要一个可扩展体系结构来有效存储、处理和分析的广泛的数据集。维基百科:巨量数据,或称为大数据、大资料,指的是所涉及的数据量规模巨大到无法通过当前的技术软件和工具在一定的时间内进行截取、管理、处理,并整理成为需求者所需要的信息进行决策1.2大数据的概念通过对关于大数据的定义进行梳理可以发现,大多研究机构和学者对大数据的定义普遍从数据的规模量,以及对于数据的处理方式来进行定义的,其基本共识为:大数据泛指无法在可容忍的时间内用传统信息技术和软硬件工具对其进行获取、管理和处理的巨量数据集合,具有海量性、多样性、时效性及可变性等特征,需要可伸缩的计算体系结构以支持其存储、处理和分析。大数据的特征1.31.3大数据的特征离线分析系统目前来说,大数据的特征还存在一定的争议。但按照普遍被接受的4V,即规模性(volume)、多样性(variety)、价值密度(value)和高速性(velocity)1.3大数据的特征离线分析系统1.3.1数据规模大(Volume)2012年12月IDC报告显示:2007年全球数据量为0.49ZB,2010年为1.3ZB,人类正式进入ZB时代。此外,在其报告对2005—2020年的数据进行了预测。指出在这其间,数字宇宙的规模将以350倍的量进行增长。预计2020年将突破35ZB,是2008年的70倍、2011年的29倍1.3大数据的特征离线分析系统1.3.2数据种类繁多(Variety)大数据种类更加复杂,其包括结构化数据、半结构化数据和非结构化数据。其中,10%是结构化数据,存储在数据库中;90%是非结构化数据,与人类信息密切相关。1.3大数据的特征离线分析系统1.3.4数据价值密度低(Value)如果将大数据比喻为石油行业的话,那么在大数据时代,重要的不是如何进行如何炼油(分析数据),而是如何获得优质原油(优质元数据)价值密度低,商业价值高大数据的应用1.41.4大数据的应用1.4.1互联网与电子商务行业用户信息记录用户行为分析基于大数据相关性分析的推荐系统网络营销分析网络运营分析1.4大数据的应用1.4.2大数据精准扶贫精准扶贫大数据平台以信息资源整合、比对、共享为重点,实现了地区多层级扶贫部门数据和管理的互通互联,是一个集辅助决策、计划、施策、监管、反馈于一体的动态平台系统,全面提升地区脱贫攻坚信息化建设水平。1.4大数据的应用1.4.3交通业交通流量分析与预测交通安全水平分析与预测道路环境监测与分析大数据分析与处理方法简介1.51.5大数据分析与处理方法简介1.5.1大数据分析的五个基本方面可视化分析(AnalyticVisualizations)数据挖掘算法(DataMiningAlgorithms)预测性分析能力(PredictiveAnalyticCapabilities)语义引擎(SemanticEngines)数据质量和数据管理(DataQualityandMasterDataManagement)1.5项目开发流程数据采集数据导入/预处理12数据统计/分析3数据挖掘41.5.2大数据处理流程大数据面临的挑战1.61.6大数据面临的挑战业务视角不同带来的挑战技术架构不同带来的挑战管理策略不同带来的挑战本章小结本章主要介绍了大数据发展的基本历程,介绍了大数据的基本概念和特征、大数据在不同行业的应用情况,以及大数据的分析与处理方法和基本流程,最后阐述了大数据面临的挑战。通过本章学习,希望大家掌握大数据的基本概念和分析处理流程,对大数据建立基本的感性认识。第2章分布式计算编程基础《大数据技术基础教程》学习目标/Target了解分布式系统及分布式计算架构了解分布式文件系统掌握CAP理论章节概述/

Summary随着使用传统计算机语言硬编码方式设计的HPC程序越来越不受青睐,Hadoop和Spark这样的分布式软件框架应运而生,推动了适用于大规模HPC系统的高效程序发展。受分布式计算原理的启发,诸如MapReduce这样的函数式编程语言模型可以通过Hadoop和Spark在HPC集群上轻易地实现。本章主要介绍分布式系统、分布式计算架构、分布式文件系统和CAP定理目录/Contents01020304分布式系统分布式计算架构分布式文件系统CAP定理分布式系统2.12.1分布式系统分布式系统是一种计算机网络化布局,各个(计算机)节点间的信息交流通过复杂的消息传递接口来实现。分布式系统主要用来处理那些往往需要几百台计算机协同才能处理和完成的数据集上的问题。多进程进程通信独立的地址空间2.1分布式系统在分布式系统的构建中,无论分布于各个地区还是建在同一座建筑物内,都要面对以下几个挑战。程序并发缺少中央时钟独立故障分布式计算架构2.22.2分布式计算架构分布式系统是分散在网络中多台机器上的复杂软件组件。这些系统需要进一步组织分工,以求其复杂性能够被理解。分层架构基于对象的架构数据中心架构基于事件的架构分布式文件系统2.32.3分布式文件系统离线分析系统2.3.1分布式文件系统需求分布式文件系统的发展已成为识别分布式服务设计中诸多挑战和陷阱的一个起点。在其发展的早期阶段,已经实现了访问透明和位置透明。性能、可扩展性、并发控制、容错和安全要求也在其后续开发阶段中得以满足。(1)透明性:

访问透明

位置透明

移动透明

性能透明

扩展透明2.3分布式文件系统离线分析系统2.3.1分布式文件系统需求(2)并发文件更新(3)文件复制(4)硬件的异构性(5)容错(6)一致性(7)安全性(8)效率性CAP定理2.42.4CAP定理CAP定理又称CAP原则,指的是在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partitiontolerance(分区容错性),最多只能同时三个特性中的两个,三者不可兼得.2.4.1CAP的定义Consistency(一致性):“allnodesseethesamedataatthesametime”,即更新操作成功并返回客户端后,所有节点在同一时间的数据完全一致,这就是分布式的一致性。一致性的问题在并发系统中不可避免,对于客户端来说,一致性指的是并发访问时更新过的数据如何获取的问题。从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。2.4.1CAP的定义Availability(可用性):可用性指“Readsandwritesalwayssucceed”,即服务一直可用,而且是正常响应时间。好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。2.4.1CAP的定义PartitionTolerance(分区容错性):即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。分区容错性要求能够使应用虽然是一个分布式系统,而看上去却好像是在一个可以运转正常的整体。比如现在的分布式系统中有某一个或者几个机器宕掉了,其他剩下的机器还能够正常运转满足系统需求,对于用户而言并没有什么体验上的影响。2.4.2CAP定理证明N1、N2正常运作N1和N2通信网络出现故障2.4.3取舍策略CAP三个特性只能满足其中两个,那么取舍的策略就共有三种:CAwithoutP:CPwithoutA:APwihtoutC:本章小结本章主要介绍了分布式计算编程的基础概念,包括分布式系统、分布式计算架构、分布式文件系统,以及CAP理论。通过对本章的学习,了解分布式编程的基本需求和解决方法,理解CAP理论的基本含义和取舍策略。以上相关理论将在后期的实践中得以印证。第三章大数据处理框架ApacheHadoop《大数据技术基础教程》学习目标/Target

掌握Hadoop的安装与使用

了解Hadoop简介

了解Hadoop生态系统章节概述/

SummaryApacheHadoop是一个开源的、可运行于大规模集群上的分布式计算平台,是大数据开发所使用的一个核心框架,它实现了分布式文件系统HDFS和MapReduce计算模型等功能,是一个允许使用简单编程模型跨计算机集群分布式处理大型数据集的系统。目录/Contents010203Hadoop简介Hadoop生态系统Hadoop的安装与使用Hadoop简介11.1Hadoop概述HDFS是针对谷歌文件系统GFS(GoogleFileSystem)的开源实现,是面向普通硬件环境的分布式文件系统,具有较高的读写速度、很好的容错性和可伸缩性,支持大规模数据的分布式存储分布式文件系统HDFSMapReduce是针对谷歌MapReduce的开源实现,允许用户在不了解分布式系统底层细节的情况下开发并行应用程序,采用MapReduce来整合分布式文件系统上的数据,可以保证分析和处理数据的高效性。分布式计算框架MapReduceHadoop1.2Hadoop发展简史Hadoop雏形开始于2002年的Apache的Nutch,Nutch是一个开源Java实现的搜索引擎。2003年Google发表了一篇技术学术论文谷歌文件系统(GFS)。GFS也就是googleFileSystem,google公司为了存储海量搜索数据而设计的专用文件系统。2004年Nutch创始人DougCutting基于Google的GFS论文实现了分布式文件存储系统名为NDFS。2004年Google又发表了一篇技术学术论文MapReduce:SimplifiedDataProcessingonLargeClusters。MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行分析运算。2005年DougCutting又基于MapReduce,在Nutch搜索引擎实现了该功能。1.2Hadoop发展简史2008年1月,Hadoop成为Apache顶级项目。2008年6月,Hadoop的第一个SQL框架——Hive成为了Hadoop的子项目。2010年5月,HBase脱离Hadoop项目,成为Apache顶级项目。2010年9月,Hive脱离Hadoop,成为Apache顶级项目。2010年9月,Pig脱离Hadoop,成为Apache顶级项目。2011年12月,Hadoop1.0.0版本发布,标志着Hadoop已经初具生产规模。2013年10月,Hadoop2.0.0版本发布。2017年12月,Hadoop3.0.0版本发布1.3Hadoop的特征(1)高可靠性(2)高可扩展性(3)高效性(4)高容错性(5)成本低(6)运行在Linux平台上(7)支持多种编程语言Hadoop生态系统22.1HDFS(Hadoop分布式文件系统)2.1HDFS(Hadoop分布式文件系统)1.Client:切分文件;访问HDFS;与NameNode交互,获取文件位置信息;与DataNode交互,读取和写入数据。2.NameNode:Master节点,在Hadoop1.X中只有一个,管理HDFS的名称空间和数据块映射信息,配置副本策略,处理客户端请求。3.DataNode:Slave节点,存储实际的数据,汇报存储信息给NameNode。4.SecondaryNameNode:辅助NameNode,分担其工作量;定期合并fsimage和edits,推送给NameNode;在紧急情况下,它可辅助恢复NameNode,但SecondaryNameNode并非NameNode的热备。2.2分布式计算框架MapReduceMapReduce是一种计算模型,用以进行大数据量的计算。MapReduce把整个并行运算过程高度抽象到两个函数上,一个是map,另一个是reduce。Map函数:map函数会将小的数据集转换为适合输入的<key,value>键值对的形式,然后处理成一系列具有相同key的<key,value>作为输出,我们可以把输出看做list(<key,value>)Reduce函数:reduce函数会把map函数的输出作为输入,然后提取具有相同key的元素进行操作,最后的输出结果也是<key,value>键值对的形式,并合并成一个文件。2.3资源管理框架Yarn2.3资源管理框架YarnHadoop2.x在原来的基础上引入了新的框架YARN(YetAnotherResourceNegotiator)。YARN的基本思想是将JobTracker的两个主要功能(资源管理和作业调度/监控)分离,主要方法是创建一个全局的ResourceManager(RM)和若干个针对应用程序的ApplicationMaster(AM)。这里的应用程序是指传统的MapReduce作业或作业的DAG(有向无环图)。2.4分布式列存数据库HBaseApacheHBase是一个开源的、分布式的、非关系型的列式数据库。HBase是一个针对结构化数据的可伸缩、高可靠、高性能、分布式和面向列的动态模式数据库。和传统关系数据库不同,HBase采用了BigTable的数据模型:增强的稀疏排序映射表(Key-Value)。HBase中保存的数据可以使用MapReduce来处理,它将数据存储和并行计算完美地结合在一起。2.4分布式列存数据库HBase2.5基于Hadoop的数据仓库HiveHive是一个基于Hadoop的数据仓库架构,使用SQL语句读、写和管理大型分布式数据集。Hive可以将SQL语句转化为MapReduce(或ApacheSpark和ApacheTez)任务执行,大大降低了Hadoop的使用门槛,减少了开发MapReduce程序的时间成本。2.5基于Hadoop的数据仓库HiveHive是一个基于Hadoop的数据仓库架构,使用SQL语句读、写和管理大型分布式数据集。Hive可以将SQL语句转化为MapReduce(或ApacheSpark和ApacheTez)任务执行,大大降低了Hadoop的使用门槛,减少了开发MapReduce程序的时间成本。2.6分布式协作服务Zookepper2.6分布式协作服务ZookepperZooKeeper是一个分布式应用程序协调服务,主要用于解决分布式集群中应用系统的一致性问题。ZooKeeper集群由一组服务器(Server)节点组成,在这些服务器节点中有一个节点的角色为Leader,其他节点的角色为Follower。2.7日志收集工具Flume2.7日志收集工具FlumeApacheFlume是一个分布式的、可靠和易用的日志收集系统,用于将大量日志数据从许多不同的源进行收集、聚合,最终移动到一个集中的数据中心进行存储。Flume中最小的独立运行单位是Agent,Agent是一个JVM进程,运行在日志收集节点(服务器节点),其包含三个组件——Source(源)、Channel(通道)和Sink(接收地)。数据可以从外部数据源流入到这些组件,然后再输出到目的地。2.8数据同步工具SqoopSqoop是一种用于在Hadoop和关系型数据库(RDBMS,如MySQL或Oracle)之间传输数据的工具。使用Sqoop可以批量将数据从关系型数据库导入到Hadoop分布式文件系统(HDFS)及其相关系统(如HBase和Hive)中,也可以把Hadoop文件系统及其相关系统中的数据导出到关系型数据库中。Hadoop的安装与使用33.1安装准备工作第一步,使用快捷键Ctrl+Alt+T打开终端;第二步,使用sudo-s-H或sudosu-root或sudosu进入root用户;第三步,创建一个名为Hadoop的用户,并使用/bin/bash作为Shell:sudouseradd-mHadoop-s/bin/bash第四步,将Hadoop用户的密码设为Hadoop,即用户名和密码相同,注意输入密码时终端不会显示所输密码:sudopasswdHadoop第五步,为Hadoop用户增加管理员权限,以方便部署:sudoadduserHadoopsudo第六步,注销当前系统登录账户,返回到Linux系统的登录界面,选择Hadoop用户并输入密码进行登录。3.2安装SSH在Linux的终端中执行以下命令:sudoapt-getinstallopenssh-server安装后,使用如下命令来登录本机:sshHadoop@localhost或sshlocalhost3.2安装SSH设置成SSH无密码登录:①输入命令logout或exit退出刚才的SSH,回到原来的终端窗口;②通过下列命令进入.ssh目录:cd~/.ssh/③通过下列命令生成公钥(id_rsa.pub)和私钥(id_rsa):ssh-keygen-trsa④通过下列命令讲公钥写入到~/.ssh/authorized_keys中:cat./id_rsa.pub>>./authorized_keys⑤执行sshlocalhost命令,发现无需密码就能直接登录了。3.2安装SSH设置成SSH无密码登录:①输入命令logout或exit退出刚才的SSH,回到原来的终端窗口;②通过下列命令进入.ssh目录:cd~/.ssh/③通过下列命令生成公钥(id_rsa.pub)和私钥(id_rsa):ssh-keygen-trsa④通过下列命令讲公钥写入到~/.ssh/authorized_keys中:cat./id_rsa.pub>>./authorized_keys⑤执行sshlocalhost命令,发现无需密码就能直接登录了。3.3安装Java环境1)在联网状态下,通过下列命令安装JDK:sudoapt-getinstalldefault-jredefault-jdk2)JDK的安装路径为/usr/lib/jvm/default-java;3)配置JAVA_HOME环境变量,在Linux终端输入下列命令打开当前登录用户的环境变量配置文件.bashrc:vim~/.bashrc在文件最前面添加如下单独一行(注意,等号=前后不能有空格),然后保存退出:exportJAVA_HOME=/usr/lib/jvm/default-java4)然后要让环境变量立即生效,执行如下命令:source~/.bashrc5)最后,检验一下是否安装正确:java-version3.4Hadoop安装配置及使用Hadoop包括3种安装模式:1)单机模式只在一台机器上运行,存储采用本地文件系统,没有采用分布式文件系统HDFS;2)伪分布式模式存储采用分布式文件系统HDFS,但是HDFS的名称节点和数据节点都在同一台机器上;3)分布式模式存储采用分布式文件系统HDFS,而且HDFS的名称节点和数据节点位于不同机器上。本教材主要介绍单机模式和伪分布式安装。3.4Hadoop安装配置及使用伪分布式模式配置:1)修改配置文件2)执行名称节点格式化3)启动Hadoop4)Hadoop无法正常启动的解决方法5)使用Web界面查看HDFS信息6)运行Hadoop伪分布式实例7)关闭Hadoop8)配置PATH变量本章小结本章主要介绍了大数据处理框架ApacheHadoop,包括Hadoop简介、Hadoop生态系统、Hadoop的安装与使用。通过本章的学习,希望大家能够了解Hadoop的特性、Hadoop的应用现状,后续我们将基于本章介绍的内容进行大数据技术的进一步学习。第四章分布式文件系统HDFS《大数据技术基础教程》学习目标/Target了解HDFS简介

理解HDFS设计原则理解HDFS核心概念掌握HDFS体系结构学习目标/Target

理解HDFS存储原理

掌握HDFS数据读写流程

掌握HDFS编程实现章节概述/

SummaryHadoop分布式文件系统(HadoopDistributedFileSystem,HDFS)是针对GFS的开源实现,它是Hadoop两大核心组成部分之一,提供了在廉价服务器集群中进行大规模分布式文件存储的能力。目录/Contents010203HDFS简介HDFS设计原则HDFS核心概念04HDFS体系结构目录/Contents050607HDFS存储原理HDFS数据读写流程HDFS编程实现HDFS简介11.1HDFS简介HDFS,是HadoopDistributedFileSystem的简称,是Hadoop抽象文件系统的一种实现。Hadoop抽象文件系统可以与本地系统、AmazonS3等集成,甚至可以通过Web协议(webhsfs)来操作。HDFS设计原则22.1设计目标(1)存储非常大的文件(2)采用流式的数据访问方式(3)运行于商业硬件上2.2HDFS不适合的应用类型(1)低延时的数据访问(2)大量小文件(3)多方读写,需要任意的文件修改HDFS核心概念33.1Blocks物理磁盘中有块的概念,磁盘的物理Block是磁盘操作最小的单元,读写操作均以Block为最小单元,一般为512Byte。HDFS的Block块比一般单机文件系统大得多,默认为128M。HDFS的文件被拆分成block-sized的chunk,chunk作为独立单元存储。比Block小的文件不会占用整个Block,只会占据实际大小。例如,如果一个文件大小为1M,则在HDFS中只会占用1M的空间,而不是128M。3.2Namenode&Datanode(1)NamenodeNamenode存放文件系统树及所有文件、目录的元数据。元数据持久化为2种形式:namespaceimage和editlog。HDFS针对单点故障提供了2种解决机制:1)备份持久化元数据2)SecondaryNamenode3.2Namenode&Datanode图4-2第二名称节点工作示意图3.2Namenode&Datanode(2)Datanode数据节点负责存储和提取Block,读写请求可能来自namenode,也可能直接来自客户端。数据节点周期性向Namenode汇报自己节点上所存储的Block相关信息。3.3BlockCachingDataNode通常直接从磁盘读取数据,但是频繁使用的Block可以在内存中缓存。默认情况下,一个Block只有一个数据节点会缓存。3.4HDFSFederationNameNode的内存会制约文件数量,HDFSFederation提供了一种横向扩展NameNode的方式。在Federation模式中,每个NameNode管理命名空间的一部分,例如一个NameNode管理/user目录下的文件,另一个NameNode管理/share目录下的文件。3.5HDFSHA(HighAvailability高可用性)当NameNode故障时,常规的做法是使用元数据备份重新启动一个NameNode。元数据备份可能来源于:多文件系统写入中的备份或者SecondNameNode的检查点文件。启动新的Namenode之后,需要重新配置客户端和DataNode的NameNode信息。HDFS体系结构44.1HDFS体系结构的优点(1)处理超大文件(2)流式的访问数据(3)运行在廉价的商用机器集群上4.2HDFS体系结构的缺点(1)不适合低延迟数据访问(2)无法高效存储小文件(3)不支持多用户写入及任意修改文件HDFS存储原理55.1数据的冗余存储(1)加快数据传输速度。当多个客户端需要同时访问同一个文件时,可以让各个客户端分别从不同的数据块副本中读取数据,这就大大加快了数据传输速度。(2)容易检查数据错误。HDFS的数据节点之间通过网络传输数据,采用多个副本可以很容易判断数据传输是否出错。(3)保证数据的可靠性。即使某个数据节点出现故障失效,也不会造成数据丢失。5.2数据的存取策略首先,HDFS将每一个文件的数据进行分块存储,同时每一个数据块又保存有多个副本,这些数据块副本分布在不同的机器节点上,这种数据分块存储+副本的策略是HDFS保证可靠性和性能的关键。HDFS采用一种称为机架感知的策略来改进数据的可靠性、可用性和网络带宽的利用率。在大多数情况下,副本系数是3,HDFS的存放策略是第一个副本放置在上传文件的DataNode服务器节点上,如果是在集群外提交,则随机放置在一个DataNode服务器节点上。第二个副本放置在与第一个DataNode不同的机架的一个节点上。第三个副本放置在与第二个DataNode相同的机架的不同节点上。5.3数据错误与恢复HDFS主要包括以下3种情形。(1)名称节点出错(2)数据节点出错(3)数据出错HDFS数据读写流程66.1读数据流程6.1读数据流程6.2写数据流程6.2写数据流程HDFS编程实现77.1HDFS常用shell命令7.2HDFSJavaAPI及应用(1)Maven项目的pom.xml文件的配置(2)例题中涉及的主要类Configuration:该类的对象封装了客户端或者服务器的配置FileSystem:FileSystem是HDFSJavaAPI的核心工具类,该类是一个抽象类,其中封装了很多操作文件的方法,使用这些方法可以很轻松地操作HDFS中的文件。(3)获取hdfs上文件属性的功能7.2HDFSJavaAPI及应用7.2HDFSJavaAPI及应用7.2HDFSJavaAPI及应用本章小结本章主要介绍了Hadoop分布式文件系统(HadoopDistributedFileSystem,HDFS),它是Hadoop两大核心组成部分之一,提供了在廉价服务器集群中进行大规模分布式文件存储的能力。包括HDFS简介、HDFS设计原则、HDFS核心概念、HDFS体系结构、HDFS存储原理、HDFS数据读写流程、HDFS编程实现。通过本章的学习,希望大家能够熟悉HDFS的相关内容,后续我们将基于本章介绍的内容进行大数据技术的进一步学习。第5章分布式数据库HBase《大数据技术基础教程》学习目标/Target掌握HBase的数据模型和系统架构掌握HBase的读写流程掌握HBase相关的shell命令和API编程章节概述/

SummaryHBase是目前非常热门的一款分布式KV(KeyValue,键值)数据库系统,无论是互联网行业,还是其他传统IT行业都在大量使用。尤其是近几年随着国内大数据理念的普及,HBase凭借其高可靠、易扩展、高性能以及成熟的社区支持,受到越来越多企业的青睐。许多大数据系统都将HBase作为底层数据存储服务本章将简要介绍HBase简介、HBase数据模型、HBase系统架构、HBase数据读写流程和HBase编程实践。目录/Contents01020304HBase简介HBase数据模型HBase系统架构HBase读写流程05HBase编程实践HBase简介5.15.1HBase简介5.1.1Hbase的发展及现状2003年Google在SOSP会议上发表了大数据历史上第一篇公认的革命性论文——《GFS:TheGoogleFileSystem》2004年,Google又发表了另一篇非常重要的论文——《MapReduce:SimplefiedDataProcessingonLargeClusters》2006年,Google发布了第三篇重要论文——《BigTable:ADistributedStorageSystemforStructuredData》,用于解决Google内部海量结构化数据的存储以及高效读写问题5.1HBase简介5.1.1Hbase的发展及现状Google的三篇论文论证了在大量廉价机器上存储、处理海量数据(结构化数据、非结构化数据)是可行的,遗憾的是,Yahoo并没有给出开源方案。2004年,DougCutting和MikeCafarella在为他们的搜索引擎爬虫(Nutch)实现分布式架构的时候看到了Google的上述两篇论文。他们在之后的几个月里按照论文,实现出一个简易版的HDFS和MapReduce,这也就是Hadoop的最早起源。5.1HBase简介5.1.2Hbase应用场景Facebook用户交互数据淘宝TLog小米云服务用户行为数据存储HBase数据模型5.25.2HBase数据模型5.2.1HBase逻辑视图NameSpace:命名空间,类似于关系型数据库的database概念,每个命名空间下有多个表,HBASE有两个自带的命名空间,分别是HBASE和default,HBASE中存放的是HBASE内置的表(系统内建表,包含namespace和meta表:存的是用户表或系统表位置信息),default表是用户默认的使用的命名空间(用户建表时未指定namespace的表都创建在此)。Region(表的切片):HBase表的分片,HBase表会根据RowKey值被切分成不同的region存储在RegionServer中,在一个RegionServer中可以有多个不同的region。5.2HBase数据模型5.2.1HBase逻辑视图table:表,一个表包含多行数据。row:行,在HBase表里,每一行数据代表一个数据对象,每一行都有一个行键(RowKey)来进行唯一标识(不可分割的字节数组,且按照字典排序[ASCII码]由低到高存储),每一行都有一个rowkey和多个column(列)组成。在HBase中针对行键建立索引,提高检索数据的速度。5.2HBase数据模型5.2.1HBase逻辑视图column:列,与关系型数据库中的列不同,HBase中的column由columnfamily(列簇)以及qualifier(列名)两部分组成,两者中间使用":"相连。比如contents:html,其中contents为列簇,html为列簇下具体的一列。columnfamily在表创建的时候需要指定,用户不能随意增减。一个columnfamily下可以设置任意多个qualifier,因此可以理解为HBase中的列可以动态增加,理论上甚至可以扩展到上百万列。5.2HBase数据模型5.2.1HBase逻辑视图Store:每一个region有一个或多个store组成,至少有一个store,hbase会把一起访问的数据放在一个store里面,即为每个ColumnFamily建一个store(即有几个ColumnFamily,也就有几个Store)。一个Store由一个memStore、0或多个StoreFile组成。5.2HBase数据模型5.2.1HBase逻辑视图timestamp:时间戳,每个cell在写入HBase的时候都会默认分配一个时间戳作为该cell的版本,当然,用户也可以在写入的时候自带时间戳。HBase支持多版本特性,即同一rowkey、column下可以有多个value存在,这些value使用timestamp作为版本号,版本越大,表示数据越新。cell:单元格,由五元组(row,column,timestamp,type,value)组成的结构,其中type表示Put/Delete这样的操作类型,timestamp代表这个cell的版本。这个结构在数据库中实际是以KV结构存储的,其中(row,column,timestamp,type)是K,value字段对应KV结构的V。5.2HBase数据模型5.2.1HBase逻辑视图HBase引入了列簇的概念,列簇下的列可以动态扩展。另外,HBase使用时间戳实现了数据的多版本支持5.2HBase数据模型5.2.1HBase逻辑视图HBase是一个多维、稀疏、排序的表。多维:HBase中的Map与普通Map最大的不同在于,key是一个复合数据结构,由多维元素构成,包括rowkey、columnfamily、qualifier、type以及timestamp。稀疏:在其他数据库中,对于空值的处理一般都会填充null,而对于HBase,空值不需要任何填充。这个特性为什么重要?因为HBase的列在理论上是允许无限扩展的,对于成百万列的表来说,通常都会存在大量的空值,如果使用填充null的策略,势必会造成大量空间的浪费。因此稀疏性是HBase的列可以无限扩展的一个重要条件。5.2HBase数据模型5.2.1HBase逻辑视图HBase是一个多维、稀疏、排序、分布式存储的表。排序:构成HBase的KV在同一个文件中都是有序的,但规则并不是仅仅按照rowkey排序,而是按照KV中的key进行排序—先比较rowkey,rowkey小的排在前面;如果rowkey相同,再比较column,即columnfamily:qualifier,column小的排在前面;如果column还相同,再比较时间戳timestamp,即版本信息,timestamp大的排在前面。这样的多维元素排序规则对于提升HBase的读取性能至关重要,在后面读取章节会详细分析。分布式:构成HBase的所有Map并不集中在某台机器上,而是分布在整个集群中。5.2HBase数据模型5.2.2HBase物理视图与大多数数据库系统不同,HBase中的数据是按照列簇存储的,即将数据按照列簇分别存储在不同的目录中。列簇anchor的所有数据存储在一起形成5.2HBase数据模型5.2.2HBase物理视图与大多数数据库系统不同,HBase中的数据是按照列簇存储的,即将数据按照列簇分别存储在不同的目录中。列簇contents的所有数据存储在一起形成:5.2HBase数据模型5.2.3行式存储、列式存储、列簇式存储为什么HBase要将数据按照列簇分别存储?行式存储:行式存储系统会将一行数据存储在一起,一行数据写完之后再接着写下一行,最典型的如MySQL这类关系型数据库5.2HBase数据模型5.2.3行式存储、列式存储、列簇式存储为什么HBase要将数据按照列簇分别存储?列式存储:列式存储理论上会将一列数据存储在一起,不同列的数据分别集中存储,最典型的如Kudu、ParquetonHDFS等系统(文件格式)5.2HBase数据模型5.2.3行式存储、列式存储、列簇式存储为什么HBase要将数据按照列簇分别存储?列簇式存储:从概念上来说,列簇式存储介于行式存储和列式存储之间,可以通过不同的设计思路在行式存储和列式存储两者之间相互切换。比如,一张表只设置一个列簇,这个列簇包含所有用户的列。HBase中一个列簇的数据是存储在一起的,因此这种设计模式就等同于行式存储。再比如,一张表设置大量列族,每个列簇下仅有一列,很显然这种设计模式就等同于列式存储。HBase系统架构5.35.3HBase系统架构离线分析系统HBase体系结构借鉴了BigTable论文,是典型的Master-Slave模型。系统中有一个管理集群的Master节点以及大量实际服务用户读写的RegionServer节点。除此之外,HBase中所有数据最终都存储在HDFS系统中,这与BigTable实际数据存储在GFS中相对应;系统中还有一个ZooKeeper节点,协助Master对集群进行管理。5.3HBase系统架构5.3.1ClientHBase客户端(Client)提供了Shell命令行接口、原生JavaAPI编程接口、Thrift/RESTAPI编程接口以及MapReduce编程接口。HBase客户端支持所有常见的DML操作以及DDL操作,即数据的增删改查和表的日常维护等。其中Thrift/RESTAPI主要用于支持非Java的上层业务需求,MapReduce接口主要用于批量数据导入以及批量数据读取。5.3HBase系统架构5.3.2ZookeeperZooKeeper(ZK)也是ApacheHadoop的一个顶级项目,基于Google的Chubby开源实现,主要用于协调管理分布式应用程序。在HBase系统中,ZooKeeper扮演着非常重要的角色。实现Master高可用管理系统核心元数据

参与RegionServer宕机恢复。实现分布式表锁5.3HBase系统架构5.3.3HMasteHBase集群中有若干台计算机,其中有一台是“主机(Master)”,其余的都是“从机(Slaver)”。一般在生产系统中,还会有一台“备用主机(backupmaster)”。这个HMaster进程,就是运行在“主机”上的。准确的说,应该是HMaster在哪一台计算机上运行,哪一台计算机就是“主机”.

分发Region

监控HRegionServer

管理元数据5.3HBase系统架构5.3.4HRegeionServeRegionServer主要用来响应用户的IO请求,是HBase中最核心的模块,由WAL(HLog)、BlockCache以及多个Region构成.WAL(HLog):HLog在HBase中有两个核心作用:其一,用于实现数据的高可靠性,HBase数据随机写入时,并非直接写入HFile数据文件,而是先写入缓存,再异步刷新落盘。为了防止缓存数据丢失,数据写入缓存之前需要首先顺序写入HLog,这样,即使缓存数据丢失,仍然可以通过HLog日志恢复;其二,用于实现HBase集群间主从复制,通过回放主集群推送过来的HLog日志实现主从复制。5.3HBase系统架构5.3.4HRegeionServeRegionServer主要用来响应用户的IO请求,是HBase中最核心的模块,由WAL(HLog)、BlockCache以及多个Region构成.BlockCache:HBase系统中的读缓存。客户端从磁盘读取数据之后通常会将数据缓存到系统内存中,后续访问同一行数据可以直接从内存中获取而不需要访问磁盘。对于带有大量热点读的业务请求来说,缓存机制会带来极大的性能提升。5.3HBase系统架构5.3.4HRegeionServeRegion:数据表的一个分片,当数据表大小超过一定阈值就会“水平切分”,分裂为两个Region。Region是集群负载均衡的基本单位。通常一张表的Region会分布在整个集群的多台RegionServer上,一个RegionServer上会管理多个Region,当然,这些Region一般来自不同的数据表。HBase表结构设计5.45.4HBase表结构设计5.4.1命名空间设计针对hbase使用较多数据量较大的业务,可以将数据放在单独的namespace中单独管理,入库的时候tablename使用namespace:tablename的方式来处理。针对hbase使用较少数据量较少的业务,可以将数据放在default的namespace中统一管理,入库的时候直接单独使用tablename方式来处理。5.4HBase表结构设计5.4.2rowkey设计rowkey设计根本上还是需要解决或者避免可能出现的各种问题getorscan?如何避免数据热点?如何优化HBase硬盘占用量?对于时序数据,如何能快速的取到最新一条?5.4HBase表结构设计5.4.2rowkey设计table预分区

按照Hash对table进行预分区

按照业务标识字段进行预分区Rowkey尽可能设计的短

Rowkey最大长度64kb,但是实际应用中一般为10-100bytes5.4HBase表结构设计5.4.3列族设计列族是设计是在建表阶段需要完成的,也是表属性需要集中配置的维度,主要有下面的内容供参考:(1)VERSIONS(2)BLOOMFILTER(3)TTL(TimeToLive)(4)COMPRESSION&DATA_BLOCK_ENCODING(5)BLOCKSIZE(6)DFS_REPLICATION(7)IN_MEMORY5.4HBase表结构设计5.4.4列设计由于HBase是弱schema的结构,所以列相关的配置不在建表时指定,而是在数据写入的时候自动指定。而HBase的稀疏存储更是支持业务上定义大量的列,然后查询的时候指定列名进行精确查询,取到需要的数据。这种设计很符合HBase的特点以及设计理念。但是按照上文所说,HBase底层是按照cell存储的,cell的越多,rowkey以及columnfamily的冗余存储就越大,浪费了缓存资源和硬盘资源,所以给出的建议是在充分发挥HBase的特点的同时尽量减少列的数量。HBase数据读写流程5.55.5HBase数据读写流程5.5.1HBase数据写流程(1)客户端处理阶段:客户端将用户的写入请求进行预处理,并根据集群元数据定位写入数据所在的RegionServer,将请求发送给对应的RegionServer。(2)Region写入阶段:RegionServer接收到写入请求之后将数据解析出来,首先写入HLog,再写入对应Region列簇的MemStore。(3)MemStoreFlush阶段:当Region中MemStore容量超过一定阈值,系统会异步执行flush操作,将内存中的数据写入文件,形成HFile。5.5HBase数据读写流程5.5.1HBase数据写流程HBase写入流程5.5HBase数据读写流程5.5.2HBase数据读流程首先从ZooKeeper中读取-ROOT-表所在的RegionServer然后从该HRegionServer中根据请求的TableName,RowKey读取.META.表所在的HRegionServer最后从该HRegionServer中读取.META.表的内容而获取此次请求需要访问的HRegion所在的位置,然后访问该HRegionServer获取请求的数据三层寻址5.5HBase数据读写流程5.5.2HBase数据读流程(1)用户通过查找zk(zookeeper)的/hbase/meta-region-server节点查询哪台RegionServer上有hbase:meta表。(2)客户端连接含有hbase:meta表的RegionServer。Hbase:meta表存储了所有Region的行键范围信息,通过这个表就可以查询出你要存取的rowkey属于哪个Region的范围里面,以及这个Region又是属于哪个RegionServer。5.5HBase数据读写流程5.5.2HBase数据读流程(3)获取这些信息后,客户端就可以直连其中一台拥有你要存取的rowkey的RegionServer,并直接对其操作。(4)客户端会把meta信息缓存起来,下次操作就不需要进行以上加载HBase:meta的步骤了。HBase编程实践5.65.6HBase编程实践5.6.1HBase常用shell命令HBaseShell常用命令命名描述语法help‘命名名’查看命令的使用描述help‘命令名’whoami我是谁whoamiversion返回hbase版本信息versionstatus返回hbase集群的状态信息statustable_help查看如何操作表table_helpcreate创建表create‘表名’,‘列族名1’,‘列族名2’,‘列族名N’alter修改列族添加一个列族:alter‘表名’,‘列族名’删除列族:alter‘表名’,{NAME=>‘列族名’,METHOD=>‘delete’}5.6HBase编程实践5.6.1HBase常用shell命令HBaseShell常用命令命名描述语法describe显示表相关的详细信息describe‘表名’list列出hbase中存在的所有表listexists测试表是否存在exists‘表名’put添加或修改的表的值

put‘表名’,‘行键’,‘列族名’,‘列值’put‘表名’,‘行键’,‘列族名:列名’,‘列值’scan通过对表的扫描来获取对用的值scan‘表名’扫描某个列族:scan‘表名’,{COLUMN=>‘列族名’}扫描某个列族的某个列:scan‘表名’,{COLUMN=>‘列族名:列名’}查询同一个列族的多个列:scan‘表名’,{COLUMNS=>[‘列族名1:列名1’,‘列族名1:列名2’,…]}get获取行或单元(cell)的值get‘表名’,‘行键’

get‘表名’,‘行键’,‘列族名’count统计表中行的数量count‘表名’5.6HBase编程实践5.6.1HBase常用shell命令HBaseShell常用命令命名描述语法incr增加指定表行或列的值incr‘表名’,‘行键’,‘列族:列名’,步长值get_counter获取计数器get_counter‘表名’,‘行键’,‘列族:列名’delete删除指定对象的值(可以为表,行,列对应的值,另外也可以指定时间戳的值)删除列族的某个列:delete‘表名’,‘行键’,‘列族名:列名’deleteall删除指定行的所有元素值deleteall‘表名’,‘行键’truncate重新创建指定表truncate‘表名’enable使表有效enable‘表名’is_enabled是否启用is_enabled‘表名’disable使表无效disable‘表名’is_disabled是否无效is_disabled‘表名’drop删除表drop的表必须是disable的5.6HBase编程实践5.6.2HBase常用JavaAPI及示例HBase提供了丰富的JavaAPI接口供用户使用,可以通过HBaseJavaAPI完成和HBaseShell相同的功能。(1)连接HBaseJava连接HBase需要两个类:HBaseConfiguration和ConnectionFactory

Configurationconfig=HBaseConfiguration.create();

//使用create()静态方法就可以得到Configuration对象通过ConnectionFactory(连接工厂)的方法我们就能获取到Connection(连接对象)了。具体用法:Connectionconnection=ConnectionFactory.createConnection(config);//config为前文的配置对象5.6HBase编程实践5.6.2HBase常用JavaAPI及示例(2)创建表TableNametableName=TableName.valueOf("test");//定义表名//TableDescriptor对象通过TableDescriptorBuilder构建;TableDescriptorBuildertableDescriptor=TableDescriptorBuilder.newBuilder(tableName);ColumnFamilyDescriptorfamily=ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();//构建列族对象tableDescriptor.setColumnFamily(family);//设置列族admin.createTable(tableDescriptor.build());//创建表5.6HBase编程实践5.6.2HBase常用JavaAPI及示例(3)添加数据Tabletable=connection.getTable(tableName);//获取Table对象try{byte[]row=Bytes.toBytes("row1");//定义行Putput=newPut(row);//创建Put对象byte[]columnFamily=Bytes.toBytes("data");//列簇byte[]qualifier=Bytes.toBytes(String.valueOf(1));//列byte[]value=Bytes.toBytes("张三丰");//值put.addColumn(columnFamily,qualifier,value);table.put(put);//向表中添加数据}finally{//使用完了要释放资源table.close();}5.6HBase编程实践5.6.2HBase常用JavaAPI及示例(4)获取指定行的数据Getget=newGet(Bytes.toBytes("row1"));//定义get对象Resultresult=table.get(get);//通过table对象获取数据System.out.println("Result:"+result);//很多时候我们只需要获取“值”这里表示获取data:1列族的值byte[]valueBytes=result.getValue(Bytes.toBytes("data"),Bytes.toBytes("1"));//获取到的是字节数组//将字节转成字符串StringvalueStr=newString(valueBytes,"utf-8");System.out.println("value:"+valueStr);5.6HBase编程实践5.6.2HBase常用JavaAPI及示例(5)扫描表中的数据1. Scanscan=newScan();2. ResultScannerscanner=table.getScanner(scan);3. try{4. for(ResultscannerResult:scanner){5. System.out.println("Scan:"+scannerResult);6. byte[]row=scannerResult.getRow();7. System.out.println("rowName:"+newString(row,"utf-8"));8. }9. }finally{10. scanner.close();11. }5.6HBase编程实践5.6.2HBase常用JavaAPI及示例(6)删除表TableNametableName=TableName.valueOf("test");admin.disableTable(tableName);//禁用表admin.deleteTable(tableName);//删除表本章小结本章简要介绍了NoSQL数据库HBase的发展现状和应用场景,详细介绍了HBase的数据模型、系统架构、表的结构设计以及HBase的读写流程等基本理论知识,最后介绍了HBase的shell编程命令和主要的JavaAPI使用。通过本章的学习,主要掌握HBase的基本理论知识,并能够解决简单的对数据CRUD的操作。第六章分布式计算框架MapReduce《大数据技术基础教程》学习目标/Target了解MapReduce简介

理解MapReduce计算模型理解MapReduce工作原理掌握MapReduce编程实践章节概述/

SummaryMapReduce是Hadoop的一个核心组成框架,使用该框架编写的应用程序能够以一种可靠的、容错的方式并行处理大型集群(数千个节点)上的大量数据(TB级别以上),也可以对大数据进行加工、挖掘和优化等处理。目录/Contents010203MapReduce简介MapReduce计算模型MapReduce工作原理04MapReduce编程实践MapReduce简介11.1MapReduce简介Hadoop的MapReduce核⼼技术起源于⾕歌在2004年发表的关于MapReduce系统的论⽂介绍。Hadoop实现了Google的MapReduce编程模型,提供了简单易用的编程接口,也提供了它自己的分布式文件系统HDFS,与Google不同的是,Hadoop是开源的,任何人都可以使用这个框架来进行并行编程。MapReduce将复杂的、运行于大规模集群上的并行计算过程高度地抽象到了两个函数:Map和Reduce。概念“Map(映射)”和“Reduce(归约)”,以及它们的主要思想,都是从函数式编程语言里借来的,同时包含了从矢量编程语言里借来的特性。MapReduce计算模型22.1MapReduce计算模型在Hadoop中,用于执行计算任务(MapReduce任务)的机器有两个角色:一个是JobTracker,一个是TaskTracker,前者用于管理和调度工作,后者用于执行工作。每次计算任务都可以分为两个阶段,Map阶段和Reduce阶段。其中,Map阶段接收一组键值对模式<key,Value>的输入并产生同样是键值对模式的另一个或一批<key,Value>的中间输出;Reduce阶段负责接收Map产生的中间输出<key,Value>,然后对这个结果进行处理并输出结果。2.1MapReduce计算模型MapReduce工作原理33.11.x架构MapReduce1.x采用Master/Slave架构,由全局唯一的Jobtracker和多个TaskTacker组成,并且在Client中提供一系列的api供编程和管理使用。3.11.x架构MapReduce的完整流程为:第一步:读取文件,解析成为<key,value>对;第二步:自定义map逻辑接收<k1,v1>,转换成为新的<k2,v2>输出;第三步:分区Partition。将相同key的数据发送到同一个reduce里面去;第四步:排序,map阶段分区内的数据进行排序;第五步:combiner。调优过程,对数据进行map阶段的合并;第六步:将环形缓冲区的数据进行溢写到本

温馨提示

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

评论

0/150

提交评论