論文閱讀筆記 GooDs: Organizing Google’s Datasets

GooDs: Organizing Google’s Datasets

<閱讀筆記>

參與了dantezhao的一個論文閱讀計劃 paper-notes

將閱讀成果分享到博客

Google Dataset Search (GooDs)是一個以元數(shù)據(jù)的形式管理數(shù)據(jù)集的企業(yè)內(nèi)部系統(tǒng)
這篇論文介紹了GooDs的設(shè)計和用途

帶著問題閱讀:
1. what: GooDs系統(tǒng)是做什么的  
2. why: 為什么需要GooDs系統(tǒng)  
3. how: GooDs系統(tǒng)是如何設(shè)計的

0. 摘要

0.1 文章目標

  • 探討實現(xiàn)數(shù)據(jù)管理所面臨的技術(shù)挑戰(zhàn) (Challenges)
從億萬級數(shù)據(jù)源爬取和推斷元數(shù)據(jù)

維持大規(guī)模元數(shù)據(jù)目錄的一致性

使用元數(shù)據(jù)為用戶提供服務(wù)
  • 對于打造大規(guī)模企業(yè)級數(shù)據(jù)管理系統(tǒng)的借鑒意義

1. 引言

1.1 企業(yè)數(shù)據(jù)管理的兩種形式

  • Enterprise Data Management (EDM)
生成數(shù)據(jù)集和管理數(shù)據(jù)集都在一套系統(tǒng)內(nèi)

系統(tǒng)本身限制了數(shù)據(jù)的生產(chǎn)和流轉(zhuǎn)
  • Data Lake
與EDM不同的是首妖,Data Lake采取事后(post-hoc)模式  

不介入數(shù)據(jù)的生產(chǎn)和使用

只為已經(jīng)生成的數(shù)據(jù)提供一套有效的管理工具

所以這是一種事后(post-hoc)行為

lake的比喻很形象惯退,數(shù)據(jù)不斷生成和累積匯聚成湖擅羞,查找數(shù)據(jù)就像從湖中釣魚("fish the right data")  

1.2 Google Dataset Search (GooDs)

  • GooDs是一個靜默的服務(wù)者
GooDs的全稱是Google Dataset Search畔塔,但它的功能不限于search

GooDs采用了類似Data Lake的形式攒岛,對數(shù)據(jù)進行事后(post-hoc)管理

post-hoc將在文中多次出現(xiàn),強調(diào)GooDs是靜默的輔助工具

作者還用非侵擾(non-intrusive)表明GooDs既不影響數(shù)據(jù)本身炎疆,也不影響數(shù)據(jù)的生產(chǎn)者和使用者

1.3 GooDs的運作機制

[站外圖片上傳中...(image-d1e2c9-1561642798984)]

圖:GooDs設(shè)計概覽

  • 分層介紹
1) GooDs持續(xù)地爬取(crawls)各類存儲系統(tǒng)和業(yè)務(wù)線考阱,
從中發(fā)現(xiàn)數(shù)據(jù)集(datasets)并收集數(shù)據(jù)集的元數(shù)據(jù)(datasets)信息和使用情況(usage)
(見圖最底層)  

2) GooDs將元數(shù)據(jù)聚合為一個中央目錄(central catalog),同時把特定數(shù)據(jù)集的元數(shù)據(jù)與其他數(shù)據(jù)集的信息相互關(guān)聯(lián)
(見圖中間層)  

3) GooDs用這套目錄的信息構(gòu)建搜索粘姜、監(jiān)控和數(shù)據(jù)流可視化等工具鬓照,
從而為Google工程師提供數(shù)據(jù)管理服務(wù)
(見圖最上層)
  • 關(guān)于元數(shù)據(jù)(metadata)
1) 元數(shù)據(jù)信息的一個來源是直接從數(shù)據(jù)源收集

2) 元數(shù)據(jù)的另一個來源是對數(shù)據(jù)內(nèi)容的推斷(inference):
    a. 處理附加的數(shù)據(jù)源,如日志孤紧、數(shù)據(jù)集所有者和項目信息等
    c. 分析數(shù)據(jù)集的內(nèi)容
    d. 收集GooDs使用者輸入

3) GooDs收集的元數(shù)據(jù)可能包括:
   a. 數(shù)據(jù)所有者 (owners)
   b. 訪問時間 (time of access)
   c. 內(nèi)容特征 (content features)
   d. 生產(chǎn)管線的訪問記錄  (accesses by production pipelines)

1.4 GooDs提供的一些工具

  • dashboard 儀表板
展示所有數(shù)據(jù)集  

提供多條件檢索  

可以橫跨不同的存儲系統(tǒng)  

可以獲得數(shù)據(jù)集和所有依賴的數(shù)據(jù)集
  • monitor 監(jiān)控
監(jiān)控內(nèi)容特征:如大小豺裆、數(shù)值的分布、是否可用  

在特征發(fā)生意外改變時通知數(shù)據(jù)所有者
  • provenance 數(shù)據(jù)血緣關(guān)系
生成某個數(shù)據(jù)集的上游數(shù)據(jù)
  
依賴某個數(shù)據(jù)集的下游數(shù)據(jù)  
  • search engine 搜索引擎
縮小搜索范圍
  • GooDs API
通過暴露接口号显,所有的團隊都能為元數(shù)據(jù)目錄做貢獻臭猜,形成一種crowd-sourced(眾包)的方式

數(shù)據(jù)使用者能夠共享和交換數(shù)據(jù)集的信息

2. GooDs系統(tǒng)的技術(shù)挑戰(zhàn)

2.1 天量數(shù)據(jù)規(guī)模

GooDs系統(tǒng)為超過260億個數(shù)據(jù)集建立了索引

260億這個數(shù)字僅包括對全體google員工開放權(quán)限的數(shù)據(jù)集

如果GooDs為更高級別權(quán)限的數(shù)據(jù)集建立索引,同時支持更多存儲系統(tǒng)押蚤,規(guī)拿锔瑁可能在260億的基礎(chǔ)上翻倍
(double in the number of datasets)

即使每秒處理一個數(shù)據(jù)集,260億也需要一千臺并行的機器運轉(zhuǎn)300天

對元數(shù)據(jù)的推斷(inference)也因為計算量呈指數(shù)級增長而完全不可行

2.2 多樣性

