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

ybyb14 2014-05-28 09:22:49
最近去面试,出了个这样的题目,大家有兴趣也试试。
用Hadoop分析海量日志文件,每行日志记录了如下数据:
TableName(表名),Time(时间),User(用户),TimeSpan(时间开销)
要求编写MapReduce程序算出高峰时间段(如上午10点)哪张表被访问的最频繁,以及这段时间访问这张表最多的用户,以及这个用户的总时间开销。
...全文
4471 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

20,808

社区成员

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

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