Hadoop期末总结

1、根据需求,为公司规划搭建集群的具体方案。

规划(7台服务器为例):

 

NameNode

DataNode

Zookeeper

ZKFC

JournalNode

RM

NodeManager

Mysql

Hive

Hbase

Flume

Azkaban

1

Y

 Y

Y

Y

Y(管理日志)

Y

 

Y

Y

Y

Y

Y

2

Y

Y

 

Y

Y

Y

Y

Y

Y

 

 

 

3

 

 

Y

 

Y

 

Y

 

Y

 

Y

Y

4

 

Y

 

 

 

 

Y

 

 

 

 

 

5

 

 

Y

 

 

 

Y

 

 

 

Y

Y

6

 

Y

 

 

 

Y

 

 

 

 

 

 

7

 

 

Y

 

Y

Y

 

 

 

 

Y

Y

搭建方案:

首先安装一台服务器,基础环境配置(IP,主机名映射等),安装JDK;

安装zookeeper;

安装Hadoop;

创建配置集群

验证集群可用性

安装Hive,Mysql;

安装Hbase;

安装Flume;

安装Azkanban

按照规划合理部署集群节点。

 

2、大数据的特点,分析处理日志大数据的基本流程。

大数据技术的特点:
Volume(大体量):即可从数百TB到数十数百PB、甚至EB规模。
Variety(多样性):即大数据包括各种格式和形态的数据。
Velocity(时效性):即很多大数据需要在一定的时间限度下得到及时处理。
Veracity(准确性):即处理的结果要保证一定的准确性。
Value(大价值):即大数据包含很多深度的价值,大数据分析挖掘和利用带来巨大的商业价值。

大数据的基本处理步骤:

数据获取

flume             数据来源:专业数据机构,国家统计局,企业内部数据,互联网数据

 

数据清洗

mapreduce      清除不需要,错误,无效的数据

 

数据存储

hdfs         性能,可用,可靠,成本等方面考量

 

数据处理

hive        按业务需求处理

 

数据分享

sqoop,kettle        可视化展示,最大化利用数据价值

 

3、写出启动集群和关闭集群的操作过程。

启动/停止Hadoop集群:start-all.sh    stop-all.sh

1) 启动NameNode, DataNode

2) 启动JournalNode, JournalNode在hdfs-site.xml中指定edits log存储的位置,主备NameNode共享数据,方便同步

3) 启动DFSZKFailoverController, HA会启用ZooKeeper Failover Controller

4) 启动YARN守护进程ResourceManager, NodeManager

启动/停止HDFS集群:start-dfs.sh    stop-dfs.sh

 

4、NameNode和DataNode的主要功能和工作机制。

namenode 和 datanode功能

【namenode】

接收用户操作请求 维护文件系统的目录结构 管理文件与block之间关系,block与datanode之间关系 namenode管理:namenode支持对HDFS中的目录、文件和块做类似文件系统的创建、修改、删除、列表文件和目录等基本操作。 块存储管理 在整个HDFS集群中有且只有唯一一个处于active状态namenode节点,该节点负责对这个命名空间(HDFS)进行管理

【datanode】

存储文件 文件被分成block存储在磁盘上 为保证数据安全,文件会有多个副本 namenode和client的指令进行存储或者检索block,并且周期性的向namenode节点报告它存了哪些文件的block

工作机制:

                                                             namenode工作机制流程图

  

第一阶段:namenode启动

(1)第一次启动namenode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。

(2)客户端对元数据进行增删改的请求。

(3)namenode记录操作日志,更新滚动日志。

(4)namenode在内存中对数据进行增删改查。

第二阶段:Secondary NameNode工作

(1)Secondary NameNode询问namenode是否需要checkpoint。直接带回namenode是否检查结果。

(2)Secondary NameNode请求执行checkpoint。

(3)namenode滚动正在写的edits日志。