數(shù)據(jù)集以各種格式存儲揽碘,來自各式存儲系統(tǒng)次屠,多樣性成為數(shù)據(jù)統(tǒng)一管理問題之一

GooDs需要將各種格式的數(shù)據(jù)以同一種形式展示給用戶

數(shù)據(jù)集的類型和大小不同或者元數(shù)據(jù)的類型不同园匹,抽離元數(shù)據(jù)的成本也會不同

GooDs系統(tǒng)在推斷元數(shù)據(jù)的時候,需要考量元數(shù)據(jù)的成本和收益

多樣性也體現(xiàn)在數(shù)據(jù)集的相互關(guān)系中帅矗,而數(shù)據(jù)集的相互關(guān)系反過來影響元數(shù)據(jù)在GooDs目錄的計算和存儲

2.3 目錄條目(Catalog Entries)的變動

GooDs目錄條目中偎肃,每天約有5%左右的數(shù)據(jù)集被刪除

優(yōu)先計算哪些數(shù)據(jù)集的元數(shù)據(jù),將哪些數(shù)據(jù)集加入目錄浑此,都會受到新舊數(shù)據(jù)集交替的影響

生存周期time-to-live(TTL)長的數(shù)據(jù)集相對比較重要

短周期數(shù)據(jù)集可能關(guān)聯(lián)長周期數(shù)據(jù)集累颂,所以GooDs系統(tǒng)不可能排除短周期數(shù)據(jù)集

2.4 元數(shù)據(jù)的不確定性

GooDs系統(tǒng)采取事后(post-hoc)非侵入(non-invasive)的方式,無法全程把握數(shù)據(jù)集的產(chǎn)生

GooDs根據(jù)已有數(shù)據(jù)推斷和計算出的元數(shù)據(jù)凛俱,在一定程度并不精準

2.5 計算數(shù)據(jù)集重要性

推算數(shù)據(jù)集對使用者的重要性和在網(wǎng)頁檢索中推算網(wǎng)頁的重要性不同

網(wǎng)頁用于排序和檢索的許多特性(如錨文本anchor text)紊馏,數(shù)據(jù)集并不具備

不過數(shù)據(jù)集可以提供結(jié)構(gòu)性的上下文,這是網(wǎng)頁所沒有的

數(shù)據(jù)集之間的唯一聯(lián)系就是來源關(guān)聯(lián)蒲犬,而這種關(guān)聯(lián)并不能完全決定數(shù)據(jù)集的重要性

為哪些數(shù)據(jù)集優(yōu)先計算元數(shù)據(jù)朱监,也可以作為數(shù)據(jù)集重要性的一項參考

2.6 復(fù)原數(shù)據(jù)集語義

數(shù)據(jù)集的語義可以通俗地理解為數(shù)據(jù)集的某項內(nèi)容代表了什么

文中舉的例子是,從一個數(shù)據(jù)集中推斷出一批整型數(shù)值代表了地理坐標的ID

這樣的數(shù)據(jù)集語義原叮,在用戶檢索地理數(shù)據(jù)時就能排上用場

將無意義的原始數(shù)據(jù)升華為包含意義的內(nèi)容對推斷元數(shù)據(jù)非常有用

但是發(fā)現(xiàn)數(shù)據(jù)集語義本身也是一項非常困難的工作

3. GooDs系統(tǒng)的目錄(Catalog)

Google內(nèi)部每個存儲系統(tǒng)都可能維護著自己的catalog赫编,每個catalog還會有自己的metadata

數(shù)據(jù)在不同的數(shù)據(jù)集和存儲系統(tǒng)之間自由流轉(zhuǎn)是常態(tài)

GooDs所做的就是為所有存儲系統(tǒng)和數(shù)據(jù)集建立統(tǒng)一的目錄

Catalog上的一條記錄稱之為條目(entry),原則上每個entry對應(yīng)一個數(shù)據(jù)集(dataset)的元數(shù)據(jù)

當出現(xiàn)一些特征相似度高的集群時奋隶,GooDs會將它們歸并為一個集群(cluster)擂送,建立單個條目(entry)

集群的一個典型例子就是相同數(shù)據(jù)集的不同版本

3.1 元數(shù)據(jù)(Metadata)

  • 概要
終于講到了GooDs系統(tǒng)的關(guān)鍵要素————元數(shù)據(jù)(metadata)

元數(shù)據(jù)(metadata)包含很多信息,總結(jié)起來就是用于描述數(shù)據(jù)集的信息唯欣,即"數(shù)據(jù)的數(shù)據(jù)"
  • 元數(shù)據(jù)的來源
元數(shù)據(jù)的途徑有兩種:

第一種可以通過直接訪問獲揉诙帧:

GooDs系統(tǒng)在爬取數(shù)據(jù)集的時候,會順帶獲取一些元數(shù)據(jù)境氢,如數(shù)據(jù)集的大小蟀拷、所有者、訪問權(quán)限等

但是數(shù)據(jù)集并沒有保存所有的元數(shù)據(jù)信息萍聊,比如生成數(shù)據(jù)集的作業(yè)(jobs)问芬,數(shù)據(jù)集的訪問者等

不能從數(shù)據(jù)集直接獲取的元數(shù)據(jù)往往存在于日志中

第二種通過GooDs系統(tǒng)計算得出:

GooDs除了爬取獲得元數(shù)據(jù)外,還會通過推斷(inference)獲取元數(shù)據(jù)

[站外圖片上傳中...(image-774b58-1561642798984)]

Table2: 元數(shù)據(jù)(Metadata)和元數(shù)據(jù)組(Metadata Group)

  • 基礎(chǔ)元數(shù)據(jù)(Basic Metadata)
包括時間戳寿桨、文件格式此衅、所有者、訪問權(quán)限等

基礎(chǔ)元數(shù)據(jù)一般由GooDs系統(tǒng)爬取存儲系統(tǒng)直接獲得牛隅,無需推斷

GooDs的其他模塊通常將基礎(chǔ)元數(shù)據(jù)作為行為依據(jù)之一
  • 數(shù)據(jù)血緣/數(shù)據(jù)譜系(Provenance)
GooDs中的元數(shù)據(jù)血緣關(guān)系來自數(shù)據(jù)集的生產(chǎn)和消費過程炕柔、數(shù)據(jù)集上下游依賴

GooDs通過分析生產(chǎn)日志來確定元數(shù)據(jù)的血緣信息

GooDs用時間順序決定依賴關(guān)系,即晚發(fā)生的依賴于早發(fā)生的

