大数据开发面试总结(部分),希望可以帮到大家!

Hadoop的组成

Hadoop Common、Hadoop Ozone、HDFS、Mapreduce以及Yarn

Hadoop Common:支持其他Hadoop模块的通用实用程序。

Ozone:新的对象存储系统,可用于小文件和大文件存储,

Hadoop HDFS(hadoop distribute file system ):一个高可靠、高吞吐量的分布式文件系统,提供分布式的存储服务。

Hadoop MapReduce:一个分布式的离线并行计算框架。

Hadoop Yarn:作业调度与集群资源管理的平台。

Hadoop集群的安装:

  1. 安装JDK  2. 解压hadoop压缩包 3. 将hadoop添加到环境变量中 vim /etc/profile

     4. 修改hadoop-env.sh 在其中设置java环境、日志存储路径 5. 配置核心文件core-site.xml 6. 配置hdfs-site.xml (里面有HDFS的分工)  7. 配置yarn-site.xml  8. 配置mapred-site.xml  9. 配置workers  10.将文件分发到其他服务器上  

HDFS

介绍

一个高可靠、高吞吐量的分布式文件系统,提供分布式的存储服务。

HDFS的优缺点:

优点:1.高容错(副本机制) 2. 块存储 3. 适合处理大数据集

          缺点:1.不适合低延迟的数据访问 2.不适合存储大量小文件 3.不支持并发写入和随机修改

MapReduce

Hadoop的序列化和反序列化:

序列化就是把内存中的对象,转换成字节序列以便于存储和网络传输。

反序列化就是将收到的字节序列或者硬盘的持久化数据,转换成内存中的对象

自定义bean对象要想序列化的步骤:

  1. 实现writable接口  2.反序列化时,需要反射调用空参构造函数,所以必须有空参构造

3.重写序列化和反序列化方法 4. 如果需要将自定的bean放在key中传输,则需要实现comparable接口,因为MR中的shuffle过程一定会对key进行排序

MR的优缺点:

优点:易编程、良好的扩展性、高容错、适合PB级别数据的处理

缺点:不擅长实时计算、不擅长流计算、不擅长DAG计算

Maptask的并行度:

Maptask的个数取决于split切片的个数,切片默认的大小为块的大小。影响切片个数的因素有:1 文件大小 2 块大小 3 文件的个数

Partition分区和combiner合并:

分区器在mapper将KV写出之后,进入环形缓冲区之前被调用,相当于给每个KV当上了分区号的标记,该标记决定了该KV被环形缓冲区溢写到磁盘的哪个位置。

合并,局部聚合,也发生在进入环形缓冲区之前,他是为了maptask的输出进行局部聚合,从而减少网络传输压力。

若没有定义分区器,数据传送到reducer前如何被分区?

有默认的hashpartitioner,当设置了reducetask的数量之后,会进行hash取余进行分区。

MR如何实现topN:

可以自定义groupingcomparator,对结果进行最大值排序,然后再reduce输出时,控制只输出前n个数,就达到了输出topn的目的(写一个类继承writecomparator,重写compare方法)

Yarn

介绍:

Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源。

HDFS的数据压缩算法都有哪些

Bzip2,gzip,snappy

Flume

介绍:

采集数据的工具

三大组件:source、channel、sink

Source分类:

Spooldir:能够监控本地磁盘的某个目录。将新增的文件读取进flume

Exec:通过执行linux命令完成相应的功能

Avro:能够从上级的flume中读取数据(网络传输)

Netcat:能够从端口中读取数据

Sink分类:

Hdfs:将数据写入到HDFS

Avro:将数据写入到下一级的flume

File_roll:将数据写入本地磁盘

Logger:将数据打印到控制台

Flume和kafka的选取:

Flume是管道流的方式,体统了很多默认实现

Kafka是一个可持久化的分布式消息队列

Kafka可以有许多生产者和很多消费者共享多个主题,而flume是一个专注于发送数据到HDFS或Hbase当中,他对HDFS有特殊优化,所以数据被多个系统消费的话,使用kafka,如果数据发送给hadoop使用,使用flume。

数据怎么采集到kafka的:

有一个flumekafka插件,插件的实现方式是自定义了flume的sink,将数据从channel中取出,通过kafka的producer写入到kafka中,可以自定义分区等。

Sqoop

介绍

实现hadoop生态体系和RDBMS体系之间的数据传输

原理

将sqoop的命令翻译成MR程序,提交到yarn上运行,从而实现导入导出。底层MR没有reduce端。

Hive:

介绍:

基于Hadoop的一个数据仓库管理工具,可以将结构化的数据文件映射为一张表,并提供类sql查询功能。本质是将hql转换成MR的任务进行运算,底层由HDFS提供数据存储。

Hive的优缺点

优点:1.采用类sql语法 2.避免写MR程序 3.处理大数据集 4.支持用户自定义函数

缺点:1 HQL表达能力有限 2.迭代算法无法表达 3. 效率较低

Hive的执行过程:

来了一条HQl,提交至客户端,然后会远程调用组件提交至Driver端,driver端有解释器,解释时就会访问metastore服务,告诉我们表的位置等信息,解释之后,会使用编译器进行编译,然后进入优化器,优化生成底层mr任务,提交至yarn上,然后再HDFS上读取数据。

内部表和外部表的区别:

1.内部表有hive管理,外部表由HDFS管理

2.内部表的存储位置为hive.metastore.warehouse.dir 外部表数据存放的位置由自己决定,若没有location,hive将在HDFS上的/user/hive/warehouse文件下以外部表的表名创建一个文件夹

3.删除内部表直接删元数据和存储数据、外部表仅仅删除元数据

Hive支持索引么:

支持。但hive的索引与rdbms中的索引不同,比如hive不支持外键或主键

Hive索引适用于那些不更新的字段

Hive解析Json串

总体有两个方向:

  1. 将json以字符串的形式整个入hive表,然后通过使用UDF函数解析已经导入到hive中的数据,比如 lateral_view、 json_tuple等方法
  2. 导入之前将json拆成各个字段,导入hive表的数据是已经解析过得,这将使用第三方的serde

Hive的文件存储格式有哪些:

Testfile(行式存储,默认)、sequencefile(存储二进制文件,行式存储)、orc(列式存储)、parquet(列式存储)

Hive的优化

分三大方面:1、表设计优化 2、数据优化 3、计算job执行优化

表设计优化:

分区表:根据查询需要,按照查询条件划分区域存储

分桶表:由于两张大表join时,必经过shuffle阶段,相对性能较差,并且容易产生数据倾斜,使用分桶表将数据划分不同的目录进行存储

数据优化:

  1. 存储格式
  2. 压缩算法
  3. 存储优化
    1. 避免小文件的产生:切片过多、reduceTask设置过多,本身数据有很多小文件
    2. 如何避免小文件:开启map端小文件合并 set hive.merge.mapfile=true

                                             开启reduce端的文件合并 set hive.merge.mapredfiles =true

                                                       使用输入类 combineHiveInputFormat

             3 .使用orc格式存储,使用ORC文件索引

计算job执行优化:

  1. Mr属性优化:开启本地模式,数据量不大的表,直接在本地执行
  2. JVM重用:maptask和reducetask个数相同时,maptask工作完后,RM不会回收,AM分配reduceTask继续使用(hadoop 3.X不再支持)
  3. 开启并行执行:hive实现HQL时产生多个stage,我们让其并行执行

                                Set hive.exec.parallel =true

                                        Set hive.exec.parallel.thread.number = 16(默认为8)

    4. Join优化:

                mapJoin:小表join达标,小表join小表

                reducejoin:大表join大表

   5. 开启关联优化 set hive.optimize.correlation = true

   6. 配置CBD(基于代价)优化器引擎:hive默认的优化器引擎为RBO(基于规则) ,CBD一般搭配analyze分析优化器(将表或者分区的信息构建成元数据)使用

   7.谓词下推(PPD):在不影响结果的情况下,尽量将过滤条件提前执行

                                Set hive.optimize.ppd = true

Hive中的数据倾斜:

原因:数据本身就是倾斜的、分区规则导致相同的数据都分给了同一个task、key分布不均、建表时考虑不周.

Groupby数据倾斜:

  1. 开启map端聚合,减少reduce端输入量

                        Hive.map.aggr = true

      2. 实现随机分区

Select * from table distribute by rand()

      3. 自动构建分区并自动聚合

Hive.groupby.skewindata = true

Join的数据倾斜:

  1. 提前过滤,大数据变小数据,实现mapjoin
  2. 开启Skew join,原理就是当某个值出现数据倾斜,则将其单独使用mapJoin来实现,最后将map join 的结果和reduce join 结果合并

合并小文件、增加maptask的个数等。

Left semi-join 和left join的区别:

Left semi-join:左半开连接,当记录对于右表满足on语句时,返回左表记录,当左表的一条数据在右表中存在时,hive会停止扫描。左半开连接的select和where关键字后只能出现左表的字段。

Hbase

介绍:

建立在HDFS上,提供高可靠性、高性能、列存储、可伸缩、实时读写的nosql数据库系统,并且是分布式、面向列的开源数据库

特点:

  1. 强一致性读写 一个region只有一个regionServer管
  2. 自动分块(region)
  3. Regionserver故障转移
  4. 存储在HDFS上
  5. 支持java客户端

Hive和HBase的对比:

  1. Hive和hbase两种不同的技术
  2. Hive是类SQL引擎,并且运行MR任务
  3. HBase是在Hadoop之上的nosql的key-value数据库

Zk在hbase中发挥的作用:

  1. 维护元数据的入口(meta表):hbase中有Hmaster来记录元数据,并放到自己内        部的meta表中,由一个regionServer来管,而zk中就记录的这个regionServer是谁
  2. 帮助master选取一个active的master
  3. 利用zk的动态感知服务器上下线,任何服务器只要上线就会在zk中创建临时节点,将自己的服务器信息记录在该节点上,服务器一断,节点就消失。