(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。

(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。

(6)生成新的镜像文件fsimage.chkpoint。

(7)拷贝fsimage.chkpoint到namenode。

(8)namenode将fsimage.chkpoint重新命名成fsimage。

                                                                  datanode工作机制流程图

 

               

 

1)一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。

2)DataNode启动后向namenode注册,通过后,周期性(1小时)的向namenode上报所有的块信息。

3)心跳是每3秒一次,心跳返回结果带有namenode给该datanode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个datanode的心跳,则认为该节点不可用。

4)集群运行中可以安全加入和退出一些机器

 

5、HDFS Shell常用的文件管理操作。

–ls

使用方法:hadoop fs -ls [-h] [-R]

功能:显示文件、目录信息。

示例:hadoop fs -ls /user/hadoop/file1

 

–mkdir

使用方法:hadoop fs -mkdir [-p]

功能:在 hdfs 上创建目录,-p 表示会创建路径中的各级父目录。

示例:hadoop fs -mkdir –p /user/hadoop/dir1

 

–put

使用方法:hadoop fs -put [-f] [-p] [ -| .. ].

功能:将单个 src 或多个 srcs 从本地文件系统复制到目标文件系统。

-p:保留访问和修改时间,所有权和权限。

-f:覆盖目的地(如果已经存在)

示例:hadoop fs -put -f localfile1 localfile2 /user/hadoop/hadoopdir

 

–get

使用方法:hadoop fs -get [-ignorecrc] [-crc] [-p] [-f]

-ignorecrc:跳过对下载文件的 CRC 检查。

-crc:为下载的文件写 CRC 校验和。

功能:将文件复制到本地文件系统。

示例:hadoop fs -get hdfs://host:port/user/hadoop/file localfile

 

–appendToFile

使用方法:hadoop fs -appendToFile …

功能:追加一个文件到已经存在的文件末尾

示例:hadoop fs -appendToFile localfile /hadoop/hadoopfile

 

–cat

使用方法:hadoop fs -cat [-ignoreCrc] URI [URI …]

功能:显示文件内容到 stdout

示例:hadoop fs -cat /hadoop/hadoopfile

 

–tail

使用方法:hadoop fs -tail [-f] URI

功能:将文件的最后一千字节内容显示到 stdout。

-f 选项将在文件增长时输出附加数据。

示例:hadoop fs -tail /hadoop/hadoopfile

 

–chgrp

使用方法:hadoop fs -chgrp [-R] GROUP URI [URI …]

功能:更改文件组的关联。用户必须是文件的所有者,否则是超级用户。

-R 将使改变在目录结构下递归进行。

示例:hadoop fs -chgrp othergroup /hadoop/hadoopfile

 

–chmod

功能:改变文件的权限。使用-R 将使改变在目录结构下递归进行。

示例:hadoop fs -chmod 666 /hadoop/hadoopfile

 

–chown

功能:改变文件的拥有者。使用-R 将使改变在目录结构下递归进行。

示例:hadoop fs -chown someuser:somegrp /hadoop/hadoopfile

 

–copyFromLocal

使用方法:hadoop fs -copyFromLocal URI

功能:从本地文件系统中拷贝文件到 hdfs 路径去

示例:hadoop fs -copyFromLocal /root/1.txt /

 

–copyToLocal

功能:从 hdfs 拷贝到本地

示例:hadoop fs -copyToLocal /aaa/jdk.tar.gz

 

–cp

功能:从 hdfs 的一个路径拷贝 hdfs 的另一个路径

示例: hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2

 

–mv

功能:在 hdfs 目录中移动文件

示例: hadoop fs -mv /aaa/jdk.tar.gz /

 

–getmerge

功能:合并下载多个文件

示例:比如 hdfs 的目录 /aaa/下有多个文件:log.1, log.2,log.3,…

hadoop fs -getmerge /aaa/log.* ./log.sum

 

–rm

功能:删除指定的文件。只删除非空目录和文件。-r 递归删除。

示例:hadoop fs -rm -r /aaa/bbb/

 

–df

功能:统计文件系统的可用空间信息

示例:hadoop fs -df -h /

 

–du

功能:显示目录中所有文件大小,当只指定一个文件时,显示此文件的大小。