在計算血緣關(guān)系時媒佣,GooDs為了效率可能會犧牲信息的完整性
  • 結(jié)構(gòu)信息(Schema)
Google內(nèi)幾乎所有結(jié)構(gòu)化數(shù)據(jù)集都是基于serialized protocol buffer編碼的

推斷數(shù)據(jù)集使用了哪種形式的protocol buffer編碼會產(chǎn)生多個結(jié)論

GooDs系統(tǒng)把所有可能的protocol buffer形式都記錄在元數(shù)據(jù)中
  • Content summary
Content summary按照字面直譯為內(nèi)容摘要反而不容易理解

實際上匕累,元數(shù)據(jù)記錄的content summary可以看成一套數(shù)據(jù)的關(guān)鍵字合集

文中舉了三個summary的例子:
a) 抽樣(sampling)產(chǎn)生的frequent token
b) 分析字段(fields)得出的鍵(key for data)
c) 有校驗和(checksums)的fingerprints

GooDs通過summary來判斷來自不同數(shù)據(jù)集的內(nèi)容或者字段是否相似和相等,
  • 用戶注釋(User-provided annotations)
一般用戶做注釋都是為了明確告知數(shù)據(jù)集的使用者有必要知曉的信息

GooDs的元數(shù)據(jù)通過分析注釋來優(yōu)化排序或者規(guī)避數(shù)據(jù)隱私
  • 語義學(xué)信息(Semantics)
數(shù)據(jù)集的語義學(xué)信息可以幫助理解數(shù)據(jù)集

如果數(shù)據(jù)集使用了特定的protocol buffer默伍,GooDs可以分析源碼提取有用的備注(comment)信息

本段中舉了個例子欢嘿,比如數(shù)據(jù)集中一個名為"mpn"的字段衰琐,通過分析備注,發(fā)現(xiàn)mpn是"http://Model Product Number"的縮寫
這就是獲取備注(comment)信息在語義學(xué)方面的作用

Google的知識圖譜可以作為一個資源庫炼蹦,GooDs系統(tǒng)將數(shù)據(jù)集內(nèi)容與知識圖譜匹配羡宙,識別不同字段中包含什么樣的條目信息(如位置信息,業(yè)務(wù)信息)
  • 其他
除上述類型的元數(shù)據(jù)外掐隐,GooDs系統(tǒng)還會將以下信息作為元數(shù)據(jù)的內(nèi)容:
a) 獲取一個標識狗热,通過該標識可以確認擁有數(shù)據(jù)集的團隊(team)
b) 數(shù)據(jù)集所屬項目的描述
c) 數(shù)據(jù)集元數(shù)據(jù)的變更歷史

此外,GooDs允許團隊在目錄添加自定義的元數(shù)據(jù)虑省,從而為所有使用者提供統(tǒng)一管理元數(shù)據(jù)的平臺

3.2 數(shù)據(jù)集群(cluster)

  • 數(shù)據(jù)集重復(fù)問題
GooDs目錄上的260億個數(shù)據(jù)集并非完全獨立匿刮,很多數(shù)據(jù)集存在內(nèi)容重復(fù),比如:

a) 相同數(shù)據(jù)集的不同版本  

b) 相同數(shù)據(jù)集復(fù)制到不同的數(shù)據(jù)中心  

c) 大數(shù)據(jù)集被切分為小數(shù)據(jù)集  

...   
  • 數(shù)據(jù)集集群化的好處

針對上述問題探颈,將類似數(shù)據(jù)集歸納為集群有如下好處:

a) 為用戶提供合乎邏輯的數(shù)據(jù)集分組

b) 只需計算集群中的少量數(shù)據(jù)集的元數(shù)據(jù)熟丸,節(jié)約計算成本

  • 集群化的技術(shù)考量
將數(shù)據(jù)集集群化的計算成本要足夠低,才值得使用

生成集群的計算成本不能高于重復(fù)計算相似數(shù)據(jù)集的成本

  • 根據(jù)路徑(path)層級(hierarchies)生成集群
數(shù)據(jù)集的路徑可以提供劃分集群的思路  

某個數(shù)據(jù)集路徑  
dataset/2015-10-10/daily_scan

按天分類  
dataset/2015-10-<day>/daily_scan

按月份和日期分類  
dataset/2015-<month>-<day>/daily_scan  
  • 多粒度的半網(wǎng)格結(jié)構(gòu)(granularity semi-lattice)

[站外圖片上傳中...(image-484ea3-1561642798984)]

Figure 2展示了兩種層次的集群劃分:按天劃分和按版本號劃分

[站外圖片上傳中...(image-45cada-1561642798984)]

Table 3展示了構(gòu)建集群所依賴的數(shù)據(jù)集維度

從數(shù)據(jù)集的路徑抽離出不同維度(dimensions伪节,如日期光羞、版本號)
為每個數(shù)據(jù)集構(gòu)建一個半網(wǎng)格(semi-lattice)結(jié)構(gòu)  

在Figure 2所示的半網(wǎng)格結(jié)構(gòu)中,非葉子節(jié)點代表了數(shù)據(jù)集的分組依據(jù)  
  • 集群的日常更新和重復(fù)映射問題
如果分組情況每天計算和更新怀大,可能造成用戶每天都看到不同的集群  

為了解決這個問題纱兑,GooDs只為每個半網(wǎng)格的頂層元素創(chuàng)建條目(entry)  

如Figure 2,目錄將只有頂層的條目/dataset/<date>/<version>叉寂,
對應(yīng)網(wǎng)格底層的三個數(shù)據(jù)集  

采用這種方式可以保證每個數(shù)據(jù)集只映射到一個集群萍启,
總的集群條目數(shù)量也會下降
  • 集群的元數(shù)據(jù)

[站外圖片上傳中...(image-d42c85-1561642798984)]

Figure 4 將3個數(shù)據(jù)集的元數(shù)據(jù)匯總成集群元數(shù)據(jù)

GooDs系統(tǒng)通過匯總集群中各個數(shù)據(jù)集的元數(shù)據(jù)总珠,生成該集群的元數(shù)據(jù)  

集群的元數(shù)據(jù)以實時計算的方式產(chǎn)生屏鳍,用于區(qū)分通過分析推斷得出的元數(shù)據(jù)  
  • 數(shù)據(jù)集在集群中的分布

