cnYES 的新聞數據分析資料
-
Upload
szuping-wang -
Category
Engineering
-
view
142 -
download
0
Transcript of cnYES 的新聞數據分析資料
新聞的瀏覽量和社群分享成效分析
1. 可以整合 Google Analytics 的數據嗎?
2. Facebook 的 讚數/分享數 可以取得嗎?
2
分析所需要蒐集的資料
1. 瀏覽量: Google Analytics 有蒐集新聞 URL 對應的 Pageview
我們的目標: 取得所有 URL 含有 /content/ 的 pageview
好工具: Query Exploer
5
6
7
分析所需要蒐集的資料
1. 瀏覽量: Google Analytics 有蒐集新聞 URL 對應的 Pageview
我們的目標: 取得所有 URL 含有 /content/ 的 pageview
好工具: Query Exploer
2. 新聞連結對應的 Facebook 按讚數與分享數
翻遍 Facebook for Developers 找不到,最後是問 Jaric 問到的
https://api.facebook.com/method/links.getStats?
format=json&urls=
取得對應網址的 按讚數/分享數
8
9
把資料彙集整理,讓大家都看得懂
10
你不行這樣做
1. 從 Database 拿出一則一則的新聞,一一打 Google Analytics 與 Facebook
API 在存回 Database
因為 Google APIs 是有額度限制的!
一天最多接受 50,000 個 requests
3. Sequential Process
PM 可以接受不即時的資料,但一小時應該更新一次
11
Greedy1. 每小時打 Google Analytics API,取回所有相關 Pageview
2. 拿回來的 URL 再一一打 Facebook API 取回相關的 按讚與分享總數
3. 一一寫回 Database
12
13
兩個大問題
1. 資料準確度很難掌握. . .
每小時都重新跑過一次. . .
14
15
兩個大問題
1. 資料準確度很難掌握. . .
每小時都重新跑過一次. . .
如何知道是同一批資料,要將數值加總?
如何知道不是同一批資料,要將新數值覆蓋舊的?
2. 效能不佳!
頻繁訪問 Database
16
17
兩個大問題
1. 資料準確度很難掌握. . .
每小時都重新跑過一次. . .
如何知道是同一批資料,要將數值加總?
如何知道不是同一批資料,要將新數值覆蓋舊的?
2. 效能不佳!
頻繁訪問 Database
頻繁打 Facebook API
18
19
兩個大問題
1. 資料準確度很難掌握. . .
每小時都重新跑過一次. . .
如何知道是同一批資料,要將數值加總?
如何知道不是同一批資料,要將新數值覆蓋舊的?
2. 效能不佳!
頻繁訪問 Database
頻繁打 Facebook API
放太多東西進 Queue
20
21
以不同的新聞 ID 為中心,資料自己跑過去跟他說我是你的數據
22
使用 MapReduce 解決問題
1. 什麼是 MapReduce ?
MapReduce is a programming model and an associated implementation
for processing and generating large data sets with a parallel, distributed
algorithm on a cluster.
-- From Wikipedia
23
http://kickstarthadoop.blogspot.tw/2011/04/word-count-hadoop-map-reduce-example.html
24
使用 MapReduce 解決問題
1. 什麼是 MapReduce ?
Raw Data: 大量且複雜的資料,但有一致的格式存在
Map: 把複雜但相同格式的資料整理成一致的型態
Shuffle: Map 和 Reduce 之間溝通的協議
Reduce: 將 Map 整理好的資料做計算,成為最後有用的資訊
25
如何 應用 到我們的需求中
1. 先單純只看 Google Analytics API 的回傳結果
Raw Data: Google Analytics API 的回傳結果
Map: 把 Google Analytics API 回傳結果拆解成 newsId 對應 count
Reduce: 把 Map 整理好的 count 做加總
26
27
如何 實作 到我們的需求中
1. Raw Data: Google Analytics API 的回傳結果
Command -> 一小時跑一次
2. Map: 把 Google Analytics API 回傳結果拆解成 newsId 對應 count
Job -> 平行處理
2. Reduce: 把 Map 整理好的 Count 做加總
Job -> 平行處理
28
如何 實作 到我們的需求中
1. Map 和 Reduce 溝通的工具
Cache
Reduce 在下一個小時才會拿資料出來做事情
3. 如何做 Shuffle ?
用 newsId 前三個數字 (prefix),轉成 hash code 後放入 Cache (list 型
態),可以確保相同 newsId 會被 shuffle 到同一個 list
29
30
從架構面了解為什麼 MapReduce 解決了兩大問題
31
重新檢視兩個大問題
1. 資料準確度很難掌握. . .
每小時都重新跑過一次. . .
如何知道是同一批資料,要將數值加總?
如何知道不是同一批資料,要將新數值覆蓋舊的?
2. 效能不佳!
頻繁訪問 Database
頻繁打 Facebook API
放太多東西進 Queue
32
33
先看資料準確度問題如何解決
1. Map 與 Reduce 會檢視同一個 Cache 內容:
{"receiveTime":"20160502160001","reduced":false}
Map 靠 reduced 決定是否寫入新的一批資料到 Cache,並更新
receiveTime 讓 下個小時 的 Reduce 找到資料
Reduce 靠 receiveTime 找到 上個小時 在 Cache 的同一批所有資
料
34
35
頻繁訪問 Database 的問題
1. 同一批資料都在 Cache 中,經由 Shuffle 可以確保同一個 newsId 會在相同
的 list
2. 無需 select DB,就可以取得同一批的所有資料加總
3. 使用 insert on update 一次寫入 100 筆資料
36
37
頻繁打 Facebook API 與 太多東西在queue 中的問題
1. 整理 Raw Data 時,使用 where in 一次做 query: 找到對應的 newsId
後,確保該 URL 對應的新聞真的存在,才放進 queue
2. https://api.facebook.com/method/links.getStats?
format=json&urls= 可以放很多 URLs,一次查詢 1000 筆
這兩個跟 MapReduce 沒什麼關係. . .
38
39
結果
1. 準確度: 與 Google Analytics 後台列出的數字一致
40
結果
1. 測試新聞筆數: 261810
2. Cache 筆數: 606 / 抽樣的 List 筆數: 174
3. Time 為測試期間紀錄到最大的值
Component Original Time Time
AnalysisReceiver (Command) 未記錄 123.54229807854 s
ParseGoogleAnalyticsMapper (Job) 將近 60 s 0.11361789703369 s
ParseFacebookMapper (Job) 將近 60 s 3.152951002121 s
AnalysisReducer (Job) 原本沒有此部分 0.37646985054016
41
實際看一次在 laravel 中實做的架構
42
43
44
Q & A
45