示例:hadoop fs -du /user/hadoop/dir1

 

–setrep

功能:改变一个文件的副本系数。-R 选项用于递归改变目录下所有文件的副本

系数。

示例:hadoop fs -setrep -w 3 -R /user/hadoop/dir1

 

6、HDFS文件上传和下载的流程。

文件上传的流程:

1)客户端向namenode发送文件上传的请求

2)namenode会进行一系列的检查:

- 父目录是否存在

- 文件是否已经上传

- 是否有文件上传权限等

- 如果检查没问题,则会发送允许上传的响应

3)客户端发送真正的上传请求 包含重要的信息 文件的大小(或长度)

4)namenode会向客户端返回上传文件的节点。

- 根据文件的大小进行计算返回的节点数的206/128M=2 2*副本3=6个节点

- 返回哪些节点?:

- 根据距离和空间

- 先返回客户端所在机器节点>>>>>同机架的节点>>>>>不同机架的节点

5)客户端开始准备上传

6)客户端对数据进行逻辑切块

7)客户端开始上传第一个数据块

8)客户端构建第一个数据块的pipline

- 客户端—>>>hadoop01——>>>hadoop02——>>>hadoop03扩散

- 同时会开启一个阻塞服务,这个服务的作用

- 1)用于检测上传的文件是否和原文件一样

- 2)等待客户端上传成功的响应

9)客户端开始进行真正的数据上传,最终上传成功之后,给客户端响应

10)关闭当前的pipline

11)开始进行第二个块的上传,步骤重复 8,9,10

12)所有的块都上传成功之后 回向namenode响应

 

文件下载的流程:

1)客户端向namenode发送文件下载的请求

2)namenode也会进行一系列的检查

         文件是否存在,是否有权限等

         如果这一系列的检查没有问题,这个时候开始查询自己的元数据库

         返回数据对应的块以及块的存储位置给客户端

3)客户端拿到数据快的存储信息,开始进行第一个块的下载

从哪一个节点下载?就近原则,优先选择客户端所在的节点》》》同机架》》》不同机架

如果块下载失败怎么办?会再进行尝试一次,

 如果还失败客户端会将这个失败的节点返回给namenode 同时会继续从另外的节点进行下载这个块。

4)第一个块下载完成之后,会进行crc校验,如果校验通过 则认为下载成功。

5)开始进行第二个块的下载,重复步骤4,进行文件追加

6)当所有的数据块下载成功之后,客户端向namenode反馈

7、举例说明MapReduce的Shuffle过程。

Shuffle过程是MapReduce的核心

先对数据进行切片,然后将数据传递给map,map的输出是内存缓冲区(圆形缓冲区),内存缓冲区默认大小是100M,当达到80%的时候将数据溢写到本地,剩余20%用于继续获取数据,在溢写到磁盘的时候会执行parti tion(分区) 和 sort (排序), 然后对文件进行合并操作,合并完成之后 reduceTask 会去启动线程去mapTask拉取数据,然后进行文件合并,并进行排序(归并),然后将小文件合并成一个大文件并调用reduce方法完成最终输出效果。

 

用数据分区解决数据相关性问题:

问题:

  一个Reduce节点上的计算数据可能会来自多个Map节点,因此,为了在进入Reduce节点计算之前,需要把属于一个Reduce节点的数据归并到一起。

解决方按:

  在Map阶段进行了Combining以后,可以根据一定的策略对Map输出的中间结果进行分区(partitioning),这样既可解决以上数据相关性问题避免Reduce计算过程中的数据通信。

例如:

  有一个巨大的数组,其最终结果需要排序,每个Map节点数据处理好后,为了避免在每个Reduce节点本地排序完成后还需要进行全局排序,我们可以使用一个分区策略如:(d%R),d为数据大小,R为Reduce节点的个数,则可根据数据的大小将其划分到指定数据范围的Reduce节点上,每个Reduce将本地数据排好序后即为最终结果。

 

8、结合实际引用描述MapReduce各端的算法设计。

