面试准备-理论基础篇

讲讲多线程吧, 要是你,你怎么实现一个线程池呢?

理论基础怎么样,比如数据结构,里面的快速排序,或者,树? 讲一讲你了解的树的知识?

数学怎么样呢?

关于异步 是怎么思考呢?

到的一些锁啊, 是怎么做的呢?比如两个人同时操作一样东西。怎么做的呢?

一些并发操作设计到一些变量怎么做的呢?

你们用的最多是 http协议吧? 有没有特殊的头呢? 讲讲 你对tcp/ip的理解?

面试准备-kafka篇

kafka架构

Kafka剖析(一):Kafka背景及架构介绍

kafka数据源

kakfadirect是什么,。为什么要用这个,有什么优点?。和其他的有什么区别。

flume和kafka对比

(1)kafka和flume都是日志系统。kafka是分布式消息中间件,自带存储,提供push和pull存取数据功能。flume分为agent(数据采集器),collector(数据简单处理和写入),storage(存储器)三部分,每一部分都是可以定制的。比如agent采用RPC(Thrift-RPC)、text(文件)等,storage指定用hdfs做。

(2)kafka做日志缓存应该是更为合适的,但是 flume的数据采集部分做的很好,可以定制很多数据源,减少开发量。所以比较流行flume+kafka模式,如果为了利用flume写hdfs的能力,也可以采用kafka+flume的方式。

采集层 主要可以使用Flume, Kafka两种技术。

Flume:Flume 是管道流方式,提供了很多的默认实现,让用户通过参数部署,及扩展API.

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

面试准备-实战项目篇

设计日志收集分析系统

日志分布在各个业务系统中,我们需要对当天的日志进行实时汇总统计,同时又能按天查询历史的汇总数据(可以围绕PV、UV、IP等
指标进行阐述)

  1. 通过flume将不同系统的日志收集到kafka中
  2. 通过storm实时的处理PV、UV、IP
  3. 通过kafka的consumer将日志生产到hbase中。
  4. 通过离线的mapreduce或者hive,处理hbase中的数据

面试准备-hive/sql篇

hive 系统架构

hive三种service

分别是cli,hiveserver和hwi。
cli是命令行工具,为默认服务,启动方式$HIVE_HOME/bin/hive 或 $HIVE_HOME/bin/hive –service cli。

hiverserver通过thrift对外提供服务,默认端口10000,启动方式为$HIVE_HOME/bin/hive–service hiveserver。

hwi为web接口,可以通过浏览器访问hive,默认端口9999,启动方式为$HIVE_HOME/bin/hive–service hwi。

hive UDF

讲一下数据库,SQl ,左外连接, 原理,实现

hive 分区

hive分区(partition)简介

  1. 一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。

  2. 表和列名不区分大小写。

  3. 分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。

  4. 分区建表分为2种,一种是单分区,也就是说在表文件夹目录下只有一级文件夹目录。另外一种是多分区,表文件夹下出现多文件夹嵌套模式。
    a、 单分区建表语句:create table day_table (id int, content string) partitioned by (dt string);单分区表,按天分区,在表结构中存在id,content,dt三列。

b、双分区建表语句:create table day_hour_table (id int, content string) partitioned by (dt string, hour string);双分区表,按天和小时分区,在表结构中新增加了dt和hour两列

1
2
3
LOAD DATA INPATH '/user/pv.txt' INTO TABLE day_hour_table PARTITION(dt='2008-08- 08', hour='08');
LOAD DATA local INPATH '/user/hua/*' INTO TABLE day_hour partition(dt='2010-07- 07');

hive 实现wordcount

1
2
3
4
--分组统计
select word, count(*) from word.words group by word;
--分组排序
select word, count(*) counts from word.words group by word order by counts desc;

还了解过数据的什么知识? 数据库引擎?

索引本身是一个类似于平衡二叉树的高效数据结构

大表和小表join.

join 字段重复量小的放前面
表a,表b 是有先后顺序的,性能主要卡在reduce的次数

数据倾斜问题

几亿条数据如果只查询个别几条怎么办

把数据写到es中

es查询几乎是实时的

hive的外部表

内部表:加载数据到hive所在的hdfs目录,删除时,元数据和数据文件都删除
外部表:不加载数据到hive所在的hdfs目录,删除时,只删除表结构。

  1. hive是内部表数据的管理者,但不是外部表数据的管理者
  2. 在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!