[站外圖片上傳中...(image-4268a3-1561642798984)]

Figure 3 用柱狀圖的方式展示了數(shù)據(jù)集在集群中的分布情況

集群化可以將"物理"集群壓縮為"邏輯"集群

極大地降低了元數(shù)據(jù)的計算成本  

用戶可以通過集群更方便地查閱GooDs系統(tǒng)的目錄  


4 后端實現(xiàn)(Backend Implementation)

本節(jié)主要討論:

GooDs系統(tǒng)目錄(catalog)的物理結(jié)構(gòu)  

向目錄中不斷增加新模塊的方法  

目錄數(shù)據(jù)的一致性  

目錄的容錯機制

4.1 目錄存儲(Catalog storage)

  • Bigtable的行存儲
a) 目錄使用Bigtable作為存儲中介

Bigtable是一種可伸縮的,鍵值對存儲系統(tǒng)

在目錄中局服,Bigtable中的一行代表一個數(shù)據(jù)集或一個集群

Bigtable提供了單行事務(wù)一致性(per-row transactional consistency)  

數(shù)據(jù)集路徑或者集群路徑作為這一行的鍵  

通過這種方式钓瞭,數(shù)據(jù)集對應(yīng)單行,無需查找多余信息

b) GooDs系統(tǒng)中與單行單個數(shù)據(jù)集處理方式相左的特性

數(shù)據(jù)集提取半網(wǎng)格結(jié)構(gòu)時淫奔,將多行信息整合到邏輯數(shù)據(jù)集中

累計同個集群中不同數(shù)據(jù)集的元數(shù)據(jù)  

不過這種元數(shù)據(jù)累加并不需要強一致性
  • Bigtable的列族(column families)
一張Bigtable表格包含多個獨立的列族  

GooDs的Bigtable中還設(shè)置了一些獨立列族專門進行批量處理(高壓縮率山涡,非內(nèi)存駐留)  

只能通過批處理任務(wù)訪問的數(shù)據(jù)就存在這些列族中  

比如GooDs系統(tǒng)中最大的列族,就包含了用于計算血緣圖譜的原始血緣數(shù)據(jù)

這些血緣數(shù)據(jù)內(nèi)容不直接面向前端唆迁,僅為部分集群提供服務(wù)鸭丛,因而可以高度壓縮
  • 元數(shù)據(jù)在Bigtable中的存儲
在目錄的Bigtable中,每行存儲兩種元數(shù)據(jù)信息: 

a) 數(shù)據(jù)集的元數(shù)據(jù) 

b) 狀態(tài)元數(shù)據(jù)(status metadata):對某個數(shù)據(jù)集處理后生成的結(jié)果

  • 狀態(tài)元數(shù)據(jù)(status metadata)
狀態(tài)元數(shù)據(jù)列出了用于處理條目的(entry)每一個模塊

狀態(tài)元數(shù)據(jù)可能包含時間戳唐责,成功狀態(tài)鳞溉,錯誤信息等內(nèi)容

GooDs使用狀態(tài)元數(shù)據(jù)協(xié)調(diào)模塊的執(zhí)行

狀態(tài)元數(shù)據(jù)也可以檢測系統(tǒng),比如通過成功狀態(tài)觀察數(shù)據(jù)集鼠哥,收集出現(xiàn)次數(shù)最多的錯誤碼

與Bigtable的臨時數(shù)據(jù)模型配合熟菲,狀態(tài)元數(shù)據(jù)還能用于調(diào)試(debugging)  

通過配置Bigtable看政,保留若干代的狀態(tài)元數(shù)據(jù)

這些代際數(shù)據(jù)能夠揭示模塊的歷史表現(xiàn)

4.2 批量任務(wù)的性能和調(diào)度(Batch job performance and scheduling)

  • 任務(wù)分類和系統(tǒng)可擴展性
GooDs系統(tǒng)的任務(wù)可以分為兩大類

1) 數(shù)量龐大的各類批處理任務(wù)

2) 少數(shù)為前端和API提供服務(wù)的任務(wù)

GooDs系統(tǒng)具有可擴展性,為爬取新增資源提供了便利抄罕,如:
a) 新增的數(shù)據(jù)源
b) 血緣信息和其他元數(shù)據(jù)信息
c) 新的分析模塊
  • GooDs系統(tǒng)對任務(wù)的安排
運行時間長達幾天的任務(wù)會被分配到距離數(shù)據(jù)集最近的地理位置

所有任務(wù)都獨立運行允蚣,不限制先后順序或是否并發(fā)

如果任務(wù)中斷,系統(tǒng)可以將其臨時下線
  • 任務(wù)中的模塊(modules)
每個任務(wù)都可能包括一個或多個模塊呆贿,如爬蟲或分析器

模塊通常會依賴其他模塊嚷兔,如等待其他模塊的計算結(jié)果

模塊之間通過狀態(tài)元數(shù)據(jù)協(xié)調(diào)執(zhí)行順序,粒度精確到Bigtable中的一行

如果模塊A必須在模塊B之前處理某行數(shù)據(jù)做入,
模塊B會檢查該行的狀態(tài)元數(shù)據(jù)谴垫,是否標記為被模塊A成功處理
如果模塊A尚未處理,模塊B會跳過該行母蛛,在下次運行時再重新檢查翩剪,
如果模塊A重新處理了該行,模塊B也會重新處理彩郊,以保證元數(shù)據(jù)最新

模塊也會使用自身的狀態(tài)元數(shù)據(jù)以避免在設(shè)定時間窗口內(nèi)重復(fù)處理數(shù)據(jù)

大多數(shù)任務(wù)每天運行前弯,并在24小時候內(nèi)完工

GooDs會優(yōu)化超時運行的任務(wù),或者使用并行任務(wù)分攤工作量

這些額外添加的任務(wù)秫逝,以24小時為周期處理恕出,
專門處理新增目錄行或者重新處理超出時間窗口的數(shù)據(jù)
  • 重要數(shù)據(jù)集優(yōu)先處理
在大量新數(shù)據(jù)集涌入系統(tǒng)的時候,
系統(tǒng)分析器(Schema Analyzer)作為最重量級的任務(wù)违帆,
往往需要幾天甚至幾周才能跟上進度浙巫,

為了保證最重要的數(shù)據(jù)集不被忽略,
那些用戶加注釋或者血緣集中度高的數(shù)據(jù)集標注被標注為"重要"

