數(shù)據(jù)cpjl修煉手冊(cè)2

三冤寿、數(shù)據(jù)倉庫理論與應(yīng)用

3.1大數(shù)據(jù)基礎(chǔ)Hadoop

3.1.1Hadoop三架馬車

Hadoop是一個(gè)分布式系統(tǒng)基礎(chǔ)架構(gòu)车吹,現(xiàn)在被廣泛地應(yīng)用于大數(shù)據(jù)平臺(tái)的開發(fā)尚镰,對(duì)處理海量數(shù)據(jù)有著其他技術(shù)無可匹敵的優(yōu)勢鼻种。

HDFS(Hadoop Distributed File System)、MapReduce與HBase被譽(yù)為分布式計(jì)算的三駕馬車澜薄。Hadoop基本架構(gòu)的底層是HDFS为肮,上面運(yùn)行的是MapReduce、Tez肤京、Spark颊艳,再往上封裝的是Pig和Hive

大數(shù)據(jù)技術(shù)首要的要求就是先把數(shù)據(jù)存下來HDFS為了解決存儲(chǔ)的問題忘分,把大量的數(shù)據(jù)用成千上萬臺(tái)機(jī)器存儲(chǔ)棋枕,而用戶在前端看到的只是一個(gè)文件系統(tǒng),而不是許多文件系統(tǒng)妒峦,這是一種對(duì)用戶友好的處理方式重斑。HDFS會(huì)集中管理數(shù)據(jù),用戶只需要把精力花費(fèi)在如何使用和處理數(shù)據(jù)上

在解決了數(shù)據(jù)存儲(chǔ)的問題之后肯骇,如何更高效地處理數(shù)據(jù)呢窥浪?如果讓一臺(tái)機(jī)器處理TB級(jí)或者PB級(jí)的數(shù)據(jù),那么可能會(huì)花費(fèi)幾天甚至幾周的時(shí)間笛丙,而這對(duì)于很多公司的業(yè)務(wù)來說是不可接受的漾脂。

MapReduce/Spark提供一種可靠的、能夠運(yùn)行在集群上的計(jì)算模型胚鸯。MapReduce會(huì)把所有的函數(shù)都分為兩類骨稿,即Map和Reduce。Map會(huì)將數(shù)據(jù)分成很多份蠢琳,然后分配給不同的機(jī)器處理啊终;Reduce把計(jì)算的結(jié)果合并,得到最終的結(jié)果傲须。

但是如果直接使用MapReduce的程序蓝牲,會(huì)發(fā)現(xiàn)使用門檻比較高,Hive和Pig基于MapReduce的基礎(chǔ)封裝出一個(gè)更友好泰讽、更簡單的方式例衍,可以很容易地實(shí)現(xiàn)MapReduce程序。Pig以類似腳本的方式實(shí)現(xiàn)MapReduce已卸,Hive以SQL的方式實(shí)現(xiàn)佛玄。Hive和Pig會(huì)把腳本或者SQL自動(dòng)翻譯成MapReduce程序,然后交給計(jì)算引擎執(zhí)行計(jì)算累澡。

除了Hadoop體系架構(gòu)那些基礎(chǔ)工具外梦抢,還需要對(duì)以下幾個(gè)基礎(chǔ)工具做一些了解。

(1)Spark愧哟。Spark是一個(gè)開源的集群計(jì)算環(huán)境奥吩,Spark與Hadoop之間既相互補(bǔ)充哼蛆,又相互競爭。Spark啟用了內(nèi)存分布數(shù)據(jù)集霞赫,在處理某些工作負(fù)載方面表現(xiàn)得更加優(yōu)越腮介,交互也會(huì)更加友好。

(2)Kafka端衰。Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng)叠洗,它可以處理各大網(wǎng)站或者App中用戶的動(dòng)作流數(shù)據(jù)。用戶行為數(shù)據(jù)是后續(xù)進(jìn)行業(yè)務(wù)分析和優(yōu)化的重要數(shù)據(jù)資產(chǎn)旅东,這些數(shù)據(jù)通常以處理日志和日志聚合的方式解決灭抑。

