面试总结
目前就上海招聘的信息来看: 一、etl、sql工程师占60%,多半是外包 (一)笔试多是sql,典型的 1.Hive 实现wordcount select word,count(*) from ( select explode(split(sentence,' ')) as word from article b ) t group by word 2.类似于这种购买占比或者平均数(每个用户一个订单平均是多少商品trains:对应的一个订单多少商品/订单数order_id,product_id) select user_id,sum(pro_cnt)/count(1) order_2 , avg(pro_cnt) order_avg from orders o join (select order_id,count(product_id) pro_cnt from train group by order_id) t on t.order_id=o.order_id group by user_id limit 10 3.每个用户最喜爱购买的三个product是什么,最终表结构可以是三个列,也可以是一个字符串/数组 类似于topn select user_id, collect_list(concat_ws('_',product_id,cast(row_num as string))) as pro_top3, size(collect_list(product_id)) as top_size from ( select user_id, product_id, top_cnt, row_number() over(partition by user_id order by top_cnt desc) as row_num from ( -- user_id,product_id,count(1)这个用户其中一个商品购买了几次 select ord.user_id as user_id, pri.product_id as product_id, count(1) over(partition by user_id,product_id) as top_cnt from (select * from orders where eval_set='prior')ord join (select * from order_products_prior limit 10000)pri on ord.order_id=pri.order_id -- group by ord.user_id,pri.product_id )t )t1 where row_num <=3 group by user_id limit 10; 4.每个用户在一周中的购买订单的分布(列转行) user_id,dow0,dow1,dow2,dow3,dow4...dow6 1 0 0 1 2 2 0 select user_id, sum ( case when order_dow='0' then 1 else 0 end) dow0, sum ( case when order_dow='1' then 1 else 0 end) dow1, sum ( case when order_dow='2' then 1 else 0 end) dow2, sum ( case when order_dow='3' then 1 else 0 end) dow3, sum ( case when order_dow='4' then 1 else 0 end) dow4, sum ( case when order_dow='5' then 1 else 0 end) dow5, sum ( case when order_dow='6' then 1 else 0 end) dow6 from orders group by user_id 类似于 张三 70 语文 张三 60 数学 张三 80 物理 姓名 语文 数学 物理 张三 70 60 80 select name, sum (case when subject='语文' then score else 0 end) ‘语文’ sum (case when subject='数学' then score else 0 end) ‘数学’ from student group by name; (二)hive的基础知识: 1.hive只是个提交命令的客户端:原理提交的sql提交到集群,解析为mapreducer,有解析器,优化器,执行计划 元数据是存在设置的关系型数据库mysql 比如表的schema信息,注册的udf函数,数据路径等等 2.外部表与内部表、分区表、桶表等 使用场景与各自的特点 3.hive的优化,写sql当然是sql优化优先,资源优化、 4.hive的引擎默认是mr ,可以配置spark与tez,加快执行速度,hive on spark 的配置版本对应是特别严格的,原生hive与spark集成的需要修改pom文件的依赖编译源码,clouder的没试过 5.自己项目中hive sql的业务逻辑必须清楚 6.数仓建模 (1)维度建模的心型模型,雪花模型 各自的优缺点 (2)公司数据仓库的分层与设计架构 (我也不是很清楚,源表-清洗->dw()->事实表、维度表-》业务统计-》临时表-》结果表) (3)调度工具,oozie,crontab ?依赖性怎么解决的 数据量小无依赖? (4)spark sql进行数据仓库建模-》源表(hive的)-》createTempView-》字段抽取-》中间表->结果表(mysql)? 二、Hadoop、spark语言开发占30% 1.离线业务存hbase的数据 (1)habse的java 开发接口put get scan 等 (2)hbase master掉了,可以读写数据 regionserver的元数据信息在zk上 master负责region的分裂与管理 (3)hbase 的过滤器 单列过滤器singeColumnFilter,rowkey前缀匹配rowRegxFilter,rowkey包含某字符串的过滤器、通过scan.setFilter设置扫描前的过滤器 (4)hbase 的row设计原则,hbase的三大机制(split、合并、flush)、底层lru缓存策略、regionsever与hfile、storefile,等原理 (5)habse 与phoniex集成 写sql 或者直接使用java( get scan )进行数据查询 web展示 2.写过mr程序吗? (1)mr的setup ,map,reduce三个主要方法的含义 (2)自定义输出mysql 类继承outputformat 重写context.write的子类方法,mr读取hbase继承 tableMapper类,返回值的value 是查询的行数据 (3)mapreduce的执行过程,及大概的原理 3.重头戏java 考察一个程序员是否具有开发能力的标准 (1).数据结构与算法 数据结构必须掌握:数组、链表、树、图,基于这些去看算法(创建二叉树,前中后序遍历二叉树、反转树、霍夫曼树) 算法:光排序的就有8种以上 https://leetcode-cn.com/problemset/all/(50到 经典算法面试 循序渐进的过程必须练习才可以达到人家要求多写) 被问到的:单链表反转,快排,寻找连续的n个数组成的最小值 (2)基本知识 集合、多线程、反射 基本是问的头皮发麻 https://zhuanlan.zhihu.com/p/26679704 被问到hashmap的初始容量16 ,扩容因子3/4 ,底层数据结构 entry数组内存节点相连的链表 ) 扩容机制 与hash机制、put 与get 的实现 jdk1.7与1.8的不一样 java.utils.concurrent包里的concurrentHashmap的实现原理 线程安全一些概念cas与自旋 volatile与同步关键字、等一些知识 太复杂,要学的太多了 ,乱乱乱 jdk1.7与1.8的不一样 (3)设计模式 重点 手动要写一边 (4)web方面 spring框架的原理与概念(事物、ioc、aop) 其他的会用就行 (5)redis 4.spark开发 (1)spark与mr的特点,区别 (2)rdd的特性 (3)map与mappatotion,foreach与foreachPatiotion的算子的区别 (4)开发中遇到哪些算子 map、filter、reducebykey,reduce,groupbykey,zip,join,leftjoin等等 (5)rdd转dataframe 样例类继承product接口后,字段可以超过22个 rdd与dataframe的区别 (6)spark sql使用的是写sql 还是算子api的方式 (7)task与分区对应,stage、job 、是咋们划分的 webui是怎么进行观察调优的 (8)如何给rdd或者df 加一列唯一主键 zipWithIndex()算子或者 zipWithUniqueId() (9)spark sql api方式的这种 :funtions包里面的算子与udf函数定义 import org.apache.spark.sql.functions._ val avg_udf = udf((sm: Long, cnt: Long) => sm.toDouble / cnt.toDouble) // udf的使用: jproduct.withColumn("mean_re", avg_udf(col("sum(reordered)"), col("count"))).show(5) jproduct.withColumn("mean_re", avg_udf(col("sum_re"), col("count"))).show(5) jproduct.selectExpr("*", "sum_re/count as mean_re") (10)spark sql与hive集成 做etl (11)spark streaming的与kafak的集成方式 默认的分区规则,两种方式的弊端, direct模式如何实现精准一次的语义,代码改变checkpoint序列化错误 如何实现自主管理偏移量 kafka的消费者的节点的增减,重新负载均衡问题的offset提交策略问题(难难难理解) structstreaming用过没 有啥特征 (12)scala与java的对比 区别 特性 柯力化函数意思? (13)手写实现一些逻辑 top n 简单 ,rdd的左右join问题,分类型保存数据的实现 foldleft聚合算子的用法 (14)case关键字的偏函数 (15)sparkStreaming kafka出现[9点到9点边有]脏数据如何去掉,处理完成替换jar包是 这段时间的数据堆积问题 (16)spark 依赖的第三方jar 通过submit提交 避免报错 --jars 或者配置到spark的classpath 提交是 (17)提交数据 根据数据量与集群资源 你给定的核数 内存数 总核数 怎么去划分的 (18) 三、其他平台开发、数据采集开发10% 这种已经是大数据应用开发 开源二次开发 开源组件集成 自己业务平台 1.flume的断点续传 2.必问的jvm调优 内存模型 用过啥java的资源,线程的监控工具没?jconlse、jvisualvm 链接https://jingyan.baidu.com/article/e9fb46e172e3747521f76611.html 3.yarn的调度策略、集群调优经验、spark提交资源按照啥规则算法在每个节点上进行executor分配的 4.多线程与设计模式 必须会而且懂得深