每個任務(wù)將分成兩個實例刷后,
一個實例只處理重要數(shù)據(jù)集的畴,
另一個實例處理所有數(shù)據(jù)集,并在一天的末尾處理一小部分重要數(shù)據(jù)集

實踐中尝胆,通過網(wǎng)絡(luò)爬取丧裁,保證最重要的那部分數(shù)據(jù)被充分覆蓋率并且持續(xù)更新,
足以應(yīng)對大多數(shù)的用戶場景
  • 數(shù)據(jù)盲寫
負責(zé)爬取數(shù)據(jù)的任務(wù)通常使用盲寫(blind write)的方式向目錄添加數(shù)據(jù)

Bigtable不區(qū)分插入和更新

這種無指令(no-op)方式比讀取目錄后再進行反連接(anti-join)操作更高效

某些情形應(yīng)當禁用無指令存儲含衔,否則會導(dǎo)致依賴的模塊重新運行或者阻塞垃圾回收

4.3 容錯機制(Fault tolerance)

因為數(shù)據(jù)集數(shù)量龐大種類繁多煎娇,GooDs系統(tǒng)遇到了各種問題
  • 獨立數(shù)據(jù)集和相互依賴的數(shù)據(jù)集
模塊處理相互獨立的數(shù)據(jù)集時:
錯誤信息會記錄在單個數(shù)據(jù)集的狀態(tài)元數(shù)據(jù)上;
如果狀態(tài)元數(shù)據(jù)顯示某個模塊錯誤終止贪染,將觸發(fā)一定次數(shù)的重試

模塊處理相互依賴的數(shù)據(jù)集時:
錯誤信息會記錄在任務(wù)(job)的狀態(tài)元數(shù)據(jù)上

例如:
有血緣關(guān)聯(lián)的模塊缓呛,
將一個數(shù)據(jù)集任務(wù)鏈接(dataset-job link)納入血緣圖譜前,
首先會查看這個任務(wù)鏈接的時間戳(timestamp)杭隙,
只有時間戳比模塊的最近成功執(zhí)行時間(last successful execution)更晚哟绊,
模塊才會整合該任務(wù)鏈接

上述方法有些保守,如果模塊的最近一次執(zhí)行有部分失敗寺渗,
系統(tǒng)可能會重復(fù)執(zhí)行一些Bigtable的錄入匿情;
但是這種方法能夠保證血緣圖譜的正確性兰迫,
因為Bigtable的錄入是冪等的;
同時這種方法允許系統(tǒng)將任務(wù)血緣信息記錄為"已消費"炬称,
"已消費"屬性在垃圾回收中非常重要
  • 模塊依賴庫依賴造成的問題
一些用于檢測數(shù)據(jù)集內(nèi)容的模塊會使用各種庫(libraries)  

每個庫都有可能專門用于處理特定的文件類型  

庫有時會崩潰或者陷入死循環(huán)  

但是由庫帶來的問題并不能徹底消除汁果,
因為系統(tǒng)不允許長時間運行的分析任務(wù)崩潰或掛起

一些危險的任務(wù)會被沙盒封裝到單獨的進程中,
看門狗線程會將長期停滯的任務(wù)轉(zhuǎn)為崩潰狀態(tài)玲躯,
這樣管線上的其他任務(wù)能夠繼續(xù)運轉(zhuǎn)
  • 目錄(catalog)的多地冗余
系統(tǒng)會在不同的地理位置冗余多份目錄(catalog)

在master節(jié)點進行錄入時据德,會同步在其他地方復(fù)制

4.4 元數(shù)據(jù)的垃圾回收(metadata)

  • 垃圾回收策略的演進
GooDs系統(tǒng)每天都會吸收和生產(chǎn)大量數(shù)據(jù),
其中相當一部分是臨時數(shù)據(jù)

只要模塊已經(jīng)消費了數(shù)據(jù)集關(guān)聯(lián)的元數(shù)據(jù)并更新了目錄跷车,
系統(tǒng)就可以刪除目錄上那些對應(yīng)數(shù)據(jù)集已經(jīng)被刪除的條目

系統(tǒng)初始階段棘利,系統(tǒng)使用了簡單保守的垃圾回收策略,
一條數(shù)據(jù)記錄一周不再更新才會被刪除

這種保守策略導(dǎo)致了若干起目錄嚴重臃腫的問題朽缴,
使我們意識到有必要采取激進的垃圾回收策略

早期曾有兩次善玫,系統(tǒng)被迫中止了所有的爬蟲和垃圾回收無關(guān)的分析模塊,
直到數(shù)天后才從故障中恢復(fù)

  • 垃圾回收機制的三大約束條件(constraints)
在實踐中密强,GooDs系統(tǒng)垃圾回收系統(tǒng)的使用總結(jié)了一些實用經(jīng)驗

1) 對Bigtable中一行數(shù)據(jù)做刪除時茅郎,刪除條件最好的表達方式是說明性的斷言,
斷言中使用其他模塊對該行數(shù)據(jù)訪問和更新時記錄的元數(shù)據(jù)和狀態(tài)信息或渤;
如:該數(shù)據(jù)集已從存儲系統(tǒng)中刪除系冗,
血緣相關(guān)的另一個模塊(已成功結(jié)束)對其最近更新的血緣信息進行過處理。

2) 因為Bigtable不區(qū)分插入和更新薪鹦,從目錄中刪除一條記錄時掌敬,
必須保證其他正在運行的模塊沒有將這條數(shù)據(jù)的部分信息重新插入目錄,
這種情況被稱為"dangling rows"

3) 所有其他模塊都必須獨立于垃圾回收模塊池磁,并和垃圾回收同時運行

  • 垃圾回收的非事務(wù)性(non-transactional)
Bigtable支持"conditional mutation"奔害,
即根據(jù)指定的條件斷言刪除或更新一條數(shù)據(jù),遵循事務(wù)原則

所有模塊的更新都要依賴未被刪除的單條記錄框仔,
Bigtable的conditional mutation帶來了極大的日志結(jié)構(gòu)讀取開銷

GooDs系統(tǒng)優(yōu)化了設(shè)計庸娱,允許所有垃圾回收以外的模塊進行非事務(wù)(non-transactional)的更新

垃圾回收在兩階段發(fā)生:

a) 第一階段冒滩,垃圾回收使用聲明斷言的方式刪除一條數(shù)據(jù),
此時數(shù)據(jù)并沒有真正刪除抽高,而是被標記了一個墓碑(tombstone)