(3)Storm。Storm主要應(yīng)用于分布式數(shù)據(jù)處理玉锌,包括實(shí)時(shí)分析名挥、在線機(jī)器學(xué)習(xí)、信息流處理主守、連續(xù)性的計(jì)算禀倔、ETL等。Storm還可以應(yīng)用于實(shí)時(shí)處理参淫,被稱為實(shí)時(shí)版的Hadoop救湖,每秒可以處理百萬級(jí)的消息,并且Storm可以保證每個(gè)消息都能夠得到處理涎才,具有運(yùn)維簡單鞋既、高度容錯(cuò)、無數(shù)據(jù)丟失耍铜、多語言的特點(diǎn)邑闺。

(4)HBase。HBase是一個(gè)構(gòu)建于HDFS上的分布式棕兼、面向列的存儲(chǔ)系統(tǒng)陡舅。以Key-Value對(duì)的方式存儲(chǔ)數(shù)據(jù)并對(duì)存取操作做了優(yōu)化,能夠飛快地根據(jù)Key獲取綁定的數(shù)據(jù)伴挚。例如靶衍,從幾PB的數(shù)據(jù)中找身份證號(hào)只需要零點(diǎn)幾秒。

(5)HUE茎芋。HUE 是Cloudera 的大數(shù)據(jù)Web可視化工具颅眶,主要用來簡化用戶和Hadoop集群的交互√锩郑可以在Web頁面把數(shù)據(jù)從HDFS等系統(tǒng)導(dǎo)入Hive中涛酗,可以直接通過HUE以HiveQL的方式對(duì)數(shù)據(jù)查詢展現(xiàn)。同時(shí),還可以保存SQL語句煤杀,并查看和刪除歷史SQL語句眷蜈,對(duì)于查詢后的數(shù)據(jù),可以選擇表格沈自、柱狀圖、折線圖辜妓、餅狀圖枯途、地圖等多種可視化圖形展現(xiàn),操作十分簡單籍滴,如果想繼續(xù)分析酪夷,可以使用下載功能下載保存為Excel。

(6)Oozie孽惰。Oozie 是一個(gè)工作流調(diào)度系統(tǒng)晚岭,統(tǒng)一管理工作流的調(diào)度順序、安排任務(wù)的執(zhí)行時(shí)間等勋功,用來管理Hadoop的任務(wù)坦报。Oozie集成了Hadoop的MapReduce、Pig狂鞋、Hive等協(xié)議以及Java片择、Shell腳本等任務(wù),底層仍然是一個(gè)MapReduce程序骚揍。

(7)ZooKeeper字管。ZooKeeper是Hadoop和HBase的重要組件,是一個(gè)分布式開放的應(yīng)用程序協(xié)調(diào)服務(wù)信不,主要為應(yīng)用提供配置維護(hù)嘲叔、域名服務(wù)、分布式同步抽活、組服務(wù)等一致性服務(wù)硫戈。

(8)YARN。Hadoop生態(tài)有很多工具酌壕,為了保證這些工具有序地運(yùn)行在同一個(gè)集群上掏愁,需要有一個(gè)調(diào)度系統(tǒng)進(jìn)行協(xié)調(diào)指揮,YARN就是基于此背景誕生的資源統(tǒng)一管理平臺(tái)卵牍。

3.1.2其他常用工具

除了上面介紹的基礎(chǔ)工具之外果港,以下是一些常用工具。

(1)Elasticsearch糊昙。Elasticsearch是基于Lucene的搜索服務(wù)器辛掠,提供了一個(gè)基于多用戶的分布式全文搜索引擎,基于RESTful Web接口。Elasticsearch作為Apache許可條款下的開放源碼發(fā)布萝衩,是當(dāng)前流行的企業(yè)級(jí)搜索引擎回挽。Elasticsearch主要應(yīng)用于云計(jì)算中,能夠?qū)崿F(xiàn)實(shí)時(shí)搜索猩谊,具有穩(wěn)定千劈、可靠、快速牌捷、安裝和使用方便的特點(diǎn)墙牌。

(2)Memcached。Memcached是一個(gè)開源的暗甥、高性能喜滨、分布式內(nèi)存對(duì)象緩存系統(tǒng),基于內(nèi)存的Key-Value存儲(chǔ)撤防,解決了大數(shù)據(jù)量緩存的問題虽风,主要應(yīng)用于減輕數(shù)據(jù)庫負(fù)載。它通過在內(nèi)存中緩存數(shù)據(jù)查詢結(jié)果寄月,減少數(shù)據(jù)庫訪問次數(shù)來提高動(dòng)態(tài)網(wǎng)址應(yīng)用的速度辜膝。同時(shí),因?yàn)樗銐蚝啙嵍鴱?qiáng)大剥懒,便于快速開發(fā)内舟,所以得到了廣泛的應(yīng)用。

