目录
7.spark SQL 和hive on spark有什么区别?
Hadoop
1.Hadoop的主从架构
hdfs
它是一个分布式文件系统,用来存储海量数据。其架构概述:
(1)namenode,负责指挥数据的存储;
(2)datanode,主要负责数据的存储;
(3)seconderynamenode,主要辅助namenode工作
yarn
它用于hadoop的资源和作业的调度。其架构概述:
(1)resourcemanager,负责指挥资源分配;
(2)nodemanager,真正的单个节点服务器资源
2.HDFS副本放置策略
生产上读写操作,选择DN节点进行读取
第一副本:
1.放置在client上传的DN节点
2.client 不在DN节点 ,就随机选择一个DN
第二个副本:
放置在第一个副本不同的机架上的某个DN节点
第三副本:
与第二个副本相同机架的不同节点上
3.HDFS参数设置的优先级
- 默认配置文件
core-default.xml
hdfs-default.xml
mapred-default.xml
yarn-default.xml
- 生产配置文件
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
- 代码里面设置的参数
Configuration
优先级排序:代码里面设置的参数 >生产配置文件 > 默认配置文件
4.hdfs的读写流程
写流程:
- Client 调用FileSystem.crete(filepath),让NameNode进行RPC通信,NameNode去检查这个路径的文件是否已经存在、是否有权限能够创建这个文件,如果可以就创建一个新的文件,但这时还没有写数据,是不关联任何block的。NameNode根据上传的文件的大小、块大小、副本数参数,计算要上传多少块和块存储在DataNode的位置,最终将这些信息返回给FSDataOutputStream对象(客户端 )
- Client调用write方法,将第一个块的第一个副本数写第一个DataNode节点,写完去第二个DataNode节点写第二个副本,写完去第三个DataNode节点写第三个副本,当第三个副本写完,就返回一个ack package,确认包给第二个DataNode节点;当第二个DataNode节点接收到这个ack packet确认包,加上自己也写完了就返回一个ack package给第一个DataNode节点;当第一个DataNode节点收到这个ack确认包,加上自己也写完了第一个DataNode节点,将ack package 返回给FSDataOutputStream对象,就表示第一个块 的三个副本写完。其他块也是以此类推。
- 当所有的块全部写完 ,client调用FSDataOutputStream对象的close方法告诉NameNode文件写完了 。
读流程:
- Client调用FS.open(filepath)与NN进行RPC通讯,返回该文件的部分或者全部的block列表
给FSDataInputStream对象。
- Client调用FSDataInputStream对象的read方法,去与第一个块的最近的DataNode进行读取。读取完成会check, 假如ok 就关闭与DataNode通信。假如读取失败,会记录 DataNode和block信息 ,下次就不会从这个节点读取。那么就从第二个节点读取,然后去与第二个块的最近的DataNode进行读取,以此类推。假如当block列表全部读取完成,文件还没有读取完,继续调用FS从NameNode获取下一个批次的block列表,以此类推。
- Client调用FSDataInputStream对象的close方法,关闭输入流。
5.文件块丢失怎么办
- 用hdfs fsck / 查看hdfs block是否丢失
- 若hdfs block丢失,不用解决 hdfs 高容错 自动恢复;手动进行恢复 丢失的block,
hdfs debug recoverLease -path <filename> [-retries <num-retries>]
Hive
1.sort by 和 order by 的区别
- order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
- sort by不是全局排序,其在数据进入reducer前完成排序. 因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1, 则sort by只保证每个reducer的输出有序,不保证全局有序。
2.内部表和外部表的区别
- 内部表数据由Hive自身管理,外部表数据由HDFS管理;
- 内部表被drop以后,mysql和HDFS上的数据都会被清空,外部表被drop以后,mysql上的数据没了,但是HDFS上的数据还存在。
参考:(7条消息) mysql 外部表_内部表和外部表的区别_灯灯藕粉的博客-CSDN博客
3.yarn执行流程
- client给rm apps发送请求 去运行 jar (app master)
- apps 分配一个container 去运行app master
- app master 向 apps manager去注册 yarn web 可以看到job 运行情况
- app master 向 resouce scheduler 申请资源运行我的代码
- nodemanager会开启资源container去运行map task reduce task
- task 会向app master汇报代码的运行情况
- 当运行完成之后app master 会给 apps manager通知我的作业运行完成了 请求释放资源
- apps manager收到请求之后通知客户端你的代码运行完成了
4.hive有哪些保存元数据的方式
内嵌模式,本地模式,远程模式
5.Hive中有没有遇到数据倾斜,怎么解决的?
- map端数据倾。当单个文件大小稍大于block的大小可以适当的增加map的个数。
- Join 倾斜。大表 Join 大表:运行时优化,采用skewjoin(倾斜关联)开启对倾斜数据join的优化;
大表 Join 小表,开启map端join: set hive.auto.convert.join = true; 默认是打开的。开启该设置后,join时会在map端将小表缓存到内存中(缓存为hash table),在map端执行join。小表默认是 1000行或者25Mb大小。可以通过设置参数提高小表的阈值 :
set hive.mapjoin.smalltable.filesize=25000000;
- Count distinct 倾斜,将 count distinct 改写为 group by 的写法
参考:(7条消息) 【HIVE数据倾斜常见解决办法】_hive join 数据倾斜_xiannon的博客-CSDN博客
Spark
1.Spark的特点
速度快
spark基于内存计算,利用DAG执行引擎高效处理数据流。
易用性
spark支持开发语言有java、scala、python、sql多种语言,封装好了多种外部数据源,支持超过80种高级算子。
通用性
spark有多个子模块,它们之间可以进行交互式使用。
sparkcore(离线计算),sparksql(离线计算),sparkstreaming(实时计算),structstreaming(实时计算),mllib( 机器学习),图计算(图处理)。
运行作业的地方
yarn,mesos,k8s,standalone[spark本身集群 ]
2.Master spark作业运行模式
(1)local模式
(2)standalone集群模式
(3)yarn集群
3.RDD算子
(1)transformation操作下的算子:
map,filter,mapPartitionsWithIndex,mapvalues,flatMap
glom : 把每一个分区的数据形成一个数组 比mapPartitionsWithIndex
sample:抽样
union : 简单数据合并,不去重
intersection:交集
subtract:差集,出现在a里面的元素的 没有出现在b里面的 叫差集
distinct :去重
groupByKey:按key进行分组
reduceByKey:只对key进行去重
groupby:自定义分组,灵活
sortByKey:按照key进行排序
sortby:自定义排序,灵活
转换算子常用的:
map、flatmap、filter、mapparitions、distinct、
groupby、sortby、reducebykey、mapvalues
(2)actions操作下的算子:
collect(),foreach(),foreachpartition,reduce,first(),top,countByKey()
常用:
foreach()
foreachpartition
4.RDD的宽窄依赖
窄依赖:父 RDD 的每个分区最多只能被子 RDD 的一个分区使用
宽依赖:父 RDD 的每个分区可以被子 RDD 的多个分区使用
5.spark执行流程
(1)spark作业运行在集群上有一系列进程
(2)SparkContext 去协调这些进程(driver、executors)
(3)运行spark作业:
sc去连接 cluster manager;
cluster manager 给spark作业分配资源;
spark一旦连接上cluster;
sc 发送代码给executor,发送task去executor运行;
6.创建DataSet的几种方式
(1)由DataFrame转化成DataSet
(2)通过SparkSession.createDataSet()直接创建
(3)通过toDS方法隐式转换
7.spark SQL 和hive on spark有什么区别?
- Hive on Spark把Spark作为Hive的一个计算引擎,将Hive的查询作为Spark的任务提交到Spark集群上进行计算。
- Spark SQL是spark套件中一个模板,它将数据的计算任务通过SQL的形式转换成了RDD的计算,类似于Hive通过SQL的形式将数据的计算任务转换成了MapReduce。
参考:浅谈Hive on Spark 与 Spark SQL的区别-云社区-华为云 (huaweicloud.com)
kafka
1.kafka的ack机制
ack=0时,生产者不会等待broker的ack,这个延迟最低但是存储的保证最弱,当server挂掉的时候就会丢数据;
ack=1时,服务端会等待ack值,leader副本确认接收到消息后,发送ack,但是如果leader挂掉后它不确保是否复制完成新leader也会导致数据丢失;
ack=-1时,同样在1的基础上,服务端会等所有的follower的副本收到数据后才会收到leader发出的ack,这样数据不会丢失。
2.kafka怎么保证数据的可靠性?
- Kafka 的分区多副本架构是 Kafka 可靠性保证的核心,把消息写入多个副本可以使 Kafka 在发生崩溃时仍能保证消息的持久性
- 如果我们要往 Kafka 对应的主题发送消息,我们需要通过 Producer 完成。Kafka 在 Producer 里面提供了消息确认机制,可以在定义 Producer 时通过 acks 参数指定,根据实际的应用场景,我们设置不同的 acks,以此保证数据的可靠性。
- 为了保证数据的可靠性,我们最少需要配置一下几个参数:
(1)producer 级别:acks=all(或者 request.required.acks=-1),同时发生模式为同步 producer.type=sync
(2)topic 级别:设置 replication.factor>=3,并且 min.insync.replicas>=2;
(3)broker 级别:关闭不完全的 Leader 选举,即 unclean.leader.election.enable=false;
参考:Kafka 是如何保证数据可靠性和一致性 - 腾讯云开发者社区-腾讯云 (tencent.com)
3.Kafka挂了如何处理?
- 紧急处理方式:先尝试重新启动一下,如果能启动正常,那直接解决。
- 分析影响:分析数据的一致性(丢数、重复、乱序)。如果数据出现问题,在日志服务器有30天备份
- 定位问题:查看Kafka日志
- 解决问题:如果因为资源问题,如CPU使用率过高等,考虑增加内存、增加CPU、网络带宽。
4.kafka数据积压怎么办?
(1)如果是Kafka消费能力不足,则可以考虑增加Topic的分区数,并且同时提升消费组的消费者数量,消费者数= 分区数。(两者缺一不可)增加分区数通过alter命令完成。
(2)如果是下游的数据处理不及时:提高每批次拉取的数量。批次拉取数据过少(拉取数据/处理时间<生产速度),使处理的数据小于生产的数据,也会造成数据积压。
5.Zookeeper对于Kafka的作用是什么
- Broker是分布式部署并且相互之间相互独立,但是需要有一个注册系统能够将整个集群中的Broker管理起来,此时就使用到了Zookeeper。
- 在Kafka中,同一个Topic的消息会被分成多个分区并将其分布在多个Broker上,这些分区信息及与Broker的对应关系也都是由Zookeeper在维护
参考:Zookeeper 在 Kafka 中的作用 - 简书 (jianshu.com)
shell
shell 脚本中所有循环的语法
循环:
for i in $( ls ); do
echo item: $i
done
while 循环:
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]; do
echo The counter is $COUNTER
let COUNTER=COUNTER+1
done
直到循环:
#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]; do
echo COUNTER $COUNTER
let COUNTER-=1
done
2.在脚本中获取脚本名称
$0
3.从文件中获取最后一行和第一行
tail -1 head -1
4.将字符串添加到字符串
V1="Hello"
V2="World"
V3=$V1+$V2
echo $V3
输出
Hello+World
5.& 和 && 有什么区别
& - 当我们想要将脚本放到后台时使用它
&& - 当我们想要执行命令/脚本时,如果第一个脚本成功完成