b) 第二階段瘪匿,24小時之后跛梗,如果該行數(shù)據(jù)仍然符合刪除標準,
垃圾回收會真正刪除這行數(shù)據(jù)棋弥,否則將墓碑移除

與此同時核偿,其他模塊遵從下列規(guī)則:

a) 可以進行非事務(wù)更新

b) 更新時忽略標記了墓碑的數(shù)據(jù)

c) 模塊的單次迭代不能存活超過24小時

這種設(shè)計在保證了系統(tǒng)高效的同時,也能夠滿足垃圾回收的三大約束條件


5 GooDs系統(tǒng)的前端顽染,為目錄服務(wù)(Front end: serving the catalog)

前幾節(jié)內(nèi)容主要關(guān)注了GooDs系統(tǒng)目錄的創(chuàng)建和維護漾岳,

本節(jié)主要講述與元數(shù)據(jù)相關(guān)的服務(wù)

5.1 數(shù)據(jù)集基本信息頁(Dataset profile pages)

  • 展示
輸入路徑轰绵,得到數(shù)據(jù)集或集群的元數(shù)據(jù)展示在HTML頁面

在本文第三節(jié)介紹的大部分元數(shù)據(jù)信息都會被展示

用戶可以通過編輯元數(shù)據(jù)的特定部分,討論或修改目錄中的元數(shù)據(jù)信息
  • 信息量
展示在頁面的元數(shù)據(jù)信息必須兼顧完整性和合理的信息含量

為了不讓用戶被信息淹沒尼荆,同時避免大量數(shù)據(jù)的傳輸左腔,
GooDs系統(tǒng)使用本文3.2節(jié)介紹的機制,將血緣元數(shù)據(jù)離線壓縮

如果血緣數(shù)據(jù)的壓縮版本仍然很大捅儒,系統(tǒng)只能保留最新的記錄
  • 與各類的工具的交叉關(guān)聯(lián)
數(shù)據(jù)集的信息頁會將元數(shù)據(jù)與其他工具交叉關(guān)聯(lián)

比如某個數(shù)據(jù)集的信息頁液样,會將血緣元數(shù)據(jù),
和任務(wù)中心(job-centric tools)的任務(wù)詳情頁相關(guān)聯(lián)巧还,
這些任務(wù)生產(chǎn)了當前數(shù)據(jù)集鞭莽,
任務(wù)中心就是管理任務(wù)的工具

又如架構(gòu)(schema)元數(shù)據(jù)會和代碼管理工具連接,
代碼管理工具中有當前架構(gòu)的定義

同時麸祷,這些工具又回鏈到GooDs系統(tǒng)澎怒,幫助用戶獲取數(shù)據(jù)集的更多信息
  • 代碼段工具(access snippets)
信息頁同時提供了多語言的代碼段工具(access snippets)來訪問數(shù)據(jù)集的內(nèi)容

GooDs為特定數(shù)據(jù)集定制代碼段,
用戶可以復(fù)制粘貼代碼段到特定的開發(fā)環(huán)境

代碼段的目標是補充信息頁的元數(shù)據(jù)內(nèi)容:

元數(shù)據(jù)提供了數(shù)據(jù)集內(nèi)容的架構(gòu)級信息阶牍,

而代碼段提供了通過代碼快速訪問和分析數(shù)據(jù)集實際內(nèi)容的途徑

5.2 數(shù)據(jù)集搜索(Dataset search)

  • 關(guān)鍵字查詢和索引
數(shù)據(jù)集檢索允許用戶通過簡單的關(guān)鍵字查詢找到數(shù)據(jù)集

搜索服務(wù)依賴常規(guī)的倒排索引實現(xiàn)文件檢索

每個數(shù)據(jù)集都被視為一個文件(document)丹拯,
系統(tǒng)從數(shù)據(jù)集的元數(shù)據(jù)子集中提取索引令牌(index token),
每個令牌都會關(guān)聯(lián)索引的特定部分荸恕,
如path開頭關(guān)聯(lián)的是索引的路徑

索引令牌的提取視查詢類型而定

以路徑為例乖酬,
數(shù)據(jù)集的路徑按分隔符拆分,每個令牌對應(yīng)它在路徑中的位置,
如"a/x/y/b"會映射到索引令牌"a","x","y","b"融求,并且順序不變

protocol buffer的名稱也用相同的方式索引咬像,
用戶可以搜索到schema匹配特定protocol buffer命名空間的所有數(shù)據(jù)集
  • 打分函數(shù)(scoring function)
關(guān)鍵字搜索到數(shù)據(jù)集是第一步驟,
第二步驟是生成一個打分函數(shù)來為匹配的數(shù)據(jù)集排序

GooDs系統(tǒng)會根據(jù)用戶的使用經(jīng)驗不斷調(diào)整打分函數(shù)

打分函數(shù)的幾個設(shè)計經(jīng)驗:

a) 數(shù)據(jù)集的重要性依賴于它的類型:

比如打分系統(tǒng)認為Dremel Table比file dataset重要生宛,
因為Dremel Table需要用戶注冊县昂,使其對更多用戶可見

b) 關(guān)鍵字匹配的重要性依賴于索引的位置

比如匹配數(shù)據(jù)集路徑的關(guān)鍵字,
比匹配讀寫數(shù)據(jù)集任務(wù)的關(guān)鍵字重要性更強

c) 血緣譜系(lineage fan-out)是數(shù)據(jù)集重要性的重要指標

數(shù)據(jù)集的讀取任務(wù)越多陷舅,下游數(shù)據(jù)集越多倒彰,則數(shù)據(jù)集越重要;
這個準則有時會給一些數(shù)據(jù)集打出不合理的高分莱睁,
這些數(shù)據(jù)集可能只是被大量的內(nèi)部管線間接訪問待讳,
但是對大多數(shù)用戶沒用,比如Google的網(wǎng)頁爬取信息

d) 帶有用戶描述信息的數(shù)據(jù)集重要性更高

除了上述幾點仰剿,打分函數(shù)還會參考其他信號作為打分依據(jù)
  • facet
在關(guān)鍵字檢索之外创淡,GooDs系統(tǒng)還會展示元數(shù)據(jù)的facets

如數(shù)據(jù)集的所有者,數(shù)據(jù)集的文件類型等

這些facet能幫助用戶構(gòu)建更好的搜索關(guān)鍵詞