(3)Redis初橘。Redis是開源的可以基于內(nèi)存同時(shí)也可以持久化的日志型Key-Value數(shù)據(jù)庫验游,它使用ANSI C語言編寫,支持網(wǎng)絡(luò)保檐,并提供多種語言的API耕蝉。與Memcached類似,為了保證查詢速度和效率夜只,數(shù)據(jù)都是緩存在內(nèi)存中的垒在,區(qū)別的是Redis多了一步持久性操作,會(huì)定期把更新的數(shù)據(jù)寫入磁盤或者文件中扔亥,并且在此基礎(chǔ)上實(shí)現(xiàn)主從模式的數(shù)據(jù)同步场躯。正是因?yàn)镽edis的這一點(diǎn),它可以很好地彌補(bǔ)Memcached這類單純基于Key-Value存儲(chǔ)的不足旅挤,在一些應(yīng)用場景中踢关,可以配合關(guān)系型數(shù)據(jù)庫一起使用,同時(shí)對(duì)關(guān)系型數(shù)據(jù)庫起到了很好的補(bǔ)充作用粘茄。

3.2大數(shù)據(jù)平臺(tái)層級(jí)結(jié)構(gòu)

根據(jù)大數(shù)據(jù)平臺(tái)架構(gòu)中流入和流出的過程签舞,可以把其分為三層——原始數(shù)據(jù)層秕脓、數(shù)據(jù)倉庫、數(shù)據(jù)應(yīng)用層儒搭。

原始數(shù)據(jù)層吠架,也叫ODS(Operational Data Store)層,一般由基礎(chǔ)日志數(shù)據(jù)搂鲫、業(yè)務(wù)線上庫和其他來源數(shù)據(jù)獲得傍药。

數(shù)據(jù)倉庫的數(shù)據(jù)來自對(duì)ODS層的數(shù)據(jù)經(jīng)過ETL(抽取Extra,轉(zhuǎn)化Transfer默穴,裝載Load)處理怔檩。


數(shù)據(jù)倉庫的主要功能是以O(shè)DS層數(shù)據(jù)為基礎(chǔ),通過邏輯加工產(chǎn)出數(shù)據(jù)倉庫主題表蓄诽。數(shù)據(jù)倉庫又細(xì)分為基礎(chǔ)層、主題層和數(shù)據(jù)集市

數(shù)據(jù)應(yīng)用層主要用于處理消費(fèi)數(shù)據(jù)倉庫的數(shù)據(jù)

3.2.1ODS層

對(duì)于ODS層而言媒吗,客戶端用戶操作日志是一個(gè)主要的數(shù)據(jù)來源仑氛,它是分析App和產(chǎn)品優(yōu)化的基礎(chǔ);另一部分來源于業(yè)務(wù)的數(shù)據(jù)庫闸英,例如訂單的交易情況锯岖。

ODS層是當(dāng)前的、不斷變化的數(shù)據(jù)甫何,而數(shù)據(jù)倉庫保留的是歷史的出吹、不再變化的數(shù)據(jù),所以一般來說會(huì)落后ODS層一天或一天以上的數(shù)據(jù)辙喂。

ODS層具備以下幾個(gè)作用:

(1)在業(yè)務(wù)系統(tǒng)和數(shù)據(jù)倉庫之間形成一個(gè)隔離層捶牢。

(2)轉(zhuǎn)移一部分業(yè)務(wù)系統(tǒng)細(xì)節(jié)查詢的功能

(3)完成數(shù)據(jù)倉庫中不能完成的一些功能

3.2.2數(shù)據(jù)倉庫

數(shù)據(jù)倉庫(Data Warehouse,DW)是為了方便企業(yè)快速做各種業(yè)務(wù)決策提供數(shù)據(jù)支撐而構(gòu)建的集成化數(shù)據(jù)環(huán)境巍耗。

數(shù)據(jù)倉庫本身并不“生產(chǎn)”任何數(shù)據(jù)秋麸,同時(shí)自身也不需要“消費(fèi)”任何數(shù)據(jù),數(shù)據(jù)來源于外部炬太,并且開放給外部應(yīng)用

