cnYES 的新聞數據分析資料

45
cnYES 的新聞數據分析資料介接 使用 Google Analytics API Facebook API Cara Wang <[email protected]> 1

Transcript of cnYES 的新聞數據分析資料

Page 1: cnYES 的新聞數據分析資料

cnYES 的新聞數據分析資料介接

使用 Google Analytics API 與 Facebook API

Cara Wang <[email protected]>

1

Page 2: cnYES 的新聞數據分析資料

新聞的瀏覽量和社群分享成效分析

1. 可以整合 Google Analytics 的數據嗎?

2. Facebook 的 讚數/分享數 可以取得嗎?

2

Page 4: cnYES 的新聞數據分析資料

Facebook for Develpers

4

Page 5: cnYES 的新聞數據分析資料

分析所需要蒐集的資料

1. 瀏覽量: Google Analytics 有蒐集新聞 URL 對應的 Pageview

我們的目標: 取得所有 URL 含有 /content/ 的 pageview

好工具: Query Exploer

5

Page 6: cnYES 的新聞數據分析資料

6

Page 7: cnYES 的新聞數據分析資料

7

Page 8: cnYES 的新聞數據分析資料

分析所需要蒐集的資料

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

Page 9: cnYES 的新聞數據分析資料

9

Page 10: cnYES 的新聞數據分析資料

把資料彙集整理,讓大家都看得懂

10

Page 11: cnYES 的新聞數據分析資料

你不行這樣做

1. 從 Database 拿出一則一則的新聞,一一打 Google Analytics 與 Facebook

API 在存回 Database

因為 Google APIs 是有額度限制的!

一天最多接受 50,000 個 requests

3. Sequential Process

PM 可以接受不即時的資料,但一小時應該更新一次

11

Page 12: cnYES 的新聞數據分析資料

Greedy1. 每小時打 Google Analytics API,取回所有相關 Pageview

2. 拿回來的 URL 再一一打 Facebook API 取回相關的 按讚與分享總數

3. 一一寫回 Database

12

Page 13: cnYES 的新聞數據分析資料

13

Page 14: cnYES 的新聞數據分析資料

兩個大問題

1. 資料準確度很難掌握. . .

每小時都重新跑過一次. . .

14

Page 15: cnYES 的新聞數據分析資料

15

Page 16: cnYES 的新聞數據分析資料

兩個大問題

1. 資料準確度很難掌握. . .

每小時都重新跑過一次. . .

如何知道是同一批資料,要將數值加總?

如何知道不是同一批資料,要將新數值覆蓋舊的?

2. 效能不佳!

頻繁訪問 Database

16

Page 17: cnYES 的新聞數據分析資料

17

Page 18: cnYES 的新聞數據分析資料

兩個大問題

1. 資料準確度很難掌握. . .

每小時都重新跑過一次. . .

如何知道是同一批資料,要將數值加總?

如何知道不是同一批資料,要將新數值覆蓋舊的?

2. 效能不佳!

頻繁訪問 Database

頻繁打 Facebook API

18

Page 19: cnYES 的新聞數據分析資料

19

Page 20: cnYES 的新聞數據分析資料

兩個大問題

1. 資料準確度很難掌握. . .

每小時都重新跑過一次. . .

如何知道是同一批資料,要將數值加總?

如何知道不是同一批資料,要將新數值覆蓋舊的?

2. 效能不佳!

頻繁訪問 Database

頻繁打 Facebook API

放太多東西進 Queue

20

Page 21: cnYES 的新聞數據分析資料

21

Page 22: cnYES 的新聞數據分析資料

以不同的新聞 ID 為中心,資料自己跑過去跟他說我是你的數據

22

Page 23: cnYES 的新聞數據分析資料

使用 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

Page 24: cnYES 的新聞數據分析資料

http://kickstarthadoop.blogspot.tw/2011/04/word-count-hadoop-map-reduce-example.html

24

Page 25: cnYES 的新聞數據分析資料

使用 MapReduce 解決問題

1. 什麼是 MapReduce ?

Raw Data: 大量且複雜的資料,但有一致的格式存在

Map: 把複雜但相同格式的資料整理成一致的型態

Shuffle: Map 和 Reduce 之間溝通的協議

Reduce: 將 Map 整理好的資料做計算,成為最後有用的資訊

25

Page 26: cnYES 的新聞數據分析資料

如何 應用 到我們的需求中

1. 先單純只看 Google Analytics API 的回傳結果

Raw Data: Google Analytics API 的回傳結果

Map: 把 Google Analytics API 回傳結果拆解成 newsId 對應 count

Reduce: 把 Map 整理好的 count 做加總

26

Page 27: cnYES 的新聞數據分析資料

27

Page 28: cnYES 的新聞數據分析資料

如何 實作 到我們的需求中

1. Raw Data: Google Analytics API 的回傳結果

Command -> 一小時跑一次

2. Map: 把 Google Analytics API 回傳結果拆解成 newsId 對應 count

Job -> 平行處理

2. Reduce: 把 Map 整理好的 Count 做加總

Job -> 平行處理

28

Page 29: cnYES 的新聞數據分析資料

如何 實作 到我們的需求中

1. Map 和 Reduce 溝通的工具

Cache

Reduce 在下一個小時才會拿資料出來做事情

3. 如何做 Shuffle ?

用 newsId 前三個數字 (prefix),轉成 hash code 後放入 Cache (list 型

態),可以確保相同 newsId 會被 shuffle 到同一個 list

29

Page 30: cnYES 的新聞數據分析資料

30

Page 31: cnYES 的新聞數據分析資料

從架構面了解為什麼 MapReduce 解決了兩大問題

31

Page 32: cnYES 的新聞數據分析資料

重新檢視兩個大問題

1. 資料準確度很難掌握. . .

每小時都重新跑過一次. . .

如何知道是同一批資料,要將數值加總?

如何知道不是同一批資料,要將新數值覆蓋舊的?

2. 效能不佳!

頻繁訪問 Database

頻繁打 Facebook API

放太多東西進 Queue

32

Page 33: cnYES 的新聞數據分析資料

33

Page 34: cnYES 的新聞數據分析資料

先看資料準確度問題如何解決

1. Map 與 Reduce 會檢視同一個 Cache 內容:

{"receiveTime":"20160502160001","reduced":false}

Map 靠 reduced 決定是否寫入新的一批資料到 Cache,並更新

receiveTime 讓 下個小時 的 Reduce 找到資料

Reduce 靠 receiveTime 找到 上個小時 在 Cache 的同一批所有資

34

Page 35: cnYES 的新聞數據分析資料

35

Page 36: cnYES 的新聞數據分析資料

頻繁訪問 Database 的問題

1. 同一批資料都在 Cache 中,經由 Shuffle 可以確保同一個 newsId 會在相同

的 list

2. 無需 select DB,就可以取得同一批的所有資料加總

3. 使用 insert on update 一次寫入 100 筆資料

36

Page 37: cnYES 的新聞數據分析資料

37

Page 38: cnYES 的新聞數據分析資料

頻繁打 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

Page 39: cnYES 的新聞數據分析資料

39

Page 40: cnYES 的新聞數據分析資料

結果

1. 準確度: 與 Google Analytics 後台列出的數字一致

40

Page 41: cnYES 的新聞數據分析資料

結果

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

Page 42: cnYES 的新聞數據分析資料

實際看一次在 laravel 中實做的架構

42

Page 43: cnYES 的新聞數據分析資料

43

Page 44: cnYES 的新聞數據分析資料

44

Page 45: cnYES 的新聞數據分析資料

Q & A

45