5.3 團隊儀表板(Team dashboards)

GooDs系統(tǒng)的儀表板是一個可配置的一站式數(shù)據(jù)集展示窗口南吮,
能夠顯示某個團隊生成的所有數(shù)據(jù)集和每個數(shù)據(jù)集的元數(shù)據(jù)

GooDs系統(tǒng)自動更新儀表板的內(nèi)容

用戶可以將儀表板頁面嵌入其他文件并將儀表板與他人共享

GooDs系統(tǒng)還提供了監(jiān)控數(shù)據(jù)集特定屬性并警示的功能

用戶可以通過極少的操作自行設(shè)置需要監(jiān)控的屬性

除了預(yù)設(shè)的監(jiān)控屬性琳彩,GooDs系統(tǒng)還能夠通過分析趨勢,
自動監(jiān)控數(shù)據(jù)集的一些公共屬性


6 經(jīng)驗總結(jié)(lessons learned)

  • 隨著使用不斷演進(evolve as you go)
GooDs系統(tǒng)期初的設(shè)計只是為數(shù)據(jù)集提供一個目錄,
隨著不斷使用露乏,GooDs系統(tǒng)也演化出各種用途:

1) 監(jiān)測protocol buffer 
protocol buffer可能包含隱私信息

使用GooDs系統(tǒng)碧浊,工程師可以找到所有符合敏感protocol buffer的數(shù)據(jù)集

一旦有違規(guī),GooDs系統(tǒng)會提醒數(shù)據(jù)集所有者


2) 重新查找數(shù)據(jù)集(re-find datasets)  

工程師經(jīng)常會生成一些測試數(shù)據(jù)集瘟仿,但是事后忘記了數(shù)據(jù)集路徑辉词,

通過GooDs系統(tǒng)的關(guān)鍵字查詢,能夠找回這些數(shù)據(jù)集


3) 讀懂老代碼(understand legacy code)  

老代碼因缺乏最新的文檔而難讀

工程師通過GooDs系統(tǒng)提供的血緣圖譜猾骡,
能夠找到老代碼之前的執(zhí)行過程以及輸入輸出數(shù)據(jù)集瑞躺,
從而幫助理解老代碼的邏輯


4) 標注數(shù)據(jù)集(bookmark datasets)  

數(shù)據(jù)集的信息頁可以作為數(shù)據(jù)集天然的信息展示窗口

用戶可以標注信息頁并將數(shù)據(jù)集與其他用戶共享


5) 注釋數(shù)據(jù)集(annotate datasets)  

GooDs目錄類似中轉(zhuǎn)樞紐,數(shù)據(jù)集注釋得以在不同的團隊之間共享

  • 在排序中使用某個領(lǐng)域特有的信號(use domain-specific signals for ranking)
本文第二節(jié)中提到兴想,數(shù)據(jù)集排序問題有自己的特性幢哨,
與其他領(lǐng)域的排序不同(如網(wǎng)頁排序)

根據(jù)GooDs系統(tǒng)的使用經(jīng)驗,
不同數(shù)據(jù)集之間的血緣關(guān)系就為排序提供了領(lǐng)域特有的信號

比如很多團隊會為主數(shù)據(jù)集(master dataset)生成多個非規(guī)范化(denomalized)的版本

這些非規(guī)范化版本的數(shù)據(jù)集和主數(shù)據(jù)集匹配相同的關(guān)鍵字

但是顯而易見嫂便,GooDs系統(tǒng)會在常規(guī)查詢或者元數(shù)據(jù)提取中給主數(shù)據(jù)集更高的排序
  • 預(yù)見并處理非常規(guī)數(shù)據(jù)集(expect and handle unusual datasets)
目錄中龐大的數(shù)據(jù)集數(shù)量在GooDs系統(tǒng)早期產(chǎn)生了許多意外場景

在經(jīng)驗中GooDs系統(tǒng)形成了處理非常規(guī)數(shù)據(jù)集的策略:
首先提供最簡單的特定問題解決方案捞镰,
接著在必要時歸納出同一類問題的總體解決方案
  • 按需導(dǎo)出數(shù)據(jù)(export data as required)
GooDs目錄的存儲中介是鍵值對存儲系統(tǒng),
搜索服務(wù)依賴的是傳統(tǒng)倒排索引毙替,
二者均不適合對血緣圖譜可視化或者執(zhí)行復(fù)雜的路徑查詢

為了滿足上述需求岸售,
GooDs系統(tǒng)會將目錄數(shù)據(jù)按主謂賓的三元組結(jié)構(gòu)(subject-predicate-object triples)導(dǎo)出

GooDs系統(tǒng)會將這項元組數(shù)據(jù)導(dǎo)入到一個基于圖形的存儲系統(tǒng),
支持路徑查詢并暴露更適合可視化的API

如果用戶需要更強大的查詢能力厂画,現(xiàn)有存儲系統(tǒng)無法支持凸丸,
最簡單的方式就是將目錄數(shù)據(jù)導(dǎo)出到一個合適的專門引擎中
  • 保證可恢復(fù)性(ensure recoverability)
從數(shù)以十億計的數(shù)據(jù)集提取元數(shù)據(jù)的計算成本非常高

穩(wěn)定狀態(tài)下,GooDs系統(tǒng)在單日內(nèi)處理一天量的新數(shù)據(jù)集

丟失或損毀目錄的重要部分可能需要數(shù)周恢復(fù)袱院,
而且部分元數(shù)據(jù)在數(shù)據(jù)丟失后無法重現(xiàn)計算

為了保證可恢復(fù)性屎慢,GooDs系統(tǒng)將Bigtable設(shè)置為保留若干天內(nèi)的滾動窗口快照

GooDs系統(tǒng)自身也有有量身定制的恢復(fù)方案:

a) 新設(shè)一個進程,在獨立的目錄忽洛,專門為重要的數(shù)據(jù)集拍攝快照

b) 另一個進程則備份目錄中提供信息頁的子集腻惠,
在主目錄掉線時數(shù)據(jù)集信息頁服務(wù)仍然可用

c) 此外,GooDs自身也啟用了數(shù)據(jù)集監(jiān)控服務(wù)欲虚,
保證盡早檢測到數(shù)據(jù)損毀或丟失

上述措施都是在修復(fù)目錄的經(jīng)驗中總結(jié)出的方案集灌,
其中有一些曾導(dǎo)致用戶交互服務(wù)出現(xiàn)嚴重中斷事故