StoreFile合并

Minor:

       用于部分文件合并,默认是3到10个文件进行合并,不删除其他版本的数据,过程较快,IO相对较低

Minor的触发条件:

       打开region或memstore的时候,自动检测是否需要合并。

       设置最小合并文件数,默认为3

Major:

对region下所有的stores进行合并

一般是手动触发,会删除其他版本的数据

Major触发条件:

       默认7天一次

       手动出发 major_compact “表名”

Region分裂:

Region中数据达到一定数量时,会进行分裂,一个region会分裂为两个,分配到不同的RS中,原来的region下线。Region最大文件大小为10G

分裂的方式:手动、自动

手动:创建表时需要指定  create ‘staff’,’info’,SPLITS=>[‘100’,’200’,’300’]

自动:使用分裂策略  steppingSplitPolicy,这个策略下当region个数大于等于9的时候,region会在storefile大小为10G的时候分裂

Bulkload

在需要海量数据写入的时候,使用bulk更有效,其原理就是将数据直接写入到HFILE中,从而无需与HBase交互,Hfile生成后,直接一次性建立与HBase的关联即可。

热点问题:

       HBase中的行是按照rowkey的字段顺序排序的,这种设计优化了scan操作,可以将相关的行以及会被一起读取的行存取在临近位置,便于scan。然后这样就可能造成热点问题,热点问题就是在客户端直接访问集群中一个或极少数节点,大量的访问会使region所在的单个服务器超出自身承受范围,引起性能的下降。

所以再向hbase中插入数据的时候,应优化rowkey设计,是数据被写入集群的多个region中,尽量均衡的把记录分散到不同的region中去,平衡每个region的压力。

避免热点问题的rowkey设计:

方式有三种:反转、加盐、哈希,除了rowkey设计,还有就是在建表的时候预分区

反转:

       一般反转分为数据反转时间戳反转

       数据反转:

              以手机号为例,前缀变化不大,但是后半部分变化很多,将其反转可以有效的避免热点问题。

       反转时间:

              如果将时间按照字典顺序排序,最近产生的数据会拍在旧数据之后,如果使用一个大的值减去时间(999999999999减去yyyyMMdd,或者Long.MAX_VALUE减去时间戳),则最新的时间就排在了前面。

加盐

       指在rowkey的前面增加一些前缀,加盐的前缀种类越多,rowkey就被打得越散。

哈希

       哈希和加盐的场景类似,只是前缀不可以是随机的,因为必须要让客户端能够完整的重构rowkey,所以一般去拿原来的rowkey或其中一部分计算hash值,然后再对hash值做运算作为前缀。

Rowkey的设计原则(四个原则):

长度原则、唯一原则、排序原则、散列原则

长度原则:         

              Rowkey是一个二进制码流,可以是任意字符串,最大长度是64kb,实际应用中一般为10-100bytes,以bytes[]形式保存,最好不要超过16个字节。

不能过长的原因:

  1. 因为过长的rowkey在HFile中占用的空间在大数据的情况下也是很大的。
  2. Memstore和blockcache分别对应列族和RS级别的写入缓存,若rowkey过长,内存的使用率就会降低,系统无法缓存更多的数据,导致检索效率低下

唯一原则:

       由于rowkey用来唯一表示一行记录,所以必须保证唯一性。

排序原则:

       Rowkey是按照字典顺序排序存储的,因此在设计rowkey的时候,需充分利用这个排序的特点,常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为rowkey的一部分对这个问题十分有用(可以用Long.Max_Value减timeStamp追加到key的末尾)

散列原则:

       即设计好的rowkey可以均匀的分布到各个regionserver上。即将rowkey的高位作为散列字段,由程序随机生成,低位放时间字段。

Zookeeper

介绍:

开源的分布式协调服务,分布式应用可以基于zookeeper实现数据发布、订阅、负载均衡、分布式协调通知、master选举、命名服务等功能

数仓:

特点

  1. 数据是面向主题的
  2. 数据是集成的,来源于不同的地方
  3. 数据是不可更新的,数仓中的数据主要提供决策
  4. 数据随时间不断变化,会增加内容

数仓和数据库的区别:

  1. 数据库是面向事务处理的,数据由日常的业务产生而数仓是面向主题的,数据来源多样,经过一定的规则转换得来,用于分析
  2. 数据库一般用来存储当前事务性数据,而数仓一般存储的是历史数据
  3. 数据库的设计需符合三范式,有最大精度和最小的冗余度,有利于数据的插入。数仓的设计一般不符合三范式,有利于查询

数仓的分层:

       一般分四层ODS贴源层、DW明细数据、DM轻量汇总、App应用层

表的分类:

实体表(业务对象)、维度表(码表)、事务型事实表(不断产生的数据)、周期型事实表等

维度建模:

以空间换时间,减少跨表分析统计

维度建模的三个模型:

星型模型:一个事实表和多个维度表

雪花模型:一个事实表和多个维度表,维度表之间存在关联

星座模型:多个事实表,不同事实表之间共享维度表

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值