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