7 相關(guān)研究(related work)

這一節(jié)列舉了一些類似的數(shù)據(jù)管理系統(tǒng)

這些系統(tǒng)中的某些用途和GooDs系統(tǒng)差不多,
但是GooDs系統(tǒng)還需要從各方面解決自身面臨的需求痛點
  • 數(shù)據(jù)湖(data lake)
GooDs系統(tǒng)可以看做一個數(shù)據(jù)湖复哆,一種用于存儲海量數(shù)據(jù)且訪問便捷的倉庫欣喧,
數(shù)據(jù)在生成的時候無需重新分類

GooDs是用于組織和索引數(shù)據(jù)湖的系統(tǒng),這個數(shù)據(jù)湖包含了Google內(nèi)部所有的數(shù)據(jù)集

其他公司也有類似的系統(tǒng)寂恬,
Google與之不同的地方在于數(shù)據(jù)湖的規(guī)模和post-hoc的元數(shù)據(jù)推斷方式

  • 元數(shù)據(jù)的生成方式不同
DataHub, Microsoft Azure Marketplace等數(shù)據(jù)集版本管理系統(tǒng)中续誉,
數(shù)據(jù)集所有者可以選擇主動參與元數(shù)據(jù)的生成

GooDs系統(tǒng)采用了post-hoc方式生成目錄,
工程師在生成和維護數(shù)據(jù)集的時候無需考慮GooDs系統(tǒng)的存在
  • 數(shù)據(jù)集與網(wǎng)頁表格的不同
有一些系統(tǒng)可以從html頁面中提取表格

GooDs系統(tǒng)處理的數(shù)據(jù)集和這些表格中的數(shù)據(jù)結(jié)構(gòu)不同

這些表格數(shù)據(jù)沒有元數(shù)據(jù)初肉,而元數(shù)據(jù)對于數(shù)據(jù)集又想當重要
  • 快速和高效的搜索
Spyglass等系統(tǒng)提供了強大的基于元數(shù)據(jù)的搜索功能

GooDs系統(tǒng)處理的數(shù)據(jù)集不在一個存儲系統(tǒng)中,
沒有足夠多的現(xiàn)成元數(shù)據(jù)饰躲,
而且GooDs系統(tǒng)旨在提供比搜索更豐富的功能
  • 對超大數(shù)據(jù)集進行索引和搜索
已經(jīng)有研究在探索對超大數(shù)據(jù)集進行索引和搜索

GooDs系統(tǒng)需要解決本文第二節(jié)中列舉的各類問題

如果GooDs要搜索數(shù)據(jù)集的實際內(nèi)容而不是元數(shù)據(jù)時牙咏,
這些研究或許相關(guān)性更大
  • 血緣關(guān)系管理
PASS和Trio等系統(tǒng)也會維護文件的血緣關(guān)系臼隔,
但是前提是這些血緣信息都是已知的或者能夠從訪問數(shù)據(jù)的進程中獲得

GooDs系統(tǒng)需要依賴一些微弱的信號推斷血緣信息,
但是卻將血緣信息當做數(shù)據(jù)集排序的強信號


8 結(jié)論和展望(conclusions and future work)

  • 總結(jié)
本文介紹的數(shù)據(jù)管理系統(tǒng)妄壶,可訪問企業(yè)內(nèi)部數(shù)以十億計的數(shù)據(jù)集的元數(shù)據(jù)
  • 挑戰(zhàn)
1) 對數(shù)據(jù)集全排列摔握,鑒別重要數(shù)據(jù)集,數(shù)據(jù)集的排序方法是否和網(wǎng)頁排序方法類似

2) 完善元數(shù)據(jù)需要依賴各種資源和信息

3) 理解隱含在數(shù)據(jù)集中的語義信息能為用戶提供更有效的搜索服務(wù)丁寄,
而對語義的理解也需要借助其他資源比如Google的知識圖譜(Knowledge Graph)

4) 數(shù)據(jù)集產(chǎn)生的時候就在GooDs上注冊能夠保持目錄更新氨淌,
而這種方式需要修改現(xiàn)有的存儲系統(tǒng),與GooDs非侵入式的理念沖突伊磺,
如何結(jié)合非侵入式和侵入式仍然有待解決

  • 期望
希望類似GooDs的數(shù)據(jù)管理系統(tǒng)能夠助推數(shù)據(jù)導(dǎo)向型公司培養(yǎng)一種數(shù)據(jù)文化

企業(yè)將數(shù)據(jù)當作企業(yè)核心資產(chǎn)盛正,發(fā)展出類似"代碼規(guī)約"的"數(shù)據(jù)規(guī)約(data discipline)"

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市屑埋,隨后出現(xiàn)的幾起案子豪筝,更是在濱河造成了極大的恐慌,老刑警劉巖摘能,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件续崖,死亡現(xiàn)場離奇詭異,居然都是意外死亡团搞,警方通過查閱死者的電腦和手機严望,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逻恐,“玉大人著蟹,你說我怎么就攤上這事∩颐В” “怎么了萧豆?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長昏名。 經(jīng)常有香客問我涮雷,道長,這世上最難降的妖魔是什么轻局? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任洪鸭,我火速辦了婚禮,結(jié)果婚禮上仑扑,老公的妹妹穿的比我還像新娘览爵。我一直安慰自己,他們只是感情好镇饮,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布蜓竹。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俱济。 梳的紋絲不亂的頭發(fā)上嘶是,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音蛛碌,去河邊找鬼聂喇。 笑死,一個胖子當著我的面吹牛蔚携,可吹牛的內(nèi)容都是我干的希太。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼酝蜒,長吁一口氣:“原來是場噩夢啊……” “哼誊辉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起秕硝,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤芥映,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后远豺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奈偏,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年躯护,在試婚紗的時候發(fā)現(xiàn)自己被綠了惊来。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡棺滞,死狀恐怖裁蚁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情继准,我是刑警寧澤枉证,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站移必,受9級特大地震影響室谚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜崔泵,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一秒赤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧憎瘸,春花似錦入篮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痊项。三九已至,卻和暖如春饲做,著一層夾襖步出監(jiān)牢的瞬間线婚,已是汗流浹背遏弱。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工盆均, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漱逸。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓泪姨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饰抒。 傳聞我的和親對象是個殘疾皇子肮砾,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容