load data local inpath直接把本地文件系统的数据上传到hdfs上

本质是load一个hdfs上的数据时会转移数据!

外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
hive 不一定能够查询外部表,很多外部表的建立都是为了共享数据,hive—> es;hive—>hbase

生产环境中为什么建议使用外部表?

  1. 因为外部表不会加载数据到hive,减少数据传输、数据还能共享。
  2. hive不会修改数据,所以无需担心数据的损坏
  3. 删除表时,只删除表结构、不删除数据。

面试准备-spark篇

spark开发分两个方面?哪两个方面呢?

比如 一个读取hdfs上的文件,然后count有多少行的操作,你可以说说过程吗。

那这个count是在内存中,还是磁盘中计算的呢?磁盘中。

spark比Mapreduce快? 为什么快呢? 快在哪里呢?

  1. 内存迭代。
  2. RDD设计。
  3. 算子的设计。

spark sql又为什么比hive快呢?

执行机制不一样
spark sql最终被翻译成DAG作业执行
hive 是翻译成map-reduce 任务

RDD的数据结构是怎么样的?

Partition数组。 dependence

hadoop的生态呢

Spark工作的一个流程。

用户提交一个任务。 入口是从sc开始的。 sc会去创建一个taskScheduler。根据不同的提交模式, 会根据相应的taskchedulerImpl进行任务调度。
同时会去创建Scheduler和DAGScheduler。DAGScheduler 会根据RDD的宽依赖或者窄依赖,进行阶段的划分。划分好后放入taskset中,交给taskscheduler 。
appclient会到master上注册。首先会去判断数据本地化,尽量选最好的本地化模式去执行。
打散 Executor选择相应的Executor去执行。ExecutorRunner会去创建CoarseGrainerExecutorBackend进程。 通过线程池的方式去执行任务。

反向:
Executor向 SchedulerBackend反向注册

Spark On Yarn模式下。 driver负责计算调度。appmaster 负责资源的申请。

RDD算子里操作一个外部map比如往里面put数据。然后算子外再遍历map。有什么问题吗。

shuffle的过程。调优。

5个partition里面分布有12345678910.用算子求最大值或者和。不能用广播变量和累加器。或者sortbykey.

知道spark怎么读hbase吗?spark on hbase.。华为的

sort shuffle的优点?

stage怎么划分的? 宽依赖窄依赖是什么?

怎么用spark做数据清洗

具体:
去除脏脏数据(过滤)
元组内容重组(分散,组合 )
元组内容过滤列(map)
其他数据类型解析(比如json解析)

spark读取 数据,是几个Partition呢?hdfs几个block 就有几个 Partition?

.spark on yarn的两种模式?

client (driver+appmaster)(多用于测试)
cluster (appmaster client)(多用于生产)

spark 数据倾斜

充分利用资源

提高并发度

reduce端join转换成map端join(大表与小表 广播变量)

因为是链式操作,比较方便进行 先打散(对给key加个随机前缀)进行局部聚合,后整体聚合(去掉随机前缀)

jdbc?mysql的驱动包名字叫什么?

mysql-connector-java-5.1.44.jar

画图,画Spark的工作模式,部署分布架构图

画图,画图讲解spark工作流程。以及在集群上和各个角色的对应关系。

画图,讲讲shuffle的过程。那你怎么在编程的时候注意避免这些性能问题

dataset和dataframe?

通过什么方式学习spark的?

有哪些数据倾斜,怎么解决?

宽依赖窄依赖?

yarn的原理?

BlockManager怎么管理硬盘和内存的

哪些算子操作涉及到shuffle(宽依赖)

groupByKey
reduceByKey

看过源码? 你熟悉哪几个部分的源码?

spark怎么整合hive?

大概这样。 spark on hive 。 hive还是hive 执行引擎是spark

Spark如何处理结构化数据,Spark如何处理非结构化数据?

Spark性能优化主要有哪些手段?

简要描述Spark分布式集群搭建的步骤

对于Spark你觉得他对于现有大数据的现状的优势和劣势在哪里?

对于算法是否进行过自主的研究设计?

简要描述你了解的一些数据挖掘算法与内容 基本我有印象的就这几个问题,聊了2个多小时,脑子都差点被问干了

spark 二次排序 自定义排序

