SlideShare a Scribd company logo
cnYES 的新聞數據分析資料介接
使用 Google Analytics API 與 Facebook API
Cara Wang <caraw@cnyes.com>
1
新聞的瀏覽量和社群分享成效分析
1. 可以整合 Google Analytics 的數據嗎?
2. Facebook 的 讚數/分享數 可以取得嗎?
2
Google Develpers
3
Facebook for Develpers
4
分析所需要蒐集的資料
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
Greedy
1. 每小時打 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 ?
MapReduceis 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
頻繁打 FacebookAPI 與 太多東西在
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

More Related Content

Similar to cnYES 的新聞數據分析資料

搜索引擎营销 --Google analytics(内部资料)
搜索引擎营销 --Google analytics(内部资料)搜索引擎营销 --Google analytics(内部资料)
搜索引擎营销 --Google analytics(内部资料)hechangmin
 
Using google appengine_final
Using google appengine_finalUsing google appengine_final
Using google appengine_finalWei Sun
 
Using google appengine (2)
Using google appengine (2)Using google appengine (2)
Using google appengine (2)Wei Sun
 
系統整合
系統整合系統整合
系統整合麒 王
 
Using google appengine_1027
Using google appengine_1027Using google appengine_1027
Using google appengine_1027Wei Sun
 
Data Pipeline Matters
Data Pipeline MattersData Pipeline Matters
Data Pipeline Matters
Jazz Yao-Tsung Wang
 
GPS + Google fusion table 雲端應用
GPS + Google fusion table 雲端應用GPS + Google fusion table 雲端應用
GPS + Google fusion table 雲端應用
艾鍗科技
 
使用者行為分析
使用者行為分析使用者行為分析
使用者行為分析
newegg
 
Intro to Dialogflow Chatbot Development
Intro to Dialogflow Chatbot DevelopmentIntro to Dialogflow Chatbot Development
Intro to Dialogflow Chatbot Development
Ryan Chung
 
Pyconf2014 lightening
Pyconf2014 lighteningPyconf2014 lightening
Pyconf2014 lighteningShih-En Chou
 
Using google appengine_final2
Using google appengine_final2Using google appengine_final2
Using google appengine_final2Wei Sun
 
廣宣學堂Python金融爬蟲原理班 20170416
廣宣學堂Python金融爬蟲原理班 20170416廣宣學堂Python金融爬蟲原理班 20170416
廣宣學堂Python金融爬蟲原理班 20170416
Paul Chao
 
陳小白先生 數位行銷職涯心得
陳小白先生 數位行銷職涯心得陳小白先生 數位行銷職涯心得
陳小白先生 數位行銷職涯心得
MX 創意思境股份有限公司
 
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
Mu Chun Wang
 
SRE CH12 - Effective Troubleshooting
SRE CH12 - Effective TroubleshootingSRE CH12 - Effective Troubleshooting
SRE CH12 - Effective Troubleshooting
Rick Hwang
 
#成效特訓營-谷歌购物广告入门 + Gtin 更新应对方案
#成效特訓營-谷歌购物广告入门 + Gtin 更新应对方案#成效特訓營-谷歌购物广告入门 + Gtin 更新应对方案
#成效特訓營-谷歌购物广告入门 + Gtin 更新应对方案
AdWordsGreaterChina
 
從Google API到Google Analytics 2016寒假宅學營
從Google API到Google Analytics  2016寒假宅學營從Google API到Google Analytics  2016寒假宅學營
從Google API到Google Analytics 2016寒假宅學營
舜博 許
 
使用GoogleAppEngine建立个人信息中心
使用GoogleAppEngine建立个人信息中心使用GoogleAppEngine建立个人信息中心
使用GoogleAppEngine建立个人信息中心
Du Yamin
 
製作Google analytics流量分析計畫&後續維護
製作Google analytics流量分析計畫&後續維護製作Google analytics流量分析計畫&後續維護
製作Google analytics流量分析計畫&後續維護
MX 創意思境股份有限公司
 

Similar to cnYES 的新聞數據分析資料 (20)

搜索引擎营销 --Google analytics(内部资料)
搜索引擎营销 --Google analytics(内部资料)搜索引擎营销 --Google analytics(内部资料)
搜索引擎营销 --Google analytics(内部资料)
 
Using google appengine_final
Using google appengine_finalUsing google appengine_final
Using google appengine_final
 
Using google appengine (2)
Using google appengine (2)Using google appengine (2)
Using google appengine (2)
 
系統整合
系統整合系統整合
系統整合
 
Using google appengine_1027
Using google appengine_1027Using google appengine_1027
Using google appengine_1027
 
Data Pipeline Matters
Data Pipeline MattersData Pipeline Matters
Data Pipeline Matters
 
GPS + Google fusion table 雲端應用
GPS + Google fusion table 雲端應用GPS + Google fusion table 雲端應用
GPS + Google fusion table 雲端應用
 
