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的架构

  1. NameNode NameNode是HDFS集群的名称节点,通常称为主节点。

    1. 管理文件系统的命名空间,例如打开文件、删除文件、重命名文件、创建目录等

    2. 处理客户端对文件的读写请求

    3. 维护HDFS的元数据

    4. 维护和管理DataNode,并协调DataNode为客户端发起的读写请求提供服务

  2. DataNode DataNode是HDFS集群中的数据节点,通常称为从节点

    1. 存储Block

    2. 根据NameNode的指令对Block进行创建、复制、删除等操作

    3. 定期向NameNode汇报自身存储的Block列表及健康状态

    4. 负责为客户端发起的读写请求提供服务

  3. SecondaryNameNode SecondaryNameNode是HDFS集群的辅助节点

    1. 定期从NameNode复制Fsimage文件,以及合并Edits文件,并将合并结果发送给NameNode,辅助NameNode合并Fsimage文件和Edits文件

    2. 可以作为NameNode的冷备份,即当NameNode无法使用的时候,可以通过获取SecondaryNameNode中保存的Fsimage文件和Edits文件,来恢复NameNode的数据和运行状态。

2.简要说明HDFS的写流程

  1. 客户端发起上传文件到指定目录的请求,与nameNode建立通信

  2. NameNode检查客户端是否有上传文件的权限,以及文件是否存在。若通过检查,则通知客户端上传文件,并向其发送分块策略

  3. 客户端根据分块策略,对文件进行切分,形成三个block,分别是bk1,bk2,bk3

  4. ==客户端向NameNode请求上传第一个block==

  5. NameNode根据==副本机制和机架感知==向客户端返回可上传bk1的DataNode列表,hadoop1,Hadoop2,hadoop3

  6. 客户端从NameNode接收到bk1上传的DataNode列表之后,首先根据就近原则从DataNode列表中选择一台DataNode并与之建立管道,用于传输数据,然后hadoop1会与第二台DataNode建立管道,最后hadoop2会与第三台DataNode建立管道

  7. 首先3向2汇报管道建立成功,2向1汇报管道建立成功,最后1向客户端汇报管道建立成功,此时客户端与所有DataNode列表中的所有DataNode都建立了管道

  8. 客户端开始传输bk1,传输过程以流式写入的方式实现

  9. bk1上传完成后,3向2发送bk1写入成功的消息,2向1发送bk1写入成功的信息,最后1向客户端发送bk1写入成功的消息

  10. 客户端成功上传bk1之后,重复4-9的流程,依次上传其他block最终完成文件的上传

3.简要说明HDFS的读流程

  1. 客户端发起读取文件的请求,与nameNode建立通信

  2. NameNode检查客户端是否有读取文件的权限,以及文件是否存在。若通过检查,则通知客户端读取文件,并向发送文件的block列表,该列表中记录了每个block及其副本所在DataNode的地址

  3. 客户端按照就近原则从NameNode返回的block列表读取Block。首先客户端从Block列表中选择距离自身最近的DataNode读取Block,如果该DataNode可以读取文件的所有Block,则结束读取;反之则客户端继续从Block列表中选择距离自身最近的DataNode读取Block,直至读取文件的全部Block才结束读取

  4. 客户端将读取的所有Block按照顺序进行合并,最终形成目标文件。

第四单元

1.请简述YARN的工作流程

  1. 客户端向 ResourceManager 发送提交应用程序的请求,同时 ResourceManager 启动一个 ApplicationMaster,负责管理该应用程序。

  2. ResourceManager 在集群中寻找合适的 NodeManager,并向指定的 NodeManager 发送启动 ApplicationMaster 的请求。

  3. NodeManager 根据客户端提交应用程序时携带的参数,在本地完善ApplicationMaster依赖的资源;资源完善后,NodeManager 启动 ApplicationMaster。

  4. ApplicationMaster 启动后会向 ApplicationManager 进行注册,并向 Scheduler 申请所需的资源,此时根据每个 NodeManager 的资源使用情况向 ApplicationMaster 分配资源

  5. ApplicationManager根据申请的资源在指定的NodeManager 启动 Container。

  6. ApplicationMaster 向启动 Container 的 NodeManager 发送请求,要求 Container 启动任务。

  7. NodeManager 接收请求后,同样根据任务的相关参数,在本地完善任务依赖的资源,然后在 Container 中启动任务。

  8. 应用运行结束后,ApplicationMaster 向 ResourceManager申请注销自己以释放资源。如果 ApplicationMaster 因故障而导致任务失败,那么 ResourceManager 中的应用程序管理器会将其重新启动,直到所有任务执行完毕。