实现orderedBY对象

sparkSQL的交互性

sparkSession
(RDD+schema) dataDrame

spar

面试准备-hdfs篇

Hadoop的机架怎么配置的?

集群的规模有多大

namenode宕机,如何修复

基础设置:编辑core-site,增加checkpoint相关配置
将second namenode设置到另一台机器。
数据恢复,从second namenode 复制数据
使用 hadoop namenode -importCheckpoint

HA和Federaion(联邦)

(HA 借助zookeeper)该特性通过热备的方式为主NameNode提供一个备用者,一旦主NameNode出现故障,可以迅速切换至备NameNode,从而实现不间断对外提供服务。

Federaion该特性允许一个HDFS集群中存在多个NameNode同时对外提供服务,这些NameNode分管一部分目录(水平切分),彼此之间相互隔离,但共享底层的DataNode存储资源

SecondaryNameNode是不是热备份

面试准备-map_reduce篇

map-reduce体系结构

map-reduce运行流程

讲一下Mapreduce或者hdfs的原理和机制。map读取数据分片。

shuffle 是什么? 怎么调优?

在Map端的shuffle过程是对Map的结果进行分区(partition)、排序(sort)和分割(spill),然后将属于同一个划分的输出合并在一起

shuffle 和reduce的区别

对调度怎么理解.? 用什么工具吗?

用kettle 这种工具还是 自己写程序? 你们公司是怎么做的?

你们数据中心开发周期是多长?

你们hbase里面是存一些什么数据。

Mapreduce 的 map 数量 和 reduce 数量 怎么确定 ,怎么配置

map的数量由数据块决定,reduce数量随便配置。

说说Mapreduce?一整个过程的理解。讲一下。

Map—combiner—partition—sort—copy—sort—grouping—reduce

map数量的计算过程

分片:splits

默认情况下,map数量等于 split数量 totalSize/splitSize = totalSize/blockSize

引入几个中间概念
goalSize
blockSize
minSize

影响参数
mapred.map.tasks

由用户设置的tasks 先计算用户期望的片大小 ,goalSize,与blockSize 谁小以谁为依据,如果
goalSize > blockSize,则实际上用户设置的tasks数并没有其作用
有没有可能一个map计算多个数据块呢?