使用者行為分析
使用者行為分析使用者行為分析
使用者行為分析
 
Intro to Dialogflow Chatbot Development
Intro to Dialogflow Chatbot DevelopmentIntro to Dialogflow Chatbot Development
Intro to Dialogflow Chatbot Development
 
Pyconf2014 lightening
Pyconf2014 lighteningPyconf2014 lightening
Pyconf2014 lightening
 
Seo工具
Seo工具Seo工具
Seo工具
 
Using google appengine_final2
Using google appengine_final2Using google appengine_final2
Using google appengine_final2
 
廣宣學堂Python金融爬蟲原理班 20170416
廣宣學堂Python金融爬蟲原理班 20170416廣宣學堂Python金融爬蟲原理班 20170416
廣宣學堂Python金融爬蟲原理班 20170416
 
陳小白先生 數位行銷職涯心得
陳小白先生 數位行銷職涯心得陳小白先生 數位行銷職涯心得
陳小白先生 數位行銷職涯心得
 
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
 
SRE CH12 - Effective Troubleshooting
SRE CH12 - Effective TroubleshootingSRE CH12 - Effective Troubleshooting
SRE CH12 - Effective Troubleshooting
 
#成效特訓營-谷歌购物广告入门 + Gtin 更新应对方案
#成效特訓營-谷歌购物广告入门 + Gtin 更新应对方案#成效特訓營-谷歌购物广告入门 + Gtin 更新应对方案
#成效特訓營-谷歌购物广告入门 + Gtin 更新应对方案
 
從Google API到Google Analytics 2016寒假宅學營
從Google API到Google Analytics  2016寒假宅學營從Google API到Google Analytics  2016寒假宅學營
從Google API到Google Analytics 2016寒假宅學營
 
使用GoogleAppEngine建立个人信息中心
使用GoogleAppEngine建立个人信息中心使用GoogleAppEngine建立个人信息中心
使用GoogleAppEngine建立个人信息中心
 
製作Google analytics流量分析計畫&後續維護
製作Google analytics流量分析計畫&後續維護製作Google analytics流量分析計畫&後續維護
製作Google analytics流量分析計畫&後續維護
 

More from Szuping Wang

Laradebut #5 - 關於 CRUD 外的一點小事
Laradebut #5 - 關於 CRUD 外的一點小事Laradebut #5 - 關於 CRUD 外的一點小事
Laradebut #5 - 關於 CRUD 外的一點小事
Szuping Wang
 
Laradebut #7 - Laravel AUTH
Laradebut #7 - Laravel AUTHLaradebut #7 - Laravel AUTH
Laradebut #7 - Laravel AUTH
Szuping Wang
 
Api survey #5 - firebase cloud messaging
Api survey #5  - firebase cloud messagingApi survey #5  - firebase cloud messaging
Api survey #5 - firebase cloud messaging
Szuping Wang
 
API Survey #2 - Firebase realtime database
API Survey #2 - Firebase realtime databaseAPI Survey #2 - Firebase realtime database
API Survey #2 - Firebase realtime database
Szuping Wang
 
cnYes 如何使用 elasticsearch
cnYes 如何使用 elasticsearchcnYes 如何使用 elasticsearch
cnYes 如何使用 elasticsearch
Szuping Wang
 
team18_媒體偏坦度
team18_媒體偏坦度team18_媒體偏坦度
team18_媒體偏坦度Szuping Wang
 
Git 好吃嗎
Git 好吃嗎Git 好吃嗎
Git 好吃嗎
Szuping Wang
 

More from Szuping Wang (7)

Laradebut #5 - 關於 CRUD 外的一點小事
Laradebut #5 - 關於 CRUD 外的一點小事Laradebut #5 - 關於 CRUD 外的一點小事
Laradebut #5 - 關於 CRUD 外的一點小事
 
Laradebut #7 - Laravel AUTH
Laradebut #7 - Laravel AUTHLaradebut #7 - Laravel AUTH
Laradebut #7 - Laravel AUTH
 
Api survey #5 - firebase cloud messaging
Api survey #5  - firebase cloud messagingApi survey #5  - firebase cloud messaging
Api survey #5 - firebase cloud messaging
 
API Survey #2 - Firebase realtime database
API Survey #2 - Firebase realtime databaseAPI Survey #2 - Firebase realtime database
API Survey #2 - Firebase realtime database
 
cnYes 如何使用 elasticsearch
cnYes 如何使用 elasticsearchcnYes 如何使用 elasticsearch
cnYes 如何使用 elasticsearch
 
team18_媒體偏坦度
team18_媒體偏坦度team18_媒體偏坦度
team18_媒體偏坦度
 
Git 好吃嗎
Git 好吃嗎Git 好吃嗎
Git 好吃嗎
 

cnYES 的新聞數據分析資料