点击这里

 

9、根据场景描述使用HQL创建内部表。

 

10、Hive中的内部表和外部表有何区别。

未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);

区别:

内部表数据由Hive自身管理,外部表数据由HDFS管理;

内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定(如果没有LOCATION,Hive将在HDFS上的/user/hive/warehouse文件夹下以外部表的表名创建一个文件夹,并将属于这个表的数据存放在这里);

删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;

对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)

 

11、Hive中元数据和数据如何管理。

Hive将元数据存储在数据库中,目前只支持 mysql、derby。
Hive中的元数据包括表的名字,表的列和分区及其属性,
表的属性(是否为外部表等),表的数据所在目录等
Hive中所有的数据都存储在 HDFS中,没有专门的数据存储格式
只需在建表时告诉 Hive数据中的列分隔符和行分隔符,Hive 就可以解析数据

hive中元数据(表的结构)存储在MySQL中,hive中数据存储在HDFS上,
hive负责分析、统计数据
数据库是先准备表结构,再产生数据
数据库设计环节:需求分析DD、DFD->概念结构设计ER->逻辑结构设计NF->物理结构设计->数据库实施->运行维护
数据仓库是先有数据,才创建表结构
数据仓库ETL,从现有的数据库中清洗、抽取数据E,然后转换T,最后加载L到仓库

 

12、Hive中数据加载和数据导出到本地目录。

方法1:insert overwrite [local] DIRECTORY directory select_statement

方法2:hive -e “select statement” > LocalDirectoryPath

方法3:sqoop export(没试过)

 

13、HBase的数据库与关系数据库有何区别。

1. 数据类型:Hbase只有简单的数据类型,只保留字符串;关系数据库采用关系模型,有丰富的数据类型。
2. 数据操作:Hbase只有简单的插入、查询、删除、清空等操作,表和表之间是分离的,没有复杂的表和表之间的关系;关系数据库通常有各式各样的函数和连接操作。
3. 存储模式:Hbase是基于列存储的,每个列族都由几个文件保存,不同列族的文件是分离的,这样的好处是数据即是索引,访问查询涉及的列大量降低系统的I/O,并且每一列由一个线索来处理,可以实现查询的并发处理;传统数据库是基于表格结构和行存储,其没有建立索引将耗费大量的I/O并且建立索引和物化试图需要耗费大量的时间和资源。
4. 数据维护:Hbase的更新实际上是插入了新的数据;传统数据库只是替换和修改。
5. 可伸缩性:Hbase可以轻松的增加或减少硬件的数目,并且对错误的兼容性比较高;传统数据库需要增加中间层才能实现这样的功能。
6. 事务:Hbase只可以实现单行的事务性,意味着行与行之间、表与表之前不必满足事务性;传统数据库是可以实现跨行的事务性。

 

14、启动HBase,并创建表的Shell命令。

启动Hbase:

start-hbase.sh

进入Hbase shell:

hbase shell

创建表:

create 'user','base_info'

向表中添加数据:

put 'user', 'rowkey_10', 'base_info:username', '张三'

put 'user', 'rowkey_10', 'base_info:birthday', '2014-07-10'

put 'user','rowkey_10','base_info:sex','1'

put 'user','rowkey_10','base_info:address','北京市'

 

put 'user','rowkey_16','base_info:username','张小明'

put 'user','rowkey_16','base_info:birthday','2014-07-10'

put 'user','rowkey_16','base_info:sex','1'

put 'user','rowkey_16','base_info:address','北京'

 

put 'user','rowkey_22','base_info:username','陈小明'

put 'user','rowkey_22','base_info:birthday','2014-07-10'

put 'user','rowkey_22','base_info:sex','1'

put 'user','rowkey_22','base_info:address','上海'

 

put 'user','rowkey_24','base_info:username','张三丰'

put 'user','rowkey_24','base_info:birthday','2014-07-10'

put 'user','rowkey_24','base_info:sex','1'

put 'user','rowkey_24','base_info:address','河南'

 