根據(jù)數(shù)據(jù)倉庫處理的數(shù)據(jù)層次不同灸蟆,數(shù)據(jù)倉庫主要分為基礎(chǔ)層、主題層亲族、數(shù)據(jù)集市這三層炒考。

1.基礎(chǔ)層

基礎(chǔ)層的主要作用是對(duì)ODS層的數(shù)據(jù)進(jìn)行輕度匯總,產(chǎn)出輕度匯總明細(xì)霎迫、維度表斋枢、碼表、事實(shí)集等一些基礎(chǔ)數(shù)據(jù)女气。

2.主題層

主題層為數(shù)據(jù)的高度聚合層杏慰,按照一定的維度和業(yè)務(wù)邏輯,對(duì)一類數(shù)據(jù)進(jìn)行聚合,主要生成畫像表和主題表缘滥。主題層的數(shù)據(jù)來源是基礎(chǔ)層和ODS層轰胁。

3.數(shù)據(jù)集市

數(shù)據(jù)集市(Data Mart)也叫數(shù)據(jù)市場,主要功能是將主題層和基礎(chǔ)層的數(shù)據(jù)按各業(yè)務(wù)需求進(jìn)行聚合朝扼,生成寬表和Cube赃阀,并直接推送給數(shù)據(jù)分析和業(yè)務(wù)部門使用,例如直接推送表數(shù)據(jù)至MySQL數(shù)據(jù)庫擎颖。

3.2.3數(shù)據(jù)的應(yīng)用

大數(shù)據(jù)的分析應(yīng)用主要分為以下三種形式榛斯。

第一種是描述性分析應(yīng)用。主要用來描述所關(guān)注的業(yè)務(wù)的數(shù)據(jù)表現(xiàn)搂捧,主要關(guān)注事情表面發(fā)生了什么驮俗,在數(shù)據(jù)分析之后,把數(shù)據(jù)可視化展現(xiàn)出來允跑,讓用戶可以了解業(yè)務(wù)的發(fā)展?fàn)顩r王凑。

第二種是預(yù)測性分析應(yīng)用。在描述性數(shù)據(jù)的基礎(chǔ)上聋丝,根據(jù)歷史數(shù)據(jù)情況索烹,在一定的算法和模型的指導(dǎo)下,進(jìn)一步預(yù)測業(yè)務(wù)的數(shù)據(jù)趨勢弱睦。例如百姓,美國歷年的總統(tǒng)大選預(yù)測結(jié)果、天氣預(yù)報(bào)預(yù)測天氣等都屬于預(yù)測性分析况木。

第三種是指導(dǎo)性分析應(yīng)用垒拢。基于現(xiàn)有的數(shù)據(jù)和對(duì)未來的預(yù)測情況焦读,可以用來指導(dǎo)完成一些業(yè)務(wù)決策和建議子库,例如為公司制訂戰(zhàn)略和運(yùn)營決策,真正通過數(shù)據(jù)驅(qū)動(dòng)決策矗晃,充分發(fā)揮大數(shù)據(jù)的價(jià)值仑嗅。

3.3數(shù)據(jù)埋點(diǎn)

一種常用的數(shù)據(jù)采集方法

3.3.1埋點(diǎn)方式

前端的埋點(diǎn)方式主要分為代碼埋點(diǎn)、可視化埋點(diǎn)张症、無埋點(diǎn)三種仓技。

1.代碼埋點(diǎn)

代碼埋點(diǎn)主要由App研發(fā)工程師手工在程序中寫代碼實(shí)現(xiàn),通過觸發(fā)某個(gè)動(dòng)作后程序自動(dòng)發(fā)送數(shù)據(jù)俗他。優(yōu)點(diǎn):具有很強(qiáng)的靈活性脖捻,可以控制發(fā)送的時(shí)機(jī)和發(fā)送方式等。缺點(diǎn):人力成本較高兆衅,需要研發(fā)工程師手工開發(fā)程序地沮,有時(shí)候還要依賴App發(fā)版來生效嗜浮。

2.可視化埋點(diǎn)

可視化埋點(diǎn)以前端可視化的方式記錄前端設(shè)置頁面元素與對(duì)其操作的關(guān)系,然后以后端截屏的方式統(tǒng)計(jì)數(shù)據(jù)摩疑。優(yōu)點(diǎn):簡單危融、方便,能夠快速地埋點(diǎn)雷袋。缺點(diǎn):比較受限吉殃,上報(bào)的行為信息有限。

