Hadoop - 分析日志文件(Java)

时间:2013-03-11 12:21:29

标签: java logging hadoop

Logfile如下所示:

Time stamp,activity,-,User,-,id,-,data

-

2013-01-08T16:21:35.561+0100,reminder,-,User1234,-,131235467,-,-
2013-01-02T15:57:24.024+0100,order,-,User1234,-,-,-,{items:[{"prd":"131235467","count": 5, "amount": 11.6},{"prd": "13123545", "count": 1, "amount": 55.99}], oid: 5556}
2013-01-08T16:21:35.561+0100,login,-,User45687,-,143435467,-,-
2013-01-08T16:21:35.561+0100,reminder,-,User45687,-,143435467,-,-
2013-01-08T16:21:35.561+0100,order,-,User45687,-,-,-,{items:[{"prd":"1315467","count": 5, "amount": 11.6},{"prd": "133545", "count": 1, "amount": 55.99}], oid: 5556}
...
...

修改

此日志中的具体示例:

User1234有一个reminder - 此reminderid = 131235467,之后他order跟随data 1}}:{items:[{"prd":"131235467","count": 5, "amount": 11.6},{"prd": "13123545", "count": 1, "amount": 55.99}], oid: 5556} 在这种情况下,id的{​​{1}}和prd是相同的,所以我想总结data * count - >在这种情况下,5 * 11.6 = 58并输出就像

amount

User 1234 Prdsum: 58 也提出了User45687,但他没有收到order所以没有总结他的reminder

输出:

data

此日志的最终输出:

User45687    Prdsum: 0

我的问题是:我如何比较(?)这些值 - > User 1234 Prdsum: 58 User45687 Prdsum: 0 中的idprd? 关键是用户。自定义Writable是否有用 - > value =(id,data)。我需要一些想法。

2 个答案:

答案 0 :(得分:0)

我建议您在第一次通过一个Hadoop作业时获得原始输出总和,因此在Hadoop作业结束时,您会得到如下结果:

User1234     Prdsum: 58    
User45687    Prdsum: 0

然后有第二个Hadoop作业(或独立作业),它比较各种值并生成另一个报告。

您是否需要“州”作为第一个Hadoop工作的一部分?如果是这样,那么你需要在mapper或reducer中保存一个HashMap或HashTable来存储所有键的值(在这种情况下是用户)来进行比较 - 但这不是一个好的设置,恕我直言。您最好只在一个Hadoop作业中进行聚合,然后在另一个Hadoop作业中进行比较。

答案 1 :(得分:0)

实现的一种方法是使用复合键。 映射器输出键是用户ID,事件ID(提醒 - > 0,顺序 - > 1)的组合。使用userid对数据进行分区,您需要编写自己的比较器。 这是要点。

<强>映射

for every event check the event type 
    if event type is "reminder"
        emit : <User1234,0> <reminder id>
    if event type is "order"
        split if you have multiple orders
        for every order
            emit : <User1234,1> <prd, count* amount, other interested blah>

使用userid进行分区,因此所有具有相同用户的条目都将转到同一个reducer。

<强>减速

在reducer中,所有条目都将按用户ID和已排序的事件ID进行分组(即首先您将获得给定用户ID的所有提醒,然后是订单)。

If `eventid` is 0
    add reminders id to a set (`reminderSet`).

If `eventid` is is 1 &&  prd is in `remindersSet` 
   emit : `<userid>  <prdsum>`
else 
   emit : `<userid>  <0>` 

有关复合键的更多详细信息,请参阅“Hadoop权威指南”或here