Hadoop数据库
第一单元举例说明Hadoop生态系统中的开源大数据项目至少五个您的答案 1.Ambari它是一个基于Web的工具用于配置、管理和监控Hadoop。 2.Submarine它是一个智能化平台允许用户利用该平台在分布式集群中进行机器学习和深度学习的工作。 3.HBase他是一个基于Hadoop的分布式数据库和传统的数据库不同HBase采用了BigTable的数据模型。 4.Hive它是一个数据仓库工具可以将结构化的数据文件映射为一张数据表并提供类SQL的查询语言HiveQL对数据表进行查询操作。 5.Pig它是一个基于Hadoop的大规模数据分析平台他提供的SQL-LIKE语言是一个类SQl语言。 6.Mahout他是一个机器学习的算法库他提供了一些机器学习领域的经典算法。第三单元1.简要说明HDFS的架构NameNode NameNode是HDFS集群的名称节点通常称为主节点。管理文件系统的命名空间例如打开文件、删除文件、重命名文件、创建目录等处理客户端对文件的读写请求维护HDFS的元数据维护和管理DataNode并协调DataNode为客户端发起的读写请求提供服务DataNode DataNode是HDFS集群中的数据节点通常称为从节点存储Block根据NameNode的指令对Block进行创建、复制、删除等操作定期向NameNode汇报自身存储的Block列表及健康状态负责为客户端发起的读写请求提供服务SecondaryNameNode SecondaryNameNode是HDFS集群的辅助节点定期从NameNode复制Fsimage文件以及合并Edits文件并将合并结果发送给NameNode辅助NameNode合并Fsimage文件和Edits文件可以作为NameNode的冷备份即当NameNode无法使用的时候可以通过获取SecondaryNameNode中保存的Fsimage文件和Edits文件来恢复NameNode的数据和运行状态。2.简要说明HDFS的写流程客户端发起上传文件到指定目录的请求与nameNode建立通信NameNode检查客户端是否有上传文件的权限以及文件是否存在。若通过检查则通知客户端上传文件并向其发送分块策略客户端根据分块策略对文件进行切分形成三个block分别是bk1bk2bk3客户端向NameNode请求上传第一个blockNameNode根据副本机制和机架感知向客户端返回可上传bk1的DataNode列表hadoop1Hadoop2hadoop3客户端从NameNode接收到bk1上传的DataNode列表之后首先根据就近原则从DataNode列表中选择一台DataNode并与之建立管道用于传输数据然后hadoop1会与第二台DataNode建立管道最后hadoop2会与第三台DataNode建立管道首先3向2汇报管道建立成功2向1汇报管道建立成功最后1向客户端汇报管道建立成功此时客户端与所有DataNode列表中的所有DataNode都建立了管道客户端开始传输bk1传输过程以流式写入的方式实现bk1上传完成后3向2发送bk1写入成功的消息2向1发送bk1写入成功的信息最后1向客户端发送bk1写入成功的消息客户端成功上传bk1之后重复4-9的流程依次上传其他block最终完成文件的上传3.简要说明HDFS的读流程客户端发起读取文件的请求与nameNode建立通信NameNode检查客户端是否有读取文件的权限以及文件是否存在。若通过检查则通知客户端读取文件并向发送文件的block列表该列表中记录了每个block及其副本所在DataNode的地址客户端按照就近原则从NameNode返回的block列表读取Block。首先客户端从Block列表中选择距离自身最近的DataNode读取Block如果该DataNode可以读取文件的所有Block则结束读取反之则客户端继续从Block列表中选择距离自身最近的DataNode读取Block直至读取文件的全部Block才结束读取客户端将读取的所有Block按照顺序进行合并最终形成目标文件。第四单元1.请简述YARN的工作流程客户端向 ResourceManager 发送提交应用程序的请求同时 ResourceManager 启动一个 ApplicationMaster负责管理该应用程序。ResourceManager 在集群中寻找合适的 NodeManager并向指定的 NodeManager 发送启动 ApplicationMaster 的请求。NodeManager 根据客户端提交应用程序时携带的参数在本地完善ApplicationMaster依赖的资源资源完善后,NodeManager 启动 ApplicationMaster。ApplicationMaster 启动后会向 ApplicationManager 进行注册并向 Scheduler 申请所需的资源此时根据每个 NodeManager 的资源使用情况向 ApplicationMaster 分配资源ApplicationManager根据申请的资源在指定的NodeManager 启动 Container。ApplicationMaster 向启动 Container 的 NodeManager 发送请求要求 Container 启动任务。NodeManager 接收请求后同样根据任务的相关参数在本地完善任务依赖的资源然后在 Container 中启动任务。应用运行结束后ApplicationMaster 向 ResourceManager申请注销自己以释放资源。如果 ApplicationMaster 因故障而导致任务失败那么 ResourceManager 中的应用程序管理器会将其重新启动,直到所有任务执行完毕。2.请描述YARN的组成及其各自的职责ResourceManager ResourceManager是一个全局资源管理系统可以看作YARN集群的主节点负责整个集群资源的监控、分配和管理。ResourceManager还负责与客户端交互、处理客户端请求监控NodeManager的健康状态。NodeManager NodeManager可以看作YARN集群的从节点负责管理与使用自身从节点的资源主要功能包含以下内容监控本节点的资源使用情况和每个Container的运行情况并向ResourceManager汇报。接收来自ResourceManager的请求为ApplicationMaster的某个任务分配Container。周期性地向ResourceManager汇报自身的健康状态。接收来自ApplicationMaster的请求以启动或停止Container。ApplicationMaster 它负责与ResourceManager协调获取其运行所需的资源除此之外ApplicationMaster还包含以下功能根据申请的资源为内部运行的任务分配资源。负责监控所有任务的运行状态并在任务运行失败时重新为任务申请资源以重启任务。负责与NodeManager进行通信获取Container以启动任务。Container Container可以看作YARN的资源单位封装了某个从节点的多维度资源包括内存、CPU、磁盘、网络等。第五单元简要说明ZooKeeper的集群架构角色并描述其职责1.Leader Leader是ZooKeeper集群的核心每个Zookeeper集群中只能有一个Leader处理客户端发送的事务请求并将事务请求广播到所有Follower以保证处理事务请求的顺序一致性。为了确保Follower可以检测到Leader的存在Leader会与Follower同步状态信息。 2.Follower Follower可以看作Leader的跟随者每个ZooKeeper集群中可以包含多个Follower它的作用主要有下面4点处理客户端发送的非事务请求。将客户端发送的事务请求转发给Leader。参与事务请求投票参与Leader选举投票如果当前Leader宕机则所有的Follower会重新投票选举出一个新的Leader。 3.Observer Observer可以看作Leader的观察者每个ZooKeeper集群中可以包含多个Observer负责同步Leader的数据处理客户端发送的非事务请求并将事务请求转发给Leader通常用于在不影响集群事务请求处理能力的前提下提升集群的非事务请求处理能力。需要注意的是Observer不参与任何形式的投票。第七单元简述Hive与MySQL的区别您的答案查询语言不同HIve使用HIveQLHQL、而MySQL使用SQL数据存储位置不同HIve存储在HDFS中MySQL存储在本地文件系统中数据格式不同HIve的数据格式由用户定义MySQL的数据格式由系统决定数据更新不同HIve数据更新较稀疏MySQL较密集执行延迟不同Hive的执行延迟高MySQL的执行延迟低可扩展性不同HIve的可扩展性高MySQL的低数据规模不同HIve的数据规模大MySQL的小Hivesql进入数据库 use database_name查看当前数据库下所有表 show tables查看某个数据库下所有表 show tables in db_name查看表结构 desc table_name向表中插入数据 insert into table_name values(value1,value2,...)增加一个新列 alter table test add columns (new_column data_type comment a comment)查看表数据 select * from table_name创建一张类似表 table_name 结构的表 table_name1 create table table_name1 like table_name表的重命名 alter table table_name rename to table_name1删除表 drop table_name7.4创建数据库hadoop_hive并通过location参数指定数据库路径create database hadoop_hive location /home/ubuntu/db/hadoop_hive;使用数据库hadoop_hiveuse hadoop_hive;分别创建员工表emp学号如emp001和部门表dept学号如dept001并导入数据员工表的创建与数据导入create table emp001(empno int,ename string,job string,mgr int,hiredate string,sal int,comm int,deptno int) row format delimited fields terminated by ,; load data inpath /001/hive/emp.csv into table emp001;部门表的创建与数据导入create table dept001(deptno int,dname string,loc string) row format delimited fields terminated by ,; load data inpath /001/hive/dept.csv into table dept001;根据员工的部门号创建分区表名emp_part学号如:emp_part001create table emp_part001(empno int,ename string,job string,mgr int,hiredate string,sal int,comm int)partitioned by (deptno int)row format delimited fields terminated by ,;往分区表中插入数据指明导入的数据的分区通过子查询导入数据insert into table emp_part001 partition(deptno10) select empno,ename,job,mgr,hiredate,sal,comm from emp001 where deptno10; insert into table emp_part001 partition(deptno20) select empno,ename,job,mgr,hiredate,sal,comm from emp001 where deptno20; insert into table emp_part001 partition(deptno30) select empno,ename,job,mgr,hiredate,sal,comm from emp001 where deptno30;查询分区表select * from emp_part001;创建一个桶表表名emp_bucket学号如:emp_bucket001根据员工的职位job进行分桶create table emp_bucket001(empno int,ename string,job string,mgr int,hiredate string,sal int,comm int,deptno int)clustered by (job) into 4 buckets row format delimited fields terminated by ,;通过子查询插入数据insert into emp_bucket001 select * from emp001;查询命令练习查询员工信息工号、姓名和薪水select empno,ename,sal from emp001;多表查询select dept001.dname,emp001.ename from emp001,dept001 where emp001.deptnodept001.deptno;做报表根据职位给员工涨工资,把涨前、涨后的薪水显示出来PRESIDENT1000MANAGER800其他400select empno,ename,job,sal,case job when PRESIDENT then sal1000 when MANAGER then sal800 else sal400 end from emp001;四种表(1)创建内部表创建一个名为DB的数据库create database if not exists DB;进入数据库DBuse DB;在数据库DB中创建一个名为cat的内部表有两个字段cat_id和cat_name数据类型为stringcreate table if not exists cat(cat_id string, cat_name string);展示数据库DB中所有的表查看cat表是否创建成功show tables;(2)创建外部表创建一个外部表cat2有两个字段分别为cat_id和cat_name数据类型为stringcreate external table if not exists cat2(cat_id string, cat_name string);展示数据库DB中所有的表查看cat2表是否创建成功show tables;外部表较内部表而言只是在create后添加了一个external(3)创建分区表创建分区在数据库DB中创建一个分区表goods包含goods_id和goods_status两个字段数据类型为string分区为cat_id数据类型为string以“\t”为分隔符create table goods(goods_id string, goods_status string) partitioned by (cat_id string) row format delimited fields terminated by \t;查看goods表结构desc goods;(4)创建桶表创建一个名为goods_t的表包含两个字段goods_id和goods_status数据类型为string按cat_id string进行分区按goods_status列聚类和goods_id排序划分成两个桶create table goods_t(goods_id string, goods_status string) partitioned by (cat_id string) clustered by(goods_status) sorted by (goods_id) into 2 buckets;查看goods_t表的结构desc goods_t;