面试记录


本问使用时间倒序排列记录面试题

kafka 单个 topic数据的有效时间,自定义

/kafka-configs.sh --zookeeper localhost:2181 --alter --entity-name testtopic --entity-type topics --add-config retention.ms=86400000

retention.ms=86400000 为一天,单位是毫秒。
如果数据没有立即删除,执行下面

./kafka-topics.sh --zookeeper localhost:2181 --alter --topic testtopic --config cleanup.policy=delete

flume的搭建

配置flume-env.sh配置文件

修改JDK路径

在conf/ 下进行配置脚本

分发:

scp -r /opt/module/ root@hadoop102:/usr/

dws与dwd的区别

dws:主题层,用于提供后续的业务查询,OLAP分析,数据分发等

dwd:明细层,

zk的选举

切片和切块的区别

1、物理切块:
物理切块是HDFS对数据进行存储时,会存储3个副本到从节点上进行分布式存储,保证存储数据的高可用性;需要对元数据进行物理切块,每个block块默认128M。
2、逻辑切片:
split是一种逻辑切片,是MapReduce里的概念,用对象来封装每一个切片的信息,是在数据处理前进行任务分发时对
任务切片逻辑确定maptask数量,每一个输入文件至少有一个切片;每一个切片运行一个maptask。
3、物理切块和逻辑切片大小:
split的大小在默认的情况下和HDFS的block切块大小一致,为了是MapReduce处理的时候减少由于split和block之间大小不一致导致的网络传输下载。

checkpoint 的机制

为了使 Flink 的状态具有良好的容错性,Flink 提供了检查点机制 (CheckPoints) 。通过检查点机制,Flink 定期在数据流上生成 checkpoint barrier ,当某个算子收到 barrier 时,即会基于当前状态生成一份快照,然后再将该 barrier 传递到下游算子<期间,当前算子会暂停自己的数据处理过程>,下游算子接收到该 barrier 后,也基于当前状态生成一份快照,依次传递直至到最后的 Sink 算子上。当出现异常后,Flink 就可以根据最近的一次的快照数据将所有算子恢复到先前的状态。

JobManager端的 CheckPointCoordinator向 所有SourceTask发送CheckPointTrigger,Source Task会在数据流中安插CheckPoint barrier

Coordinator:协调员

Trigger:触发器

如果检查点的持续时间超过了设定的超时时间,CheckPointCoordinator就会任务本次CheckPoint失败。会把这次的CheckPiont 产生的所有状态数据删除

checkpoint中保存的是什么信息

Checkpoint是通过给程序快照的方式使得将历史某些时刻的状态保存下来,当任务挂机以后,默认从最近一次保存的完整快照处进行恢复任务。

barrier对齐:

image

  • 一旦Operator从输入流接收到CheckPoint barrier n,它就不能处理来自该流的任何数据记录,直到它从其他所有输入接收到barrier n为止。否则,它会混合属于快照n的记录和属于快照n + 1的记录;
  • 接收到barrier n的流暂时被搁置。从这些流接收的记录不会被处理,而是放入输入缓冲区。
  • 上图中第2个图,虽然数字流对应的barrier已经到达了,但是barrier之后的1、2、3这些数据只能放到buffer中,等待字母流的barrier到达;
  • 一旦最后所有输入流都接收到barrier n,Operator就会把缓冲区中pending 的输出数据发出去,然后把CheckPoint barrier n接着往下游发送
  • 这里还会对自身进行快照;之后,Operator将继续处理来自所有输入流的记录,在处理来自流的记录之前先处理来自输入缓冲区的记录。

barrier不对齐?

checkpoint 是要等到所有的barrier全部都到才算完成

barrier不对齐就是指当还有其他流的barrier还没到达时,为了不影响性能,也不用理会,直接处理barrier之后的数据。等到所有流的barrier的都到达后,就可以对该Operator做CheckPoint了;

为什么要进行barrier对齐?不对齐到底行不行?