mapred.min.split.size
mapred.max.split.size
long minSize = Math.max(job.getLong(org.apache.hadoop.mapreduce.lib.input.
FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize);

mapred-default.xml文件中mapred.min.split.size=0,所以job.getLong(“mapred.min.split.size”,1)=0

minSplitSize 是 FileInputFormat 一个数据成员 默认值为1,所以minSize =1 其目的就是得到配置中的最小值

但如果 minSize 大于(goalSize,blockSize中的最小值),则会出现一个map处理多个数据块的情况

1
2
3
4
private long minSplitSize = 1;
protected void setMinSplitSize(long minSplitSize) {
this.minSplitSize = minSplitSize;
}

1
2
3
4
5
protected long computeSplitSize(long goalSize, long minSize,
long blockSize) {
return Math.max(minSize, Math.min(goalSize, blockSize));
}

  由InputFormat这个接口来定义的,其中有个getSplits方法。这里有一个新的概念:fileSplit。每个map处理一个fileSplit,所以有多少个fileSplit就有多少个map(map数并不是单纯的由用户设置决定的)。

map数量和分区数量是一样的吗?

在进行MapReduce计算时,有时候需要把最终的输出数据分到不同的文件中,比如按照省份划分的话,需要把同一省份的数据放到一个文件中;按照性别划分的话,需要把同一性别的数据放到一个文件中。我们知道最终的输出数据是来自于Reducer任务。那么,如果要得到多个文件,意味着有同样数量的Reducer任务在运行。Reducer任务的数据来自于Mapper任务,也就说Mapper任务要划分数据,对于不同的数据分配给不同的Reducer任务运行。Mapper任务划分数据的过程就称作Partition。负责实现划分数据的类称作Partitioner。

mapper 数量 ,分区数量 ,reducer数量(用户设置)

num(mapper) == num(partition)

hadoop中Combiner的作用?

combiner是reduce的实现,在map端运行计算任务,减少map端的输出数据。
作用就是优化。
但是combiner的使用场景是mapreduce的map和reduce输入输出一样。

简述hadoop的调度器

FIFO schedular:默认,先进先出的原则
Capacity schedular:计算能力调度器,选择占用最小、优先级高的先执行,依此类推
Fair schedular:公平调度,所有的job具有相同的资源。

combiner和partition的作用

combiner是reduce的实现,在map端运行计算任务,减少map端的输出数据。作用就是优化。但是combiner的使用场景是mapreduce的map
输出结果和reduce输入输出一样。
partition的默认实现是hashpartition,是map端将数据按照reduce个数取余,进行分区,不同的reduce来copy自己的数据。partition
的作用是将数据分到不同的reduce进行计算,加快计算效果。

用mapreduce怎么处理数据倾斜问题?

数据倾斜:map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,
这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条key所在的reduce节点所处理的数据量比其他节点就大很多,
从而导致某几个节点迟迟运行不完,此称之为数据倾斜。
用hadoop程序进行数据关联时,常碰到数据倾斜的情况,这里提供一种解决方法。
自己实现partition类,用key和value相加取hash值:
方式1:
源代码:

1
2
3
4
5
6
7
public int getPartition(K key, V value,int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
// 修改后
public int getPartition(K key, V value,int numReduceTasks) {
return (((key).hashCode()+value.hashCode()) & Integer.MAX_VALUE) % numReduceTasks;
}

方式2:

1
2
3
4
5
6
7
public class HashPartitioner<K, V> extends Partitioner<K, V> {
private int aa= 0;
/** Use {@link Object#hashCode()} to partition. */
public int getPartition(K key, V value,int numReduceTasks) {
return (key.hashCode()+(aa++) & Integer.MAX_VALUE) % numReduceTasks;
}

方式3:
重新设计key

面试准备-hbase篇

hbase热点问题

加上随机前缀之后怎么查询?

hbase功能组件

一个Master主服务器
许多个Region服务器

主服务器Master负责管理和维护HBase表的分区信息,维护Region服
务器列表,分配Region,负载均衡

Region服务器负责存储和维护分配给自己的Region,处理来自客户
端的读写请求

客户端并不是直接从Master主服务器上读取数据,而是在获得Region
的存储位置信息后,直接从Region服务器上读取数据

客户端并不依赖Master,而是通过Zookeeper来获得Region位置信息
,大多数客户端甚至从来不和Master通信,这种设计方式使得Master
负载很小

讲讲列式存储的 parquet文件底层格式

region多大会分区?

Hbase的设计有什么心得?

Hbase的操作是用的什么API还是什么工具?

Hbase的PUT的一个过程(hbase写过程)

做过hbase的二级索引吗?

.问二次排序是什么。topn是什么,二次排序要继承什么接口?

计算的数据怎么来的。

.hbase存数据用什么rowkey?加时间戳的话,会不会出现时间戳重复的问题,怎么做的呢?

hbase 的特点是什么

(1) Hbase一个分布式的基于列式存储的数据库,基于Hadoop的hdfs存储,zookeeper进行管理。
(2) Hbase适合存储半结构化或非结构化数据,对于数据结构字段不够确定或者杂乱无章很难按一个概念去抽取的数据。
(3) Hbase为null的记录不会被存储.
(4)基于的表包含rowkey,时间戳,和列族。新写入数据时,时间戳更新,同时可以查询到以前的版本.
(5) hbase是主从架构。hmaster作为主节点,hregionserver作为从节点。
大数据Hbase 面试题

Hbase和hive 有什么区别

从以下几个方面来说
|hbase|hive
———|———————————————|————————–
类型|列式数据库|数据仓库
内部机制|数据库引擎|MapReduce
增删改查|都支持|只支持导入和查询
Schema|只需要预先定义列族,不需要具体到列列可以动态修改|需要预先定义表格
应用场景|实时|离线处理
特点|以K-V形式存储(NoSql)|类SQL

Hive和Hbase是两种基于Hadoop的不同技术–Hive是一种类SQL 的引擎,并且运行MapReduce 任务,Hbase 是一种在Hadoop之上的NoSQL的Key/vale数据库。当然,这两种工具是可以同时使用的。就像用Google 来搜索,用FaceBook 进行社交一样,Hive 可以用来进行统计查询,HBase 可以用来进行实时查询,数据也可以从Hive 写到Hbase,设置再从Hbase 写回Hive。

HIVE 直接可以通过sql来实现统计,hbase不行
Hbase非常适合用来进行大数据的实时查询
HBase 是一种Key/Value 系统,它运行在HDFS 之上。和Hive 不一样,Hbase 的能够在
它的数据库上实时运行,而不是运行MapReduce 任务

描述Hbase的rowKey的设计原则.

Rowkey唯一原则,必须在设计上保证其唯一性

  1. 散列性:散列性能够保证相同相似的rowkey聚合,相异的rowkey分散,有利于查询
  2. 简短性:rowkey作为key的一部分存储在HFile中,如果为了可读性将rowKey设计得过长,那么将会增加存储压力
  3. 唯一性:rowKey必须具备明显的区别性
  4. 业务性:举些例子

    假如我的查询条件比较多,而且不是针对列的条件,那么rowKey的设计就应该支持多条件查询

    如果我的查询要求是最近插入的数据优先,那么rowKey则可以采用叫上Long.Max-时间戳的方式,这样rowKey就是递减排列

描述Hbase中scan和get的功能以及实现的异同.

按指定RowKey 获取唯一一条记录,get方法

按指定的条件获取一批记录,scan方法

scan 可以通过setCaching 与setBatch 方法提高速度

scan 可以通过setStartRow 与setEndRow 来限定范围

scan 可以通过setFilter 方法添加过滤器,这也是分页、多条件查询的基础

请详细描述Hbase中一个Cell 的结构

HBase 中通过row 和columns 确定的为一个存贮单元称为cell。
Cell:由{row key, column(= +

请描述如何解决Hbase中region太小和region太大带来的冲突.

Region过大会发生多次compaction,将数据读一遍并重写一遍到hdfs 上,占用io,region过小会造成多次split,region 会下线,影响访问服务,调整hbase.hregion.max.filesize 为256m.

start-hbase.sh 为起点,Hbase 启动的流程是什么?

简述 HBASE中compact用途是什么,什么时候触发,分为哪两种,有什么区别,有哪些相关配置参数?

在hbase中每当有memstore数据flush到磁盘之后,就形成一个storefile,当storeFile的数量达到一定程度后,就需要将 storefile 文件来进行 compaction 操作。
Compact 的作用:
1>.合并文件
2>.清除过期,多余版本的数据
3>.提高读写数据的效率
HBase 中实现了两种 compaction 的方式:minor and major. 这两种 compaction 方式的区别是:
1、Minor 操作只用来做部分文件的合并操作以及包括 minVersion=0 并且设置 ttl 的过
期版本清理,不做任何删除数据、多版本数据的清理工作。
2、Major 操作是对 Region 下的HStore下的所有StoreFile执行合并操作,最终的结果是整理合并出一个文件

大量数据查询时为什么hbase比oracle ,mysql等rdbms 快的多(读写两方面)

rowkey 索引即数据(分布式索引是成功的关键)
找到要读取数据的region所在的RegionServer,然后按照以下顺序进行读取:先去BlockCache读取,若BlockCache没有,则到Memstore读取,若MemStore中没有,则到HFile中读取。
Hbase的表会被划分为1….n个Region,被托管在RegionServer中。Region二个重要的属性:Startkey与EndKey表示这个Region维护的rowkey的范围,当我们要读写数据时,如果rowkey落在某个start-end key范围内,那么就会定位到目标region并且读写到相关的数据。

mysql 即使是索引,数据量大之后,对索引仍是全部扫描(索引一般是B+树的数据结构)

找到要写入数据的region所在的RegionServer,然后将数据先写到WAL中,然后再将数据写到MemStore等待刷新,回复客户端写入完成。

hbase面试题

【面试】HBase面试题

hbase 里的几个最小单元

Region是Hbase中分布式存储和负载均衡的最小单元,不同Region分布到不同RegionServer上。

Region虽然是分布式存储的最小单元,但并不是存储的最小单元。Region由一个或者多个Store组成,每个store保存一个columns family;每个Strore又由一个memStore和0至多个StoreFile组成,StoreFile包含HFile;memStore存储在内存中,StoreFile存储在HDFS上。

什么是数据热点和数据倾斜问题

解决方案: 散列化 预分区

hbase物理存储

而每个columnFamily实际上在底层是一个文件,那么文件越小,查询越快,所以讲经
常一起查询的列设计到一个列簇,但是列簇不宜过多。