2.请描述YARN的组成及其各自的职责

  1. ResourceManager ResourceManager是一个全局资源管理系统,可以看作YARN集群的主节点

    1. 负责整个集群资源的监控、分配和管理。

    2. ResourceManager还负责与客户端交互、处理客户端请求

    3. 监控NodeManager的健康状态。

  2. NodeManager NodeManager可以看作YARN集群的从节点,负责管理与使用自身从节点的资源,主要功能包含以下内容:

    1. 监控本节点的资源使用情况和每个Container的运行情况,并向ResourceManager汇报。

    2. 接收来自ResourceManager的请求,为ApplicationMaster的某个任务分配Container。

    3. 周期性地向ResourceManager汇报自身的健康状态。

    4. 接收来自ApplicationMaster的请求以启动或停止Container。

  3. ApplicationMaster 它负责与ResourceManager协调获取其运行所需的资源,除此之外,ApplicationMaster还包含以下功能:

    1. 根据申请的资源为内部运行的任务分配资源。

    2. 负责监控所有任务的运行状态,并在任务运行失败时重新为任务申请资源以重启任务。

    3. 负责与NodeManager进行通信,获取Container以启动任务。

  4. Container Container可以看作YARN的资源单位

    1. 封装了某个从节点的多维度资源,包括内存、CPU、磁盘、网络等。

第五单元

简要说明ZooKeeper的集群架构角色,并描述其职责

1.Leader Leader是ZooKeeper集群的核心,每个Zookeeper集群中只能有一个Leader

  1. 处理客户端发送的事务请求,并将事务请求广播到所有Follower,以保证处理事务请求的顺序一致性。

  2. 为了确保Follower可以检测到Leader的存在,Leader会与Follower同步状态信息。 2.Follower Follower可以看作Leader的跟随者,每个ZooKeeper集群中可以包含多个Follower,它的作用主要有下面4点:

  3. 处理客户端发送的非事务请求。

  4. 将客户端发送的事务请求转发给Leader。

  5. 参与事务请求投票

  6. 参与Leader选举投票,如果当前Leader宕机,则所有的Follower会重新投票选举出一个新的Leader。 3.Observer Observer可以看作Leader的观察者,每个ZooKeeper集群中可以包含多个Observer,

  7. 负责同步Leader的数据,

  8. 处理客户端发送的非事务请求,

  9. 并将事务请求转发给Leader,通常用于在不影响集群事务请求处理能力的前提下,提升集群的非事务请求处理能力。

  10. 需要注意的是,Observer不参与任何形式的投票。

第七单元

简述Hive与MySQL的区别

您的答案:

  1. 查询语言不同:HIve使用HIveQL(HQL)、而MySQL使用SQL

  2. 数据存储位置不同:HIve存储在HDFS中,MySQL存储在本地文件系统中

  3. 数据格式不同:HIve的数据格式由用户定义,MySQL的数据格式由系统决定

  4. 数据更新不同:HIve数据更新较稀疏,MySQL较密集

  5. 执行延迟不同:Hive的执行延迟高,MySQL的执行延迟低

  6. 可扩展性不同:HIve的可扩展性高,MySQL的低

  7. 数据规模不同: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_name;

7.4

创建数据库hadoop_hive,并通过location参数指定数据库路径

复制代码
create database hadoop_hive location '/home/ubuntu/db/hadoop_hive';

使用数据库hadoop_hive

复制代码
use 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_part001

复制代码
create 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(deptno=10) select empno,ename,job,mgr,hiredate,sal,comm from emp001 where deptno=10;
insert into table emp_part001 partition(deptno=20) select empno,ename,job,mgr,hiredate,sal,comm from emp001 where deptno=20;
insert into table emp_part001 partition(deptno=30) select empno,ename,job,mgr,hiredate,sal,comm from emp001 where deptno=30;

查询分区表

复制代码
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.deptno=dept001.deptno;

做报表,根据职位给员工涨工资,把涨前、涨后的薪水显示出来

PRESIDENT 1000
MANAGER 800
其他 400
复制代码
select empno,ename,job,sal,case job when 'PRESIDENT' then sal+1000 when 'MANAGER' then sal+800  else sal+400 end from emp001;

四种表

(1)创建内部表

创建一个名为DB的数据库

复制代码
create database if not exists DB;

进入数据库DB

复制代码
use DB;

在数据库DB中,创建一个名为cat的内部表,有两个字段cat_id和cat_name,数据类型为string

复制代码
create table if not exists cat(cat_id string, cat_name string);

展示数据库DB中所有的表,查看cat表是否创建成功

复制代码
show tables;

(2)创建外部表

创建一个外部表cat2,有两个字段分别为cat_id和cat_name,数据类型为string

复制代码
create 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;