put 'user','rowkey_25','base_info:username','陈大明'

put 'user','rowkey_25','base_info:birthday','2014-07-10'

put 'user','rowkey_25','base_info:sex','1'

put 'user','rowkey_25','base_info:address','西安'

 

15、从HBase的数据表中查询信息的不同查询方法。

查询表中的所有数据

scan 'user'

查询某个rowkey的数据

get 'user', 'rowkey_16'

查询某个列簇的数据

get 'user', 'rowkey_16', 'base_info'

get 'user', 'rowkey_16', 'base_info:username'

get 'user', 'rowkey_16', {COLUMN => ['base_info:username', 'base_info:sex']}

 

16描述使用JavaAPl进行单行数据的写入、按行键读取数据的基本步骤。

1.在Java Project中访问,集中式
    主要学习一套API,完成HBase访问(创建表、删除表、插入数据、查询等)
    (1)首先需要在Java程序中连接到HBase,主要通过hbase的配置文件完成
        core-site.xml  hdfs-site.xml  hbase-site.xml
        第一步完成后需要创建好Admin对象,用于管理数据库中数据表
    (2)查看数据表
    (3)新建数据表,表名称、列族 create 'table1','cl1','cl2'
        创建表名称对象->根据表名称对象创建表描述对象->创建列族对象->
        把列族对象添加到表对象->执行createTable创建表
    (4)修改数据表,添加列族为例
        创建表名称对象->根据表名称对象获取表描述对象->创建列族对象->
        把列族对象添加到表对象->执行modifyTable修改表(先禁用,修改后再启用)
    (5)删除数据表
        创建表名称对象->判断表是否存在->若存在先禁用再删除即可
    (2)-(5)属于数据表定义
    (6)插入数据,单行
        创建表名称对象->根据表名称对象创建表对象->根据行键创建行对象put->
        设置put.add所在行的列族、列名对应的列值->表对象执行put方法添加一行
    (7)插入数据,多行
        创建表名称对象->根据表名称对象创建表对象->根据不同行键创建多行或list对象put->
        设置put.add所在行的列族、列名对应的列值->表对象执行put方法逐行或列表添加
    (8)删除数据
        创建表名称对象->根据表名称对象创建表对象->根据行键创建delete对象
        ->表对象执行delete方法删除一行
        可以删除一行或一行的列族或一行的列族中的列
    (9)查询单行数据,get
        创建表名称对象->根据表名称对象创建表对象->根据行键创建行对象get->
        通过表对象执行get方法获取get对象表示的行->Result执行rawCells获取所有单元格
    (10)查询多行数据,scan
        创建表名称对象->根据表名称对象创建表对象->创建scan对象->
        通过表对象执行getScanner方法获取所有行->循环处理每一行Result
    (11)带条件查询数据
        可以指定开始行键和结束行键-----------行键作为条件
        可以指定查询结果的列族和列-----------限制查询结果  
        可以指定时间范围    ------------- 时间戳作为条件
    (12)带过滤器(复杂条件)的查询
        指定列值作为条件,可以相等、不相等、范围,可以是常量过滤器、正则表达式或子串过滤
        指定列名作为条件,且指的是列名的前缀,查询所有行满足列名前缀的数据
        指定行键条件可以时正则表达式
        可以指定多个过滤器,组成过滤器链,设置过滤器链中同时满足或任意满足
    (6)-(12)属于数据表的数据操作
2.在MapReduce中访问,分布式
    (1)Map阶段完成工作
    Map继承Mapper,如果需要读取数据表则继承TableMapper
    没有inputkey和inputvalue,只有输出
    (2)Reduce阶段完成工作
    Reduce继承Reducer,如果需要读取数据表则继承TableReducer
    接收mapper的输出,处理完后write到数据表
    (3)Driver完成工作
    负责初始化数据表,包括结构和数据
    负责调用Map,同时将scan结果发送到mapper
    负责调用Reduce,将结果输出保存到table

猜你喜欢

转载自blog.csdn.net/qq_39672140/article/details/106875543