Exactly Once时必须barrier对齐,如果barrier不对齐就变成了At Least Once<至少一次>;

第一种场景计算PV,kafka只有一个partition,精确一次,至少一次就没有区别?《没有区别,因为barrier是多个转一个》

为了下游尽快做CheckPoint,所以会先发送barrier到下游,自身再同步进行快照;这一步,如果向下发送barrier后,自己同步快照慢怎么办?下游已经同步好了,自己还没?

答: 可能会出现下游比上游快照还早的情况,但是这不影响快照结果,只是下游快照的更及时了,我只要保障下游把barrier之前的数据都处理了,并且不处理barrier之后的数据,然后做快照,那么下游也同样支持精确一次。这个问题你不要从全局思考,你单独思考上游和下游的实例,你会发现上下游的状态都是准确的,既没有丢,也没有重复计算。这里需要注意一点,如果有一个Operator 的CheckPoint失败了或者因为CheckPoint超时也会导致失败,那么JobManager会认为整个CheckPoint失败。失败的CheckPoint是不能用来恢复任务的,必须所有的算子的CheckPoint都成功,那么这次CheckPoint才能认为是成功的,才能用来恢复任务;

state和CheckPoint的保存位置:

默认情况下,State 会保存在 TaskManager 的内存中,CheckPoint 会存储在 JobManager的内存中。State 和 CheckPoint 的存储位置取决于 StateBackend 的配置。Flink 一共提供了 3 种 StateBackend 。 包 括 基 于 内 存 的 MemoryStateBackend 、 基 于 文 件 系 统 的FsStateBackend,以及基于 RockDB 作为存储介质的 RocksDBState-Backend。

  • 是否删除 Checkpoint 中保存的数据:
env.getCheckpointConfig().enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);

设置为 RETAIN_ON_CANCELLATION:表示一旦 Flink 处理程序被 cancel 后,会保留CheckPoint 数据,以便根据实际需要恢复到指定的 CheckPoint。
设置为 DELETE_ON_CANCELLATION:表示一旦 Flink 处理程序被 cancel 后,会删除CheckPoint 数据,只有 Job 执行失败的时候才会保存 CheckPoint

flink内存模型

堆内内存和堆外内存

memoryManager的内存大小

flink任务的提交流程

image-20210909213737109

https://www.cnblogs.com/gzgBlog/p/14928133.html

flink 的几个组件

JobManager

TaskManager

Dispather

ResourceManager

flink的resourceManager和yarn的resourceManager的区别

join 的开窗

flink的join开窗有几种

flink的版本

可视化报表所用的组件

topN指标的统计

时序数据库

数据分布

容错机制

资源管理

各种API

DataSetAPI

DataStream API

Table API

Flink ML,Flink 的机器学习库

Flink和Spark Streaming 的区别

Flink 是标准的实时处理引擎,基于事件驱动,而Spark Streaming是微批的模型

Flink根据用户提交的代码生成StreamGraph,经过优化生成JobGraph,然后提交给JobManager进行处理,JobManager会根据JobGraph生成ExecutionGraph,ExecutionGraph是Flink调度最核心的数据结构,JobManager根据ExecutionGraph对Job进行调度。

Flink的时间语义:

事件时间

注入时间

处理时间

watermark机制

如何保证Flink的sink输出数据的不重复

flink如何保证端到端精准一次性消费

输出到clickhouse保证一次精准吗?

幂等操作,然后clickhouse有表引擎支持

MySQL和Kafka支持端到端的精准一次,因为有事务

exactly-once

image

flink数据输出到clickhouse

flink背压算法

动态反馈/自动反压

实时数仓每一层是干啥的,注意点,细节处理

ck用replacingMergerTree
支持幂等性

Flink从Kafka读取数据,把处理结果写入Redis/HBase/Kafka,如何保证Exactly-once ?

用redis的hash去重

hbase会有相同rowkey的版本,刷写的时候合并

