一道hadoop面试题,请大家试一试

ybyb14 2014-05-28 09:22:49
最近去面试,出了个这样的题目,大家有兴趣也试试。
用Hadoop分析海量日志文件,每行日志记录了如下数据:
TableName(表名),Time(时间),User(用户),TimeSpan(时间开销)
要求编写MapReduce程序算出高峰时间段(如上午10点)哪张表被访问的最频繁,以及这段时间访问这张表最多的用户,以及这个用户的总时间开销。
...全文
4533 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
清风v明月 2015-10-08
  • 打赏
  • 举报
回复
引用 7 楼 Q80470101 的回复:
1.高峰时间段(如上午10点)哪张表被访问的最频繁 以时间(如上午10点)为条件过滤出有效数据,统计所有表访问次数(即数据条数),top1即被访问的最频繁表,一个MR搞定。

mapper:
表A 1 // 表A 被访问1次
表A 1
表B 1
表A 1
表C 1
表B 1
reduce:
表A 3 // 表A总共被访问3此
表B 2
表C 1
------->表A访问最多
2.这段时间访问这张表最多的用户,以及这个用户的总时间开销。 以时间和表名(上一个MR已求出)为条件过滤出有效数据,统计所有用户访问次数及开销(访问次数和开销封装成一个对象),先统计访问次数得到“访问这张表最多的用户”,然后及时其“总时间开销”,一个MR。

mapper:
用A (1,5) // 用户A 访问1次,时间开销5秒
用A (1,2)
用B (1,7)
用A (1,3)
用C (1,7)
用B (1,2)
reduce:
用A (3,10) // 用户A访问3次,总时间开销10秒
用B (2,9)
用C (1,7)
------->用A访问最多,总时间开销10秒
2个MR搞定(当然,第二个MR也可以拆分成2个,那样的话需要3个。)
正解!!!
清风v明月 2015-10-08
  • 打赏
  • 举报
回复
引用 6 楼 SG90_ICT 的回复:
[quote=引用 2 楼 coke_ly 的回复:] 两个 吧,第一个 key为时间(如果 是时间段,需要抽象一下),统计用户;第二个 的key是用户id,统计相同ID的个数和TimeSpan(时间开销)。
仅有这些key是不够的吧,看楼下[/quote] 正解!!!
少主无翼 2014-11-14
  • 打赏
  • 举报
回复
一个Reduce只需要需要一次MR任务,毕竟是TopN问题,多个Reduce分担的话就需要两个MR了,其实三个需求都可以在一个Reduce中进行统计,找到访问次数最多的表就可以找到访问该表次数最多的用户以及该用户消耗的时间,通常这种需求都是通过Reduce内部使用变量保存最大值,然后不断更新获得。
yang349443767 2014-11-14
  • 打赏
  • 举报
回复
先说结论,多个mapreduce任务都是不可取的 ,只要一个mapreduce任务就能解决问题。 我们来看下问题: a)高峰时间段哪张表被访问的最频繁; b)这段时间访问这张表最多的用户; c)这个用户的总时间开销; 可见完成的问题,如果进行多个mapreduce可以解决问题,但是缺点是多个任务是串行执行,因为c要b的结果,b要a的结果,过多的占用集群的资源和浪费时间。 思路: 我们需要自定义时间段,以半小时、小时、两小时etc 取决业务需要。下面假设一个小时,那么就有24个区间 map阶段输出
if(time<10.59&&time>10.00){
context.write(tablename+"10.00-10.59",user+"/t"+timespan);
}etc....
下面是别的时间段的
key以表+时间段,value访问用户+timespan,在reduce阶段 访问用户和timespan将被combin reduce输入数据将会是: A表10.00-10.59 auser atimespan ,a1user a1timespan A表11.00-11.59 buser btimespan,b1user b1timespan A表12.00-12.59 cuser ctimespan A表13.00-13.59 duser dtimespan etc... reduce阶段主要算出在表+时间段条件下哪个用户最多,将timespan累加,同user的计数,同时剔出用户数少的,取出最大计数的用户 最终结果:A表 10.00-10.59 auser 17283712
美食爱好者 2014-11-14
  • 打赏
  • 举报
回复
一个MR就可以了。
mypeterhero 2014-11-05
  • 打赏
  • 举报
回复
真心不会!多学学吧
mryuqinghua 2014-11-04
  • 打赏
  • 举报
回复
很明显一个MR就可以搞定了, 其实都是count运算,只不过维度不同而已罢了,类似与数据库中的分析函数cube,rollup, grouping by sets, 其实该题目中如果再要一个累计访问次数就恰好筹够了一个cube了。 MAP 每行记录根据时间filter过后,emit 3个MAP (tablename, user) 1 (null, user) 1 (user, null) 1 REDUCE (tablename...,user...) 8 (null, user....) 4 (tablename...,null) 5 然后通过MultipleOutputFormat,根据Key的类型进行输出到对应的文件,可以根据组合的类别将数据结果输出到3个不同的结果文件,进而找出以上的答案。
sanguomi 2014-10-01
  • 打赏
  • 举报
回复
没注意还有个table频率, 还得加个tablevistorcount的临时 变量 每次迭代后累加,如果是table 发生变化,另外还得缓存一个另外用户的最大值钱 最后再判断是否修改.
sanguomi 2014-10-01
  • 打赏
  • 举报
回复
Key<TableName, user> value < count, value>
sanguomi 2014-10-01
  • 打赏
  • 举报