3.無埋點(diǎn)

無埋點(diǎn)綁定頁面的各個(gè)控件楷怒,當(dāng)事件觸發(fā)時(shí)就會(huì)調(diào)用相關(guān)的接口上報(bào)數(shù)據(jù)蛋勺。優(yōu)點(diǎn):不需要埋點(diǎn),方便鸠删、快捷抱完、省事。缺點(diǎn):傳輸數(shù)據(jù)量比較大刃泡,需要消耗一定的數(shù)據(jù)存儲(chǔ)資源乾蛤。

3.3.2埋點(diǎn)事件

在記錄埋點(diǎn)信息時(shí),主要的埋點(diǎn)事件分為點(diǎn)擊事件捅僵、曝光事件和頁面停留時(shí)長三類。

1.點(diǎn)擊事件

用戶每點(diǎn)擊頁面上的一個(gè)按鈕一下都會(huì)記錄一次數(shù)據(jù)

2.曝光事件

當(dāng)用戶成功地進(jìn)入一個(gè)頁面時(shí)記錄一次數(shù)據(jù)眨层,當(dāng)刷新一次頁面時(shí)也會(huì)記錄一次數(shù)據(jù)庙楚,如果通過手機(jī)Home鍵切換出去,則不會(huì)記錄趴樱,因?yàn)橐呀?jīng)脫離了App馒闷,此處記錄也沒有太大的分析價(jià)值,記錄上來可能污染數(shù)據(jù)叁征。

3.頁面停留時(shí)長

頁面停留時(shí)長主要用來記錄用戶在一個(gè)頁面的停留時(shí)間纳账,它可以通過記錄用戶進(jìn)入頁面的時(shí)間t1和離開頁面的時(shí)間t2計(jì)算,計(jì)算公式可以簡單地表示為:用戶停留時(shí)間=離開頁面時(shí)間t2-進(jìn)入頁面時(shí)間t1捺疼。

3.3.3數(shù)據(jù)埋點(diǎn)實(shí)例

現(xiàn)在App端的數(shù)據(jù)埋點(diǎn)一般采取Key-Value的形式疏虫,Key一般表示某個(gè)事件Value代表相對(duì)應(yīng)的值啤呼,一個(gè)Key可以對(duì)應(yīng)一個(gè)Value或者多個(gè)Value卧秘。

3.4指標(biāo)字典

指標(biāo)字典,是業(yè)務(wù)數(shù)據(jù)標(biāo)準(zhǔn)化的基礎(chǔ)官扣,目的是對(duì)指標(biāo)進(jìn)行統(tǒng)一管理翅敌,方便共享,達(dá)成對(duì)業(yè)務(wù)指標(biāo)的共識(shí)惕蹄,并且統(tǒng)一修改和維護(hù)蚯涮。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末治专,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子遭顶,更是在濱河造成了極大的恐慌张峰,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件液肌,死亡現(xiàn)場離奇詭異挟炬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嗦哆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門谤祖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人老速,你說我怎么就攤上這事粥喜。” “怎么了橘券?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵额湘,是天一觀的道長。 經(jīng)常有香客問我旁舰,道長锋华,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任箭窜,我火速辦了婚禮毯焕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘磺樱。我一直安慰自己纳猫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布竹捉。 她就那樣靜靜地躺著芜辕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪块差。 梳的紋絲不亂的頭發(fā)上侵续,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音憾儒,去河邊找鬼询兴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛起趾,可吹牛的內(nèi)容都是我干的诗舰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼训裆,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼眶根!你這毒婦竟也來了蜀铲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤属百,失蹤者是張志新(化名)和其女友劉穎记劝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體族扰,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厌丑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渔呵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怒竿。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扩氢,靈堂內(nèi)的尸體忽然破棺而出耕驰,到底是詐尸還是另有隱情,我是刑警寧澤录豺,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布朦肘,位于F島的核電站,受9級(jí)特大地震影響双饥,放射性物質(zhì)發(fā)生泄漏媒抠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一咏花、第九天 我趴在偏房一處隱蔽的房頂上張望领舰。 院中可真熱鬧,春花似錦迟螺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至排霉,卻和暖如春窍株,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背攻柠。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國打工球订, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瑰钮。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓冒滩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浪谴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子开睡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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