经典大数据题目
-
hdfs的读写流程
答:
client访问NameNode,查询元数据信息,获得这个文件的数据块位置列表,返回输入流对象。
就近挑选一台datanode服务器,请求建立输入流 。
DataNode向输入流中中写数据,以packet为单位来校验。
关闭输入流 -
mr on yarn 流程
(1、)客户端提交作业申请
- 客户端向ResourceManager(后续简称RM)提交作业申请。
- RM根据申请内容返回相关的信息(例如根据input的路径,返回对应的文件元数据,还有作业资源的提交路径)。
- 客户端根据RM返回的信息生成资源文件(job.split、job.xml、app.jar)并将资源文件提交至提交路径(一般存放在 hdfs上)
- 资源文件提交完毕,向RM申请运行applicationMaster(后续简称AM)。
(2、)RM处理用户请求
- RM将用户的请求打包为task,放置调度队列,根据当前yarn的调度模式进行调度(YARN提供的三种任务调度策略:FIFO Scheduler,Capacity Scheduler 和 Fair Scheduler)。
(3、)NodeManager(后续简称NM)从队列中获取task。
- 创建contianer容器启动AM。
- 下载资源文件。
(4、)AM向RM申请运行mapTask容器,RM将请求再打包为task放置调度队列。
- 其它NM获取到task后会再创建contianer容器并下载资源文件,contianer中的mapTask任务由AM负责监控和调度。
(5、)AM向maptask发送程序启动命令。
(6、)contianer运行mapTask
- 当各节点mapTask运行完毕后,AM重复3.4的步骤(这次申请运行reduceTask)。
(7、)程序运行完成后,AM向RM注销自己 -
spark on yarn(driver在cluster、driver在本地)
-
spark on yarn-client 和spark on yarn-cluster的区别
(1)SparkContext初始化不同,这也导致了Driver所在位置的不同,YarnCluster的Driver是在集群的某一台NM上,但是Yarn-Client就是在driver所在的机器上;
(2)而Driver会和Executors进行通信,这也导致了Yarn_cluster在提交App之后可以关闭Client,而Yarn-Client不可以;
(3)最后再来说应用场景,Yarn-Cluster适合生产环境,Yarn-Client适合交互和调试。 -
hive外部表和内部表的区别
未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);
区别:
内部表数据由Hive自身管理,外部表数据由HDFS管理;
内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定;
删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;) -
hive的udf函数永久生效和临时生效
临时函数和永久函数的区别: 临时函数仅对当前session(黑窗口)有效。 永久函数是全局的。
临时函数:语法:CREATE TEMPORARY FUNCTION function_name AS class_name;
function_name函数名
class_name 类路径,包名+类名
实例:
– 创建sayhello函数
hive> create temporary function sayhello as ‘com.ruozedata.bigdata.HelloUDF’;
永久函数:CREATE FUNCTION [db_name.]function_name AS class_name
[USING JAR|FILE|ARCHIVE ‘file_uri’ [, JAR|FILE|ARCHIVE ‘file_uri’] ]; -
hadoop的文件格式有哪些
面向列:Parquet , RCFile,ORCFile
面向行:SequenceFile,MapFile,Avro Datafile -
压缩格式有哪些
bzip2、gzip、lzo、snappy -
spark的rdd,df,ds的区别
RDD不支持SQL
DF每一行都是Row类型,不能直接访问字段,必须解析才行
DS每一行是什么类型是不一定的,在自定义了case class之后可以很自由的获 得每一行的信息
DataFrame与Dataset均支持spark sql的操作,比如select,group by之类,还 能注册临时表/视窗,进行sql语句操作
Dataset在需要访问列中的某个字段时是非常方便的,然而,如果要 写一些适配性很强的函数时,如果使用Dataset,行的类型又不确定,可能是 各种case class,无法实现适配,这时候用DataFrame即Dataset[Row]就能比较 好的解决问题。 -
spark的reducebykey和groupbykey的区别