需要开启sink的wal

sink端保证数据准确有两种方式,一是幂等操作,二是进行一个事务

如何确保状态拥有精确一次的容错保证?

如何在分布式场景下替多个拥有本地状态的算子产生一个全域一致的快照?

如何在不中断运算的前提下产生快照?

Flink的两阶段提交

HBase的热点问题

hbase 建立二级索引

无答案版本: https://www.cnblogs.com/Anxc/p/15225294.html

flink 面试题参考: https://blog.csdn.net/wypblog/article/details/103900577

数据治理:https://mp.weixin.qq.com/s/DmrXAMXJNuXsWflgGcWCnA

013

Kafka的优势如下:

高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒;
可扩展性:kafka集群支持热扩展;
持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失;
容错性:允许集群中节点故障(若副本数量为n,则允许n-1个节点故障);
高并发:支持数千个客户端同时读写。

flume日志采集系统的优势如下:

高可靠性:使用事务的办法来保证event的可靠传递
高可用性:
分布式:可以有多个agent的联合使用,体现如下图:
image

failover 故障转移
flinkCDC和普通的CDC 的区别

CDC:CDC是Change Data Capture(变更数据获取)的简称。核心思想是,监测并捕获数据库的变动
而flinkCDC出现的意义是:可以将读取数据和加工数据一并完成

CDc:CDC是 Change data Capture(变更数据获取)的简称。核心思想是,监测并捕获数据库的变动
而 flinkCDo出现的意义是:可以将读取数据和加工数据一并完成

hbase中有多少数据量 <可以在HBase web ui界面中看到数据量的多少>
yarn 的 applicationMaster 的作用
有一个DataNode突然 宕机以后该怎么办
sqoop导出hive数据到MySQL时,需要提前在MySQL中创建表嘛?

需要,导出模式有增量,全量,更新<一般不要用>
oracle好像特殊,就说只用过导出到MySQL。
sqoop导数据 mysql -> HDFS 需要提前建表嘛?
不需要,因为我们是分区表dt,手动 load data path 'hdfs://...'

阿里一面:

一面 问你项目 包括 数仓搭建的 构建流程 还有 离线的流程跟 里面的 某个框架 flume kafka 还有 存储介质 有哪些 分别 有什么区别 还有就是 flink项目 包括精准一次性 checkpoint 包括 里面 某些算子的使用 还有就是 你们公司你负责什么模块 具体做什么 人员分配等等

rowkey如何设计:

https://help.aliyun.com/document_detail/281722.html

redis的多路复用:

https://www.cnblogs.com/hujingnb/p/12439661.html

其实它和select版本的区别简单来说, epoll是将你需要监听的列表交给系统维护, 这样当有新数据来的时候, 系统知道这是你要的, 等你下次来拿的时候, 直接给你了, 少去了上面的系统遍历. 同时, 也没有select查询时那一大堆参数, 每次都只调用一次进行绑定即可.那系统是怎么知道新数据的到来呢? 这里靠的是事件中断, 忘得差不多了, 回头再看看.


012

spark的序列化 kryo
clickhouse的空值问题

建表时字段设置非空 : name Nullable(String)
查询时空值:使用case when,不能使用 coalesce(x,...) 返回第一个非NULL的值(类型转化问题)
两个表关联的时候 使用 where coalesce(b.id,0) = 0

collect_set()

select username, collect_list(video_name) from t_visit_video group by username ;
image


011

kafka如何存储非结构化数据
维度数据为什么使用HBase来存储?<Rowkey的随机读写的支持比较好>
HBase+ kyLin = ClickHouse 很像
自定义 Yarn的ApplicationMaster
yarn application -kill 杀掉 某个yarn任务
partition by和 distribute by 的区别

partition by [key] order by [key] 只能在窗口函数中使用,而distribute by [key] sort by 在窗口函数和select 中都可以使用。
窗口函数中两者是没有区别的
where 后面不能用partition by

集群迁移 distcp

hadoop distcp hdfs://master1:8020/foo/bar hdfs://master2:8020/bar/foo

数据迁移工具

sqoop,DataX,自定义


010

1.hadoop和spark调优
2.项目组有多少人,每个人都干什么活
3.你哪方面有亮点
4.留存率
5.未来三年规划
1.datanode坏了,文件会文件怎么办?
在hadoop集群中假如一个datanode挂掉,后面会发生什么。


009

Kettle : ETL工具
DataX : 数据同步工具,sqoop
DataWorks +MaxCompute : 阿里云提供的大数据解决方案
Kafka 语义:

至少一次:at-least-once
至多一次:at-most-once 
仅一次:exactly-once

一致性hash算法

hash(图片名称)% N

Kafka生产数据是按照批次进行发送的,不是按照一条一条进行发送的。

https://www.cnblogs.com/sniffs/p/13159974.html

image


008

1.为什么要用日志服务器把日志存起来?日志是流式的为什么不用时序数据库?

InfluxDB(单机版免费,集群版收费)最成熟,Kairosdb(底层使用Cassandra),OpenTsdb(底层使用HBase),beringei(Facebook开源),TimeScaleDB(底层基于PostgreSQL),TSDB(百度开源),HiTSDB(阿里开源,底层是PostgreSQL)。

2.七天内连续三天指标?
3.java和scala哪个更强,写过几千行代码的逻辑吗?
4.数据量多大?100G?太太小。
5.用过哪些压缩?压缩比?区别?
中国华能。


007

新架构: Dbus+wormhole+spark

个人了解的话,国内开发的,用的人也很少(类实时,中间使用kafka+spark Streaming )
https://bridata.github.io/DBus/more-system-architecture.html
https://blog.csdn.net/weixin_41608840/article/details/80989926

image


006

实时项目中数据为什么存到hbase中不是redis中

在实时项目中,我们最想要保证的是维度数据的数据可靠性,以及存储量的大小,同时以kv类型进行存储,所以选择了hbase。

比较方式 Redis HBase
数据类型 支持KV类型,List、Set 支持KV类型...
部署难易 部署非常简单 部署需要依赖hadoop、zookeeper等服务
数据可靠性 Redis采用的是异步复制数据,在failover时可能会丢失数据 HBase采用WAL,先记录日志再写入数据,理论上不会丢失数据
应用场景 Redis比较适合做缓存 HBase适合做大数据的持久存储
数据类型:都支持KV类型。但Redis还支持List、Set
数据量:Redis支持的数据量受内存限制,HBase没有这个限制,可以存储远超内存大小的数据。
部署难易:HBase部署需要依赖hadoop、zookeeper等服务,而Redis的部署非常简单。
数据可靠性:HBase采用WAL,先记录日志再写入数据,理论上不会丢失数据。而Redis采用的是异步复制数据,在failover时可能会丢失数据。
应用场景:HBase适合做大数据的持久存储,而Redis比较适合做缓存。如果数据丢失是不能容忍的,那就用只能用HBase;
                 如果需要一个高性能的环境,而且能够容忍一定的数据丢失,那完全可以考虑使用Redis。
综上所述,在实时项目中,我们最想要保证的是维度数据的数据可靠性,以及存储量的大小,同时以kv类型进行存储,所以选择了hbase

https://www.sohu.com/a/465715859_185201

Redis 是近几年最常用的缓存数据库,读与写的操作都在内存中进行,其速度响应非常快,AOF/RDB 保存的相关数据全会加载到我们机器的内存中,从而导致 Redis 并不适合保存大量的数据,毕竟内存还是相对有限。
Hbase 适合需对数据进行随机读操作或者随机写操作、大数据上高并发操作,比如每秒对 PB 级数据进行上千次操作以及读写访问均是非常简单的操作。

flink和sparkstreaming的区别,为什么用flink

sparkstreaming 微批
Flink 流处理 基于事件触发机制

sparkstreaming是基于微批处理的,所以采用DirecDstream的方式根据计算出的每个partition要取数据的offset范围,
拉取一批数据形成rdd进行批量处理,而且该rdd和kafka的分区是一一对应的
Flink是真正的流处理,他是基于事件触发机制进行处理,在kafkaConsumer拉去一批数据后,Flink将其经过处理之后,
变成这个record发送的事件触发式的流处理
另外,FLink支持动态发现新增topic或者新增partition,sparkstreaming和0.8版本的kafka结合是不支持的,
后来和0.10版本的kafka结合的时候支持了

如何保证kafka 的消费有序

生产有序,存储有序(一个topic的一个分区内),才能保证消费有序

kafka的集群搭建,依据什么搭建的?

奇数台,与zookeeper选举有关
 2 * (生产者峰值生产速率 * 副本 /  100)  + 1 

zookeeper 集群[HBase,Kafka]设置奇数台的原因

https://blog.csdn.net/qq_35260875/article/details/106148569

ZooKeeper集群最好使用奇数个服务器,即2n+1个服务器,这样整个Zookeeper集群最多可以容忍n台服务器宕机而保证依然提供服务。

Kafka调优,spark调优
hbase的rowkey设计规则和如何设计

规则:长度原则(越短越好),散列原则,唯一原则(唯一性)
如何设计:
1.生成随机数、hash、散列值
2.字符串反转
3.字符串拼接

1.hadoop、spark内存溢出
2.压缩格式
3.spark数据倾斜
4.spark聚合类算子
5.flink海量数据去重
6.ES的搜索过程
7.最短路径算法


005

万顺叫车:
Kafka能否保证单分区有序,retry后会不会乱序
flinktable的sink模式有几种

Upsert,Retract,Append

https://blog.csdn.net/yscoder/article/details/113731679

flink多久保存一次保存点
flink从保存点恢复时算子的唯一标识怎么确定的

join,intervaljoin,union

join:两个数据类型一致
intervaljoin:按照指定字段以及右流相对于左流偏移的时间区间进行关联,只支持事件时间
 union:多个 数据流 (但数据类型要保证一致)

flink从上游数据源消费到的重复数据怎么处理的

flink内存溢出,是怎么查看的


004

hive存储格式

1、TextFile
2、RCFile
3、ORCFile
4、Parquet

1、TextFile  
TextFile文件不支持块压缩,默认格式,数据不做压缩,磁盘开销大,数据解析开销大。这边不做深入介绍。
2、RCFile  
Record Columnar的缩写。是Hadoop中第一个列文件格式。能够很好的压缩和快速的查询性能,但是不支持模式演进。通常
写操作比较慢,比非列形式的文件格式需要更多的内存空间和计算量。
RCFile是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读
取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。
3、ORCFile
存储方式:数据按行分块 每块按照列存储 ,压缩快 快速列存取,效率比rcfile高,是rcfile的改良版本,相比RC能够更好的压
缩,能够更快的查询,但还是不支持模式演进。
4、Parquet
 Parquet能够很好的压缩,有很好的查询性能,支持有限的模式演进。但是写速度通常比较慢。这中文件格式主要是用在

sqoop优化

batch :指定使用批处理模式,可以多条相关的SQL一起执行
boundary-query:解决数据倾斜问题(新生成一条主键的形式去处理)
fetch-size:sqoop分批次去导入数据,增大导入条数
fetch-size:增大并行的map数(默认为4)
split-by:指定切割单元的列名

batch
语法:--batch,指示使用批处理模式执行底层的SQL语句。在导出数据时,该参数能够将相关的SQL语句组合在一起批量执行,也可以使用有效的API在JDBC接口中配置批处理参数

Dsqoop.export.records.per.statement
指定批处理数据条数,可和batch联合使用

boundary-query
可解决数据倾斜问题
–boundary-query: select 1 as MIN , sum(1) as MAX from table where xxx
具体原理就是通过ROWNUM() 生成一个严格均匀分布的字段,然后指定为分割字段
指定导入数据的范围值。当仅使用split-by参数指定的分隔列不是最优时,可以使用boundary-query参数指定任意返回两个数字列的查询。它的语法如下:--boundary-
query select min(id), max(id) from<tablename>。在配置boundary-query参数时,查询语句中必须连同表名一起指定min(id)和max(id)。如果没有配置该参数,默认时Sqoop使用select
min(<split-by>), max(<split-by>) from<tablename>查询找出分隔列的边界值。

fetch-size
导入数据时,指示每次从数据库读取的记录数。使用下面的语法:--fetch-size=<n>,其中<n>表示Sqoop每次必须取回的记录数,默认值为1000。可以基于读取的数据量、可用的内存和带宽大小适当增加fetch-size的值。某些情况下这可以提升25%的性能。

num-mappers
该参数的语法为--num-mappers <number ofmap tasks>,用于指定并行数据导入的map任务数,默认值为4。应该将该值设置成低于数据库所支持的最大连接数。

split-by
该参数的语法为--split-by <column name>,指定用于Sqoop分隔工作单元的列名,不能与--autoreset-to-one-mapper选项一起使用。如果不指定列名,Sqoop基于主键列分隔 工作单元。

presto连过哪些数据库

Hive mysql

kylin怎么设计cube

1、设置Cube名、描述信息等
2、设置Cube依赖的表模型(星状模型,一个事实表和可选的多个维度表)
3、设置维度(维度有几种类型这里不再讨论,创建完之后就可以暂时性的忽略这几种不同的类型,都把它当做普通的维度就可以了)
4、设置度量(每一个度量包括列和聚合函数,列只能是事实表上的列)
5、设置filter条件(用于对表中的数据进行过滤)
6、设置增量更新的信息(设置增量列和起始时间,该列必须是时间格式列)
7、高级设置(设置维度组、RowKey等)

服务器选型,fume、 kafka台数、数据量

Flume:根据业务自己看 一般三个
Kafka:  2 * (生产者峰值生产速率 * 副本 /  100)  + 1 = 3

mysql怎么建索引

主键索引,唯一索引,普通索引,全文索引

1.添加PRIMARY KEY(主键索引) 
mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 
2.添加UNIQUE(唯一索引) 
mysql>ALTER TABLE `table_name` ADD UNIQUE ( 
`column` 
) 
3.添加INDEX(普通索引) 
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 
4.添加FULLTEXT(全文索引) 
mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`) 

redis数据类型

string 字符串(可以为整形、浮点型和字符串,统称为元素)
list 列表(实现队列,元素不唯一,先入先出原则)
set 集合(各不相同的元素)
hash hash散列值(hash的key必须是唯一的)
sort set 有序集合

内部表外部表的区别
外部表不删除元数据,内部表删除元数据

EXTERANL: 外部表

  1、在导入数据到外部表,数据并没有移动到自己的数据仓库目录下(如果指定了location的话),也就是说外部表中的数据并不是由它自己来管理的!而内部表则不一样;
     2、在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!
 
     3. 在创建内部表或外部表时加上location 的效果是一样的,只不过表目录的位置不同而已,加上partition用法也一样,只不过表目录下会有分区目录而已,load data local inpath直接把本地文件系统的数据上传到hdfs上,有location上传到location指定的位置上,没有的话上传到hive默认配置的数据仓库中。
外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。 

建表语句
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name   -- EXTERANL: 外部表
[(col_name data_type [COMMENT col_comment], ...)]  -- 列名 列类型 列描述信息  ....
[COMMENT table_comment] -- 表描述信息
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] -- 创建分区表指定分区字段  分区列名  列类型
[CLUSTERED BY (col_name, col_name, ...) -- 创建分桶表指定分桶字段   分桶列名
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]  -- 指定分桶数
[ROW FORMAT delimited fields terminated by ... ] -- 指定一条数据 字段与字段的分割符
[collection items terminated by  ... ] -- 指定集合元素与元素的分割符
[map keys terminated by ... ] -- 指定map的kv的分割符
[STORED AS file_format] -- 指定文件存储格式,默认为 textfile
[LOCATION hdfs_path] -- 指定表在hdfs中对应的路径
[TBLPROPERTIES (property_name=property_value, ...)] -- 指定表的属性
[AS select_statement] -- 基于某个查询建表

宽依赖窄依赖
常见宽依赖:repartition,groupbyKey,ReduceByKey...

窄依赖:
指父RDD的每一个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区,和两个父RDD的分区对应于一个子RDD 的分区。图中,map/filter和union属于第一类,对输入进行协同划分(co-partitioned)的join属于第二类。

宽依赖:
指子RDD的分区依赖于父RDD的所有分区,这是因为shuffle类操作,如图中的groupByKey和未经协同划分的join。 


单例模式
该类负责创建自己的对象,同时确保只有单个对象被创建

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的

双重校验锁:
volatile  + synchronized(Singleton3.class)
public class Singleton3 {
    private static volatile Singleton3 instance;
    private Singleton3() {}
    public static Singleton3 getInstance() {
        //首先判断是否为空
        if(instance==null) {
            //可能多个线程同时进入到这一步进行阻塞等待
            synchronized(Singleton3.class) {
                //第一个线程拿到锁,判断不为空进入下一步
                if(instance==null) {
                    instance = new Singleton3();
                }
            }
        }
        return instance;
    }
}

spark输出10个文件想输出5个怎么调整

df.coalesce(1).saveAsTextFile("D://1.txt")

DataFrame输出结果保存为文件时,尤其是根据某个条件分区时,可以控制输出文件的个数,从而减少小文件的个数

hve分区为什么能提高效率

主要是以缩小数据查询范围,提高查询速度和性能的

没有分区的存在,那么每次查询Hive将会进行全表扫描
分区列的值将表划分为segments(文件夹)
查询时使用分区列和常规列类似
查询Hive自动过滤不用于提高性能的分区
主要是以缩小数据查询范围,提高查询速度和性能的

两数相加和为100用java实现
...

hashmap、 hashtable哪个是线程安全的
HashTable 和 ConcurrentHashMap 是线程安全的

HashTable
Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,hashtable的实现方法里面添加了synchronized关键字来确保线程同步,但是要使用HashMap的话就要自己增加同步处理了
哈希值的使用不同,HashTable直接使用对象的hashcode。而HashMap重新计算hash值。


003

中科软ETL:
Reduce输出端是小文件如何设置(配置参数)

SET hive.exec.compress.output=true;
SET mapreduce.output.fileoutputformat.compress=true;
SET hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
SET mapreduce.input.fileinputformat.split.maxsize=256000000;
SET mapreduce.input.fileinputformat.split.minsize=1;
SET mapreduce.input.fileinputformat.split.minsize.per.node=256000000;
SET mapreduce.input.fileinputformat.split.minsize.per.rack=256000000;
SET hive.merge.mapredfiles=true;
SET hive.merge.mapfiles=true;
SET hive.merge.smallfiles.avgsize=256000000;

通过执行上述参数,可以将hive计算完成后的输出文件改为大文件,避免输出大量小文件。

Linux查看磁盘挂载

指令df -h和fdisk -l

Hive的优化
MR小文件处理
MR流程
Linux命令:find 常用参数

find   -name april*                   在当前目录下查找以april开始的文件
find   /home   -size   +512k          查大于512k的文件
find . -type f                        查当前目录下的所有普通文件

Linux命令:awk 使用
df -k | awk ‘{print $1}’ | grep -v ’none’
Linux获取参数xargs n1
shell获取命令返回结果
$?的作用
hadoop 常用上传下载命令

下载文件到本地    hadoop   fs   -get   HDFS文件路径     本地路径
合并文件并下载到本地   hadoop   fs  getmerge   HDFS文件路径文件1   HDFS文件路径文件2     本地路径文件1
上传文件  hadoop  fs   -put    本地文件     HDFS路径

场景题:

hadoop 的hdfs 中有一个tmp文件夹下,有若干个文件夹和文件,
要求指删除该文件夹下小于25MB的文件,不删除原有的目录

1


002

1.sql语句的优化,如何提高查询效率。

 不要有超过5个以上的表连接(JOIN)
 考虑使用临时表或表变量存放中间结果。
 少用子查询
 between替换in
 exist替换in
 left join替换in
 能用inner join连接尽量使用inner join连接( left join、right join、子查询)

2.在sql语句运行中,什么情况下会导致索引失效。
建立联合索引:(id,name,age)
可以用到的索引:[id,name.age],[id],[id,name]
name like 'qwe%' like会导致索引失效,全表扫描

3.删除表中的数据,有几种方式。

4.如何创建索引

5.创建索引,对于字段有什么样的要求

6.索引和约束有什么区别,总共有索引,分别使用在什么样的场景。

6.如何创建存储过程

7.存储过程游标有那几种,它们由什么区别

8.存储过程由几种循环方式

9.查询结果,如果进行分组和排序,分组和排序运行的优先级是怎么样的

10.left join和inner join的区别

11.union all和union的区别用法


001

自我介绍:

姓名,毕业学校,上一家公司名称,公司产品,职位,项目简单讲一下。

HDFS读流程

MR优化

Gzip,snappy的压缩

HBase的Rowkey的设计

Hive的优化

flink的窗口

flink的时间语义

CEP的逻辑

口述一个flink去重数据

讲一下第一个项目(离线)

为什么使用HBase存储维度数据

实时数仓的几个指标说几个

双流join指定的时间是多少,水位线设置的超时时间是多少

yarn调度器

kafka的副本队列

kafka的flower如果延迟过高会怎么样(OSR和ISR)

kafka的默认清除策略(什么时候会触发)

kafka高级API《自动,手动》<没记全>

HBase写数据(WAL的刷写大小)

HBase中的RowKey设计原则

长度原则
散列原则
唯一原则
1.生成随机数、hash、散列值
2.字符串反转
3.字符串拼接(20170524000001_a12e )

HBase的列族为什么建立的很少

Region Split 到达时(就是如果一个表达到100行数据就会分裂),
分裂时所有的列族都会分裂,产生大量小文件

Flume Channel 有几种,区别

File Channel   100万event(配置多路径,增大吞吐量) 磁盘
Memory Channel  100个  内存
Kafka Channel   存于Kafka ,kafka Channel > memory Channel + Kafka sink 

flink保存状态变量的方式

MemoryStateBackend  
FsStateBackend
RocksDBStateBackend
上面这三种


//设置检查点相关配置
//  开启检查点,精准一次性消费
env.enableCheckpointing(5000, CheckpointingMode.EXACTLY_ONCE);
// 设置检查点超时时间
env.getCheckpointConfig().setCheckpointTimeout(60000);
// 设置job 取消之后,检查点是否保留   (保留)
env.getCheckpointConfig().enableExternalizedCheckpoints(
CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
// 设置状态后端,   内存|文件系统|RocksDB
env.setStateBackend(new FsStateBackend("hdfs://hadoop202:8020/gmall/flink/checkpoint"));
// 指定操作 HDFS 的用户
System.setProperty("HADOOP_USER_NAME","root");

flink常用API

addSource(new SourceFunction<Integer>(){})
flatMap()
.map(r -> Tuple2.of(r,1))
.broadcast()//广播
富函数(Rich):
RichFilterFunction<Integer>()
RichMapFunction<Integer, Long>()
addSink(new RichSinkFunction<Tuple2<Integer, Integer>>()
.keyBy(r -> r.f0);


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM