Yarn 術(shù)語(yǔ)

(1) YARN

下一代MapReduce框架的名稱(chēng),為了容易記憶,一般稱(chēng)為MRv2(MapReduce version 2)。該框架已經(jīng)不再是一個(gè)傳統(tǒng)的MapReduce框架,甚至與MapReduce無(wú)關(guān),她是一個(gè)通用的運(yùn)行時(shí)框架,用戶(hù)可以編寫(xiě)自己的計(jì)算框架,在該運(yùn)行環(huán)境中運(yùn)行。用于自己編寫(xiě)的框架作為客戶(hù)端的一個(gè)lib,在運(yùn)用提交作業(yè)時(shí)打包即可。該框架為提供了以下幾個(gè)組件:

<1> 資源管理:包括應(yīng)用程序管理和機(jī)器資源管理

<2> 資源雙層調(diào)度

<3> 容錯(cuò)性:各個(gè)組件均有考慮容錯(cuò)性

<4> 擴(kuò)展性:可擴(kuò)展到上萬(wàn)個(gè)節(jié)點(diǎn)

2) ResourceManager

簡(jiǎn)稱(chēng)“RM”。

MRv2最基本的設(shè)計(jì)思想是將JobTracker的兩個(gè)主要功能,即資源管理和作業(yè)調(diào)度/監(jiān)控分成兩個(gè)獨(dú)立的進(jìn)程。在該解決方案中包含兩個(gè)組件:全局的ResourceManager(RM)和與每個(gè)應(yīng)用相關(guān)的ApplicationMaster(AM)。這里的“應(yīng)用”指一個(gè)單獨(dú)的MapReduce作業(yè)或者DAG作業(yè)。RM和與NodeManager(NM,每個(gè)節(jié)點(diǎn)一個(gè))共同組成整個(gè)數(shù)據(jù)計(jì)算框架。RM是系統(tǒng)中將資源分配給各個(gè)應(yīng)用的最終決策者。AM實(shí)際上是一個(gè)具體的框架庫(kù),它的任務(wù)是【與RM協(xié)商獲取應(yīng)用所需資源】和【與NM合作,以完成執(zhí)行和監(jiān)控task的任務(wù)】。

RM有兩個(gè)組件組成:

調(diào)度器(Scheduler)

應(yīng)用管理器(ApplicationsManager,ASM)

調(diào)度器根據(jù)容量,隊(duì)列等限制條件(如每個(gè)隊(duì)列分配一定的資源,最多執(zhí)行一定數(shù)量的作業(yè)等),將系統(tǒng)中的資源分配給各個(gè)正在運(yùn)行的應(yīng)用。這里的調(diào)度器是一個(gè)“純調(diào)度器”,因?yàn)樗辉儇?fù)責(zé)監(jiān)控或者跟蹤應(yīng)用的執(zhí)行狀態(tài)等,此外,他也不負(fù)責(zé)重新啟動(dòng)因應(yīng)用執(zhí)行失敗或者硬件故障而產(chǎn)生的失敗任務(wù)。調(diào)度器僅根據(jù)各個(gè)應(yīng)用的資源需求進(jìn)行調(diào)度,這是通過(guò)抽象概念“資源容器”完成的,資源容器(Resource Container)將內(nèi)存,CPU,磁盤(pán),網(wǎng)絡(luò)等資源封裝在一起,從而限定每個(gè)任務(wù)使用的資源量。

調(diào)度器內(nèi)嵌有策略可插拔的插件,主要負(fù)責(zé)將集群中得資源分配給多個(gè)隊(duì)列和應(yīng)用。當(dāng)前MapReduce的調(diào)度器,如Capacity Scheduler和Fair Scheduler,均可作為該插件。

(3)NodeManager

簡(jiǎn)稱(chēng)“NM”。

NM是每個(gè)節(jié)點(diǎn)上的框架代理,主要負(fù)責(zé)啟動(dòng)應(yīng)用所需的容器,監(jiān)控資源(內(nèi)存,CPU,磁盤(pán),網(wǎng)絡(luò)等)的使用情況并將之匯報(bào)給調(diào)度器。

一句話(huà):“NM主要用于管理某個(gè)節(jié)點(diǎn)上的task和資源”。

(4)ApplicationsManager

簡(jiǎn)稱(chēng)“ASM”。

ASM主要負(fù)責(zé)接收作業(yè),協(xié)商獲取第一個(gè)容器用于執(zhí)行AM和提供重啟失敗AM container的服務(wù)。

一句話(huà):“ASM主要用于管理AM”。

(5)ApplicationMaster

簡(jiǎn)稱(chēng)“AM”。

AM主要負(fù)責(zé)同調(diào)度器協(xié)商以獲取合適的容器,并跟蹤這些容器的狀態(tài)和監(jiān)控其進(jìn)度。

一句話(huà):“AM主要用于管理其對(duì)應(yīng)的應(yīng)用程序,如MapReduce作業(yè),DAG作業(yè)等”。

(6) Container

容器中封裝了機(jī)器資源,如內(nèi)存,CPU, 磁盤(pán),網(wǎng)絡(luò)等,每個(gè)任務(wù)會(huì)被分配一個(gè)容器,該任務(wù)只能在該容器中執(zhí)行,并使用該容器封裝的資源。

怎樣將某個(gè)計(jì)算框架(MapReduce,HAMA,Giraph)部署到Y(jié)ARN中?

答:需要編寫(xiě)一個(gè)ApplicaionMaster。


MRv2最基本的設(shè)計(jì)思想是將JobTracker的兩個(gè)主要功能,即資源管理和作業(yè)調(diào)度/監(jiān)控分成兩個(gè)獨(dú)立的進(jìn)程。在該解決方案中包含兩個(gè)組件:全局的ResourceManager(RM)和與每個(gè)應(yīng)用相關(guān)的ApplicationMaster(AM)。這里的“應(yīng)用”指一個(gè)單獨(dú)的MapReduce作業(yè)或者DAG作業(yè)。RM和與NodeManager(NM,每個(gè)節(jié)點(diǎn)一個(gè))共同組成整個(gè)數(shù)據(jù)計(jì)算框架。RM是系統(tǒng)中將資源分配給各個(gè)應(yīng)用的最終決策者。AM實(shí)際上是一個(gè)具體的框架庫(kù),它的任務(wù)是【與RM協(xié)商獲取應(yīng)用所需資源】和【與NM合作,以完成執(zhí)行和監(jiān)控task的任務(wù)】。

RM有兩個(gè)組件組成:

調(diào)度器(Scheduler)

應(yīng)用管理器(ApplicationsManager,ASM)

調(diào)度器根據(jù)容量,隊(duì)列等限制條件(如每個(gè)隊(duì)列分配一定的資源,最多執(zhí)行一定數(shù)量的作業(yè)等),將系統(tǒng)中的資源分配給各個(gè)正在運(yùn)行的應(yīng)用。這里的調(diào)度器是一個(gè)“純調(diào)度器”,因?yàn)樗辉儇?fù)責(zé)監(jiān)控或者跟蹤應(yīng)用的執(zhí)行狀態(tài)等,此外,他也不負(fù)責(zé)重新啟動(dòng)因應(yīng)用執(zhí)行失敗或者硬件故障而產(chǎn)生的失敗任務(wù)。調(diào)度器僅根據(jù)各個(gè)應(yīng)用的資源需求進(jìn)行調(diào)度,這是通過(guò)抽象概念“資源容器”完成的,資源容器(Resource Container)將內(nèi)存,CPU,磁盤(pán),網(wǎng)絡(luò)等資源封裝在一起,從而限定每個(gè)任務(wù)使用的資源量。(注:Hadoop-0.23.0【資料一, 資料二】中的Container采用了“監(jiān)控linux進(jìn)程”來(lái)限制每個(gè)任務(wù)的資源,即:有個(gè)監(jiān)控線程周期性地從linux虛擬文件系統(tǒng)/proc/中讀取相應(yīng)進(jìn)程樹(shù)使用的資源總量,一旦檢測(cè)到超出限制,則直接kill該task,今后的版本想嚴(yán)格限制內(nèi)存,CPU,網(wǎng)絡(luò),磁盤(pán)等資源。

調(diào)度器是可插拔的組件,主要負(fù)責(zé)將集群中得資源分配給多個(gè)隊(duì)列和應(yīng)用。YARN自帶了多個(gè)資源調(diào)度器,如Capacity Scheduler和Fair Scheduler等。

ASM主要負(fù)責(zé)接收作業(yè),協(xié)商獲取第一個(gè)容器用于執(zhí)行AM和提供重啟失敗AM container的服務(wù)。

NM是每個(gè)節(jié)點(diǎn)上的框架代理,主要負(fù)責(zé)啟動(dòng)應(yīng)用所需的容器,監(jiān)控資源(內(nèi)存,CPU,磁盤(pán),網(wǎng)絡(luò)等)的使用情況并將之匯報(bào)給調(diào)度器。

AM主要負(fù)責(zé)同調(diào)度器協(xié)商以獲取合適的容器,并跟蹤這些容器的狀態(tài)和監(jiān)控其進(jìn)度。

【Resource Manager】資源模型在YARN 1.0中,調(diào)度器僅考慮了內(nèi)存資源。 每個(gè)節(jié)點(diǎn)由多個(gè)固定內(nèi)存大小(512MB或者1GB)的容器組成。AM可以申請(qǐng)?jiān)搩?nèi)存整數(shù)倍大小的容器。YARN最終會(huì)提供一個(gè)更加通用的資源模型,但在Yarn V1中,僅提供了一個(gè)相當(dāng)直接的模型:“資源模型完全是基于內(nèi)存的,且每個(gè)節(jié)點(diǎn)由若干個(gè)離散的內(nèi)存塊(chunk of memory)組成”。與Hadoop MapReduce不同,MRv2并沒(méi)有人為的將集群資源分成map slot和reduce slot。MRv2中的每個(gè)內(nèi)存塊是可互換的,這就提高了集群利用率—當(dāng)前Hadoop MapReduce的一個(gè)最大問(wèn)題是由于缺乏資源互換,作業(yè)會(huì)在reduce slot上存在瓶頸。(“互換”的意思是資源是對(duì)等的,所有資源形成一個(gè)資源池,任務(wù)可以從資源池中申請(qǐng)任意的資源,這就提高了資源利用率)對(duì)上一端進(jìn)一步解釋?zhuān)涸诋?dāng)前Hadoop MapReduce中,集群資源會(huì)被切分成map slot和reduce slot。在每個(gè)TaskTracker上,管理員可配置若干個(gè)map slot和reduce slot,slot可看做是令牌,map task拿到一個(gè)map slot后才可以運(yùn)行(對(duì)于reduce task類(lèi)似)。而管理員一般只根據(jù)CPU個(gè)數(shù)配置slot個(gè)數(shù)時(shí),如果CPU個(gè)數(shù)為12,則可配置8個(gè)map slot,4個(gè)reduce slot。這會(huì)導(dǎo)致兩個(gè)問(wèn)題:(1)實(shí)際的計(jì)算資源不僅僅是CPU,還有內(nèi)存,磁盤(pán)和網(wǎng)絡(luò)等,這些均需要考慮,只考慮某一種資源勢(shì)必會(huì)造成機(jī)器擁塞,這在共享集群環(huán)境下表現(xiàn)尤為顯著;(2)MapReduce計(jì)算流程是兩階段的,而這兩個(gè)階段存在依賴(lài)性:reduce task不會(huì)進(jìn)入sort和reduce階段,直到全部map task計(jì)算完成,而實(shí)際計(jì)算時(shí),map task完成一定的比例,便會(huì)啟動(dòng)reduce task,此時(shí)啟動(dòng)的reduce task全部處于shuffle階段,經(jīng)常會(huì)走走停停,導(dǎo)致該map slot資源利用率非常低。在Yarn中,任何一個(gè)應(yīng)用可申請(qǐng)任何內(nèi)存大小合理(合理是指內(nèi)存大小必須是memory chunck的整數(shù)倍)的容器,也可以申請(qǐng)各種類(lèi)型的容器。資源協(xié)商每個(gè)AM使用資源描述來(lái)申請(qǐng)一系列容器,其中可能包括一些特殊需求的機(jī)器。它也可以申請(qǐng)同一個(gè)機(jī)器上的多個(gè)容器。所有的資源請(qǐng)求是受應(yīng)用程序容量,隊(duì)列容量等限制的。AM負(fù)責(zé)計(jì)算應(yīng)用程序所需的資源量,比如MapReduce的input-splits,并把他們轉(zhuǎn)化成調(diào)度器可以理解的協(xié)議。當(dāng)前調(diào)度器可理解的協(xié)議是。以MapReduce為例,MapReduce AM分析input-splis,并將之轉(zhuǎn)化成以host為key的轉(zhuǎn)置表發(fā)送給RM。下圖為一個(gè)典型的AM資源請(qǐng)求:調(diào)度器會(huì)盡量匹配該表中的資源;如果某個(gè)特定機(jī)器上的資源是不可用的,調(diào)度器會(huì)提供同一個(gè)機(jī)架或者不同機(jī)架上的等量資源代替之。有些情況下,由于整個(gè)集群非常忙碌,AM獲取的資源可能不是最合適的,此時(shí)它可以拒絕這些資源并請(qǐng)求重新分配。調(diào)度調(diào)度器收集所有正在運(yùn)行的應(yīng)用程序的資源請(qǐng)求并構(gòu)建一個(gè)全局規(guī)劃進(jìn)行資源分配。調(diào)度器會(huì)根據(jù)應(yīng)用程序相關(guān)的約束(如合適的機(jī)器)和全局約束(如隊(duì)列資源總量,用戶(hù)可提交作業(yè)總數(shù)等)分配資源。調(diào)度器使用與容量調(diào)度類(lèi)似的概念,采用容量保證作為基本的策略在多個(gè)應(yīng)用程序間分配資源。調(diào)度器的調(diào)度策略如下:選擇系統(tǒng)中“服務(wù)最低”的隊(duì)列(如何定義服務(wù)最低?可以是資源利用量最低的隊(duì)列,即:已使用的資源與總共可用資源比值最?。脑撽?duì)列中選擇優(yōu)先級(jí)最高的作業(yè)盡量滿(mǎn)足該作業(yè)的資源請(qǐng)求調(diào)度器APIYarn 調(diào)度器與AM之間僅有一個(gè)API:Response allocate (Listask, Listrelease)

AM使用一個(gè)ResourceRequest列表請(qǐng)求特定資源,并同時(shí)可要求釋放一些調(diào)度器已經(jīng)分配的容器。

Response包含三方面內(nèi)容:新分配的容器列表,自從上次AM與RM交互以來(lái)已經(jīng)計(jì)算完成的容器的狀態(tài)(包含該容器中運(yùn)行task的詳細(xì)信息),當(dāng)前集群中剩余資源量。 AM收集完成容器的信息并對(duì)失敗的任務(wù)作出反應(yīng)。資源剩余量可用于AM調(diào)整接下來(lái)的資源請(qǐng)求,如MapReduce AM可使用該信息以合理調(diào)度maps和reduces從而防止產(chǎn)生死鎖。(何以“死鎖”?在MapReduce框架中,如果將所有資源分配給了map task,則可能會(huì)造成reduce? task饑餓,需要合理調(diào)整map資源和reduce 資源的比例)

資源監(jiān)控

調(diào)度器周期性地收到NM所在節(jié)點(diǎn)的資源變化信息,同時(shí),調(diào)度器會(huì)將已使用完的容器分配重新分給合適的AM。

AM的生命周期

ASM負(fù)責(zé)管理系統(tǒng)中所有應(yīng)用程序的AM,正如上一節(jié)所述,ASM負(fù)責(zé)啟動(dòng)AM,監(jiān)控AM的運(yùn)行狀態(tài),在AM失敗時(shí)對(duì)其進(jìn)行重啟等。

為了完成該功能,ASM主要有以下幾個(gè)組件:

(1) SchedulerNegotiator:與調(diào)度器協(xié)商容器資源,并返回給AM

(2)AMContainerManager:告知NM,啟動(dòng)或者停止某個(gè)AM的容器

(3)? AMMonitor:查看AM是否活著,并在必要的時(shí)候重啟AM

【NodeManager】

每個(gè)節(jié)點(diǎn)上裝有一個(gè)NM,主要的職責(zé)有:

(1)為應(yīng)用程序啟動(dòng)容器,同時(shí)確保申請(qǐng)的容器使用的資源不會(huì)超過(guò)節(jié)點(diǎn)上的總資源。

(2)為task構(gòu)建容器環(huán)境,包括二進(jìn)制可執(zhí)行文件,jars等

(3)為所在的節(jié)點(diǎn)提供了一個(gè)管理本地存儲(chǔ)資源的簡(jiǎn)單服務(wù),應(yīng)用程序可以繼續(xù)使用本地存儲(chǔ)資源即使他沒(méi)有從RM那申請(qǐng)。比如:MapReduce可以使用該服務(wù)程序存儲(chǔ)map task的中間輸出結(jié)果。

【ApplicationMaster】

每個(gè)應(yīng)用程序均會(huì)有一個(gè)AM,主要職責(zé)有:

(1)? 與調(diào)度器協(xié)商資源

(2)? 與NM合作,在合適的容器中運(yùn)行對(duì)應(yīng)的task,并監(jiān)控這些task執(zhí)行

(3) 如果container出現(xiàn)故障,AM會(huì)重新向調(diào)度器申請(qǐng)資源

(4)? 計(jì)算應(yīng)用程序所需的資源量,并轉(zhuǎn)化成調(diào)度器可識(shí)別的格式(協(xié)議)

(5)? AM出現(xiàn)故障后,ASM會(huì)重啟它,而由AM自己從之前保存的應(yīng)用程序執(zhí)行狀態(tài)中恢復(fù)應(yīng)用程序。

注:在MapReduce中,由于AM會(huì)定時(shí)的保存job的運(yùn)行時(shí)狀態(tài),因此,當(dāng)AM重啟時(shí)可以恢復(fù)對(duì)應(yīng)的job,按照粒度有三種策略:

<1>整個(gè)作業(yè)重新計(jì)算

<2> 保存已經(jīng)完成的map task和reduce task,只重新計(jì)算未完成的task

YARN的資源管理器實(shí)際上是一個(gè)事件處理器,它需要處理來(lái)自外部的6種SchedulerEvent類(lèi)型的事件,并根據(jù)事件的具體含義進(jìn)行相應(yīng)的處理。這6種事件含義如下:

(1)? NODE_REMOVED

事件NODE_REMOVED表示集群中被移除一個(gè)計(jì)算節(jié)點(diǎn)(可能是節(jié)點(diǎn)故障或者管理員主動(dòng)移除),資源調(diào)度器收到該事件時(shí)需要從可分配資源總量中移除相應(yīng)的資源量。

(2) NODE_ADDED

事件NODE_ADDED表示集群中增加了一個(gè)計(jì)算節(jié)點(diǎn),資源調(diào)度器收到該事件時(shí)需要將新增的資源量添加到可分配資源總量中。

(3)APPLICATION_ADDED

事件APPLICATION_ADDED 表示ResourceManager收到一個(gè)新的Application。通常而言,資源管理器需要為每個(gè)application維護(hù)一個(gè)獨(dú)立的數(shù)據(jù)結(jié)構(gòu),以便于統(tǒng)一管理和資源分配。資源管理器需將該Application添加到相應(yīng)的數(shù)據(jù)結(jié)構(gòu)中。

(4)APPLICATION_REMOVED

事件APPLICATION_REMOVED表示一個(gè)Application運(yùn)行結(jié)束(可能成功或者失?。?,資源管理器需將該Application從相應(yīng)的數(shù)據(jù)結(jié)構(gòu)中清除。

(5) CONTAINER_EXPIRED

當(dāng)資源調(diào)度器將一個(gè)container分配給某個(gè)ApplicationMaster后,如果該ApplicationMaster在一定時(shí)間間隔內(nèi)沒(méi)有使用該container,則資源調(diào)度器會(huì)對(duì)該container進(jìn)行再分配。

(6)NODE_UPDATE

NodeManager通過(guò)心跳機(jī)制向ResourceManager匯報(bào)各個(gè)container運(yùn)行情況,會(huì)觸發(fā)一個(gè)NODE_UDDATE事件,由于此時(shí)可能有新的container得到釋放,因此該事件會(huì)觸發(fā)資源分配,也就是說(shuō),該事件是6個(gè)事件中最重要的事件,它會(huì)觸發(fā)資源調(diào)度器最核心的資源分配機(jī)制。


YARN對(duì)內(nèi)存資源和CPU資源采用了不同的資源隔離方案。對(duì)于內(nèi)存資源,為了能夠更靈活的控制內(nèi)存使用量,YARN采用了進(jìn)程監(jiān)控的方案控制內(nèi)存使用,即每個(gè)NodeManager會(huì)啟動(dòng)一個(gè)額外監(jiān)控線程監(jiān)控每個(gè)container內(nèi)存資源使用量,一旦發(fā)現(xiàn)它超過(guò)約定的資源量,則會(huì)將其殺死。采用這種機(jī)制的另一個(gè)原因是Java中創(chuàng)建子進(jìn)程采用了fork()+exec()的方案,子進(jìn)程啟動(dòng)瞬間,它使用的內(nèi)存量與父進(jìn)程一致,從外面看來(lái),一個(gè)進(jìn)程使用內(nèi)存量可能瞬間翻倍,然后又降下來(lái),采用線程監(jiān)控的方法可防止這種情況下導(dǎo)致swap操作。對(duì)于CPU資源,則采用了Cgroups進(jìn)行資源隔離。

資源分配模型

在YARN中,用戶(hù)以隊(duì)列的形式組織,每個(gè)用戶(hù)可屬于一個(gè)或多個(gè)隊(duì)列,且只能向這些隊(duì)列中提交application。每個(gè)隊(duì)列被劃分了一定比例的資源。

YARN的資源分配過(guò)程是異步的,也就是說(shuō),資源調(diào)度器將資源分配給一個(gè)application后,不會(huì)立刻push給對(duì)應(yīng)的ApplicaitonMaster,而是暫時(shí)放到一個(gè)緩沖區(qū)中,等待ApplicationMaster通過(guò)周期性的RPC函數(shù)主動(dòng)來(lái)取,也就是說(shuō),采用了pull-based模型,而不是push-based模型,這個(gè)與MRv1是一致的。

總結(jié)

相比于MRv1中的資源調(diào)度器,盡管YANR的調(diào)度器也是插拔式的,但由于YARN采用了事件驅(qū)動(dòng)的模型,因此編寫(xiě)起來(lái)更加復(fù)雜,難度也遠(yuǎn)遠(yuǎn)大于MRv1。

同MRv1一樣,YARN也自帶了三種常用的調(diào)度器,分別是FIFO,Capacity Scheduler和Fair Scheduler,其中,第一個(gè)是默認(rèn)的調(diào)度器,它屬于批處理調(diào)度器,而后兩個(gè)屬于多租戶(hù)調(diào)度器,它采用樹(shù)形多隊(duì)列的形式組織資源,更適合公司應(yīng)用場(chǎng)景。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,936評(píng)論 6 535
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,744評(píng)論 3 421
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,879評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,181評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,935評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,325評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,384評(píng)論 3 443
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,534評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,084評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,892評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,067評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,623評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,322評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,735評(píng)論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,990評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,800評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,084評(píng)論 2 375

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