回复
数据小的话的一个reduce就可以, reduce 数据大的话两个 Key<TableName, user> value <User, count, value> TableName分区, user分组, 使用combine 用临时变量保存 上一个Tablename, User, count, value 每次迭代完, 如果usr发生变化, 如果count比上一次大,修改usr count value 如果Tablename 发生变化, 如果count 比上一次大修改 所有的临时变量, 小于则直接丢弃 该次reduce直接出来的结果只有一条记录 Tablename, User, count, value 第二次MR 直接聚合,在MAP端做比较就可以,直接输出,省略Reduce
家里敷泥呀 2014-09-29
  • 打赏
  • 举报
回复
1.高峰时间段(如上午10点)哪张表被访问的最频繁 以时间(如上午10点)为条件过滤出有效数据,统计所有表访问次数(即数据条数),top1即被访问的最频繁表,一个MR搞定。

mapper:
表A 1 // 表A 被访问1次
表A 1
表B 1
表A 1
表C 1
表B 1
reduce:
表A 3 // 表A总共被访问3此
表B 2
表C 1
------->表A访问最多
2.这段时间访问这张表最多的用户,以及这个用户的总时间开销。 以时间和表名(上一个MR已求出)为条件过滤出有效数据,统计所有用户访问次数及开销(访问次数和开销封装成一个对象),先统计访问次数得到“访问这张表最多的用户”,然后及时其“总时间开销”,一个MR。

mapper:
用A (1,5) // 用户A 访问1次,时间开销5秒
用A (1,2)
用B (1,7)
用A (1,3)
用C (1,7)
用B (1,2)
reduce:
用A (3,10) // 用户A访问3次,总时间开销10秒
用B (2,9)
用C (1,7)
------->用A访问最多,总时间开销10秒
2个MR搞定(当然,第二个MR也可以拆分成2个,那样的话需要3个。)
SG90_ICT 2014-09-21
  • 打赏
  • 举报
回复 1
引用 2 楼 coke_ly 的回复:
两个 吧,第一个 key为时间(如果 是时间段,需要抽象一下),统计用户;第二个 的key是用户id,统计相同ID的个数和TimeSpan(时间开销)。
仅有这些key是不够的吧,看楼下
静夜思朝颜 2014-09-21
  • 打赏
  • 举报
回复
根据java8964所说的。。输出的时候可以使用muitioutputs来进行多输出,性能这块儿我感觉也可以使用多reduce(使用hash分区就可以),再可以使用combiner来优化每一个table和user中针对某一小时的消耗时间。最后再将相应输出的文件进行合并就可以了吧。。如有错误求指教~~。。
引用 4 楼 java8964 的回复:
One MR is enough, but only can use 1 reducer (well, select max() always ends with using one reducer) In the Mapper, filter out any data NOT in that time. Use following key as output, which contains 2 parts: 1) Table 2) User Using Hadoop 2nd sort, sort by Table first, then sort by User. If only one reducer, then all the data will be sorted by table first, then by user. In the reducer, if you iterate all the record, then you should be able to find the max information you are looking for. Bad side, one reducer could be the performance bottleneck if the data volume is big.
java8964 2014-05-31
  • 打赏
  • 举报
回复
One MR is enough, but only can use 1 reducer (well, select max() always ends with using one reducer) In the Mapper, filter out any data NOT in that time. Use following key as output, which contains 2 parts: 1) Table 2) User Using Hadoop 2nd sort, sort by Table first, then sort by User. If only one reducer, then all the data will be sorted by table first, then by user. In the reducer, if you iterate all the record, then you should be able to find the max information you are looking for. Bad side, one reducer could be the performance bottleneck if the data volume is big.
spmydl 2014-05-30
  • 打赏
  • 举报
回复
两个 吧,第一个 key为时间(如果 是时间段,需要抽象一下),统计用户;第二个 的key是用户id,统计相同ID的个数和TimeSpan(时间开销)。
五哥 2014-05-30
  • 打赏
  • 举报
回复
table+times -- count mr1 table + times + user -- count mr2 user+table -- times mr3 结果排序
EggItayi 2014-05-29
  • 打赏
  • 举报
回复
我的想法是3个mapreduce
内容概要:本文围绕基于电压-电流双闭环控制的断续导通模式(DCM)反激式开关电源展开系统性仿真研究,整合仿真模型、理论文献与Mathcad计算书三大资源,深入阐述该电源系统的设计原理与实现方法。研究重点在于构建电压外环与电流内环的双闭环控制策略,以提升电源的动态响应速度、输出电压稳定性和负载调整率。通过Matlab/Simulink等工具建立精确仿真模型,验证DCM模式下反激变换器的能量传递特性、开关器件应力分布及反馈控制环路的稳定性表现。同时,借助Mathcad完成关键电路参数的数学建模与设计计算,确保理论分析与仿真结果的高度一致性,实现从理论推导到工程实践的闭环验证。; 适合人群:具备电力电子技术基础,从事开关电源设计、电力变换器开发或自动化控制等相关领域研究的研发工程师及高校研究生。; 使用场景及目标:①掌握反激式开关电源在DCM模式下的工作机理与系统建模方法;②学习电压-电流双闭环控制器的设计流程、稳定性分析与参数整定技术;③实现理论计算、数学推导与仿真实践的深度融合,支撑科研项目复现或实际工程原型开发。; 阅读建议:建议读者结合所提供的仿真文件、技术文献与Mathcad计算文档同步学习,注重理论公式推导与仿真波形结果的对照分析,动手调整控制器参数以深入理解系统动态响应特性与稳定性边界。

20,843

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