Hadoop核心組件

Hadoop的三大核心組件分別是:

HDFS(Hadoop Distribute File System):hadoop的數(shù)據(jù)存儲(chǔ)工具记罚。

YARN(Yet Another Resource Negotiator,另一種資源協(xié)調(diào)者):Hadoop 的資源管理器坪稽。

Hadoop MapReduce:分布式計(jì)算框架

一.HDFS

1.HDFS概述

HDFS是google三大論文之一的GFS的開(kāi)源實(shí)現(xiàn),是一個(gè)高度容錯(cuò)性的系統(tǒng),適合部署在廉價(jià)的機(jī)器上的惩系,適合存儲(chǔ)海量數(shù)據(jù)的分布式文件系統(tǒng)舵揭。

在HDFS中,1個(gè)文件會(huì)被拆分成多個(gè)Block校赤,每個(gè)Block默認(rèn)大小為128M(可調(diào)節(jié))吆玖。這些Block被復(fù)制為多個(gè)副本,被存放在不同的主機(jī)上马篮,這也保證了HDFS的高容錯(cuò)性沾乘。

2.HDFS架構(gòu)

下圖展示了HDFS的基本架構(gòu)


HDFS采用Master/slave架構(gòu)模式,1一個(gè)Master(NameNode/NN)? 帶 N個(gè)Slaves(DataNode/DN)浑测。

從內(nèi)部來(lái)看翅阵,數(shù)據(jù)塊存放在DataNode上。NameNode執(zhí)行文件系統(tǒng)的命名空間,如打開(kāi)掷匠、關(guān)閉滥崩、重命名文件或目錄等,也負(fù)責(zé)數(shù)據(jù)塊到具體DataNode的映射槐雾。DataNode負(fù)責(zé)處理文件系統(tǒng)客戶端的文件讀寫(xiě)夭委,并在NameNode的統(tǒng)一調(diào)度下進(jìn)行數(shù)據(jù)庫(kù)的創(chuàng)建、刪除和復(fù)制工作募强。NameNode是所有HDFS元數(shù)據(jù)的管理者株灸,用戶數(shù)據(jù)永遠(yuǎn)不會(huì)經(jīng)過(guò)NameNode。

NameNode:

1)負(fù)責(zé)客戶端請(qǐng)求的響應(yīng)

2)負(fù)責(zé)元數(shù)據(jù)(文件的名稱(chēng)擎值、副本系數(shù)慌烧、Block存放的DN)的管理

DataNode:

1)存儲(chǔ)用戶的文件對(duì)應(yīng)的數(shù)據(jù)塊(Block)

2)要定期向NN發(fā)送心跳信息,匯報(bào)本身及其所有的block信息鸠儿,健康狀況

3.HDFS讀寫(xiě)流程

寫(xiě)數(shù)據(jù)流程


客戶端Client向遠(yuǎn)程的Namenode發(fā)起RPC請(qǐng)求

Namenode會(huì)檢查要?jiǎng)?chuàng)建的文件是否已經(jīng)存在屹蚊,創(chuàng)建者是否有權(quán)限進(jìn)行操作,成功則會(huì)為文件創(chuàng)建一個(gè)記錄进每, 否則會(huì)讓客戶端拋出異常汹粤;

當(dāng)客戶端開(kāi)始寫(xiě)入文件的時(shí)候, 客戶端會(huì)將文件切分成多個(gè)packets田晚, 并在內(nèi)部以數(shù)據(jù)隊(duì)列“data queue( 數(shù)據(jù)隊(duì)列) ”的形式管理這些packets嘱兼, 并向Namenode申請(qǐng)blocks, 獲取用來(lái)存儲(chǔ)replications的合適的datanode列表贤徒, 列表的大小根據(jù)Namenode中replication的設(shè)定而定芹壕;

開(kāi)始以pipeline( 管道) 的形式將packet寫(xiě)入所有的replications中。 客戶端把packet以流的方式寫(xiě)入第一個(gè)datanode接奈, 該datanode把該packet存儲(chǔ)之后踢涌, 再將其傳遞給在此pipeline中的下一個(gè)datanode, 直到最后一個(gè)datanode序宦, 這種寫(xiě)數(shù)據(jù)的方式呈流水線的形式睁壁。

最后一個(gè)datanode成功存儲(chǔ)之后會(huì)返回一個(gè)ack packet( 確認(rèn)隊(duì)列) , 在pipeline里傳遞至客戶端挨厚, 在客戶端的開(kāi)發(fā)庫(kù)內(nèi)部維護(hù)著”ack queue”堡僻, 成功收到datanode返回的ack packet后會(huì)從”ack queue”移除相應(yīng)的packet。

如果傳輸過(guò)程中疫剃, 有某個(gè)datanode出現(xiàn)了故障钉疫, 那么當(dāng)前的pipeline會(huì)被關(guān)閉, 出現(xiàn)故障的datanode會(huì)從當(dāng)前的pipeline中移除巢价, 剩余的block會(huì)繼續(xù)剩下的datanode中繼續(xù)以pipeline的形式傳輸牲阁, 同時(shí)Namenode會(huì)分配一個(gè)新的datanode固阁, 保持replications設(shè)定的數(shù)量。

客戶端完成數(shù)據(jù)的寫(xiě)入后城菊, 會(huì)對(duì)數(shù)據(jù)流調(diào)用close()方法备燃, 關(guān)閉數(shù)據(jù)流;

只要寫(xiě)入了dfs.replication.min的副本數(shù)( 默認(rèn)為1)凌唬,寫(xiě)操作就會(huì)成功并齐, 并且這個(gè)塊可以在集群中異步復(fù)制, 直到達(dá)到其目標(biāo)復(fù)本數(shù)(replication的默認(rèn)值為3)客税,因?yàn)閚amenode已經(jīng)知道文件由哪些塊組成况褪, 所以它在返回成功前只需要等待數(shù)據(jù)塊進(jìn)行最小量的復(fù)制。

讀數(shù)據(jù)流程


使用HDFS提供的客戶端Client更耻, 向遠(yuǎn)程的Namenode發(fā)起RPC請(qǐng)求测垛;

Namenode會(huì)視情況返回文件的部分或者全部block列表, 對(duì)于每個(gè)block秧均, Namenode都會(huì)返回有該block拷貝的DataNode地址食侮;

客戶端Client會(huì)選取離客戶端最近的DataNode來(lái)讀取block; 如果客戶端本身就是DataNode目胡, 那么將從本地直接獲取數(shù)據(jù)锯七;

讀取完當(dāng)前block的數(shù)據(jù)后, 關(guān)閉當(dāng)前的DataNode鏈接誉己, 并為讀取下一個(gè)block尋找最佳的DataNode起胰;

當(dāng)讀完列表block后, 且文件讀取還沒(méi)有結(jié)束巫延, 客戶端會(huì)繼續(xù)向Namenode獲取下一批的block列表;

讀取完一個(gè)block都會(huì)進(jìn)行checksum驗(yàn)證地消, 如果讀取datanode時(shí)出現(xiàn)錯(cuò)誤炉峰, 客戶端會(huì)通知Namenode, 然后再?gòu)南乱粋€(gè)擁有該block拷貝的datanode繼續(xù)讀脉执。

從上面的流程我們可以更清晰地理解HDFS各個(gè)組件的作用:namenode負(fù)責(zé)管理疼阔,不接觸數(shù)據(jù),datanode負(fù)責(zé)存儲(chǔ)數(shù)據(jù)半夷,在寫(xiě)數(shù)據(jù)時(shí)婆廊,每份數(shù)據(jù)復(fù)制多個(gè)副本以pipeline的方式在datanode中流動(dòng)。讀數(shù)據(jù)時(shí)巫橄,namenaode的作用只是提供datanode的信息淘邻,又客戶端自己從datanode讀取。

可以看出湘换,HDFS的一個(gè)特點(diǎn)是宾舅,適合一次寫(xiě)入多次存取的場(chǎng)景统阿。

另外還有一個(gè)小知識(shí)點(diǎn),在實(shí)際應(yīng)用中存儲(chǔ)數(shù)據(jù)時(shí)筹我,數(shù)據(jù)的第一份副本存放在離客戶端最近的一臺(tái)主機(jī)上扶平,第二份副本存放在與第一臺(tái)主機(jī)不同機(jī)架的主機(jī)上,第三個(gè)副本存放在與上一個(gè)副本同一個(gè)機(jī)架的不同主機(jī)上蔬蕊。這樣也是保證了HDFS的高容錯(cuò)性结澄。

二.YARN和MapReduce

為什么要把這兩個(gè)放到一塊說(shuō)呢,因?yàn)閅ARN可以說(shuō)是為了彌補(bǔ)MRv1的缺陷而誕生的岸夯,所以兩者放到一塊說(shuō)比較合適

1.什么是MapReduce

Hadoop的MapReduce是對(duì)google三大論文的MapReduce的開(kāi)源實(shí)現(xiàn)麻献,實(shí)際上是一種編程模型,是一個(gè)分布式的計(jì)算框架囱修,用于處理海量數(shù)據(jù)的運(yùn)算赎瑰。

2.MapReduce的流程


MapReduce主要由下面幾個(gè)過(guò)程組成,理解了這幾個(gè)過(guò)程破镰,基本上就可以理解MapReduce了

先上一張圖再說(shuō)

input:不用說(shuō)餐曼,就是輸入數(shù)據(jù),在編程中會(huì)有Textformat方法專(zhuān)門(mén)處理輸入鲜漩。

splitting:將數(shù)據(jù)分片源譬,一般來(lái)說(shuō)這個(gè)片和HDFS的分塊大小是一致的,默認(rèn)為128M孕似,但是這個(gè)大小也可以調(diào)節(jié)踩娘。(https://blog.csdn.net/dr_guo/article/details/51150278這篇博客對(duì)分片理解的很到位,可以看一下)喉祭。

record reader:record reader通過(guò)輸入格式將輸入split解析成記錄养渴。record reader的目的只是將輸入數(shù)據(jù)解析成記錄,但不負(fù)責(zé)解析記錄本身泛烙。它將數(shù)據(jù)轉(zhuǎn)化為鍵/值(key/value)對(duì)的形式理卑,并傳遞給mapper處理。通常鍵是數(shù)據(jù)在文件中的位置蔽氨,值是組成記錄的數(shù)據(jù)塊藐唠。以圖片中的程序(其實(shí)也就是wordcount)為例,spliting將輸入文本以行為單位分片鹉究,record reader把分片結(jié)果轉(zhuǎn)化為為多個(gè)以行偏移量為key宇立,對(duì)應(yīng)內(nèi)容為value的key/value對(duì),將這些key/value對(duì)作為參數(shù)輸入到mapping中

mapping:處理record reader解析的每個(gè)鍵/值對(duì)來(lái)產(chǎn)生0個(gè)或多個(gè)新的key/value對(duì)結(jié)果自赔。key/value的選擇對(duì)MapReduce作業(yè)的完成效率來(lái)說(shuō)非常重要妈嘹。key是數(shù)據(jù)在reducer中處理時(shí)被分組的依據(jù),value是reducer需要分析的數(shù)绍妨。上圖程序中蟋滴,將輸入的value進(jìn)行解析染厅,產(chǎn)生多個(gè)以單詞為key,單詞數(shù)量(其實(shí)也就是1)為value的新key/value對(duì)津函,并輸出肖粮。

shuffing:

數(shù)據(jù)從map中出來(lái)到進(jìn)入reduce之前稱(chēng)為shuffle階段,shuffle的處理任務(wù):將maptask輸出的處理結(jié)果數(shù)據(jù)尔苦,分發(fā)給reducetask涩馆,并在分發(fā)的過(guò)程中,對(duì)數(shù)據(jù)按key進(jìn)行了分區(qū)和排序允坚;

1魂那、maptask收集我們的map()方法輸出的k、v對(duì)稠项,放到內(nèi)存緩沖區(qū)中

2涯雅、從內(nèi)存緩沖區(qū)不斷溢出本地磁盤(pán)文件,可能會(huì)溢出多個(gè)文件

3展运、多個(gè)溢出文件會(huì)被合并成大的溢出文件

4活逆、在溢出過(guò)程中,及合并的過(guò)程中拗胜,都要調(diào)用partitoner進(jìn)行分組和針對(duì)key進(jìn)行排序

5蔗候、reducetask根據(jù)自己的分區(qū)號(hào),去各個(gè)maptask機(jī)器上取相應(yīng)的結(jié)果分區(qū)數(shù)據(jù)

6埂软、reducetask會(huì)取到同一個(gè)分區(qū)的來(lái)自不同maptask的結(jié)果文件锈遥,reducetask會(huì)將這些文件再進(jìn)行合并(歸并排序)

7、合并成大文件后勘畔,shuffle的過(guò)程也就結(jié)束了所灸,后面進(jìn)入reducetask的邏輯運(yùn)算過(guò)程(從文件中取出一個(gè)一個(gè)的鍵值對(duì)group,調(diào)用用戶自定義的reduce()方法)

備注:Shuffle中的緩沖區(qū)大小會(huì)影響到mapreduce程序的執(zhí)行效率炫七,原則上說(shuō)庆寺,緩沖區(qū)越大,磁盤(pán)io的次數(shù)越少诉字,執(zhí)行速度就越快。緩沖區(qū)的大小可以通過(guò)參數(shù)調(diào)整, 參數(shù):io.sort.mb 默認(rèn)100M

reduce:reduce階段是一個(gè)歸約過(guò)程知纷,實(shí)現(xiàn)單詞的計(jì)數(shù)壤圃。最后,得到整個(gè)文檔的詞頻統(tǒng)計(jì)琅轧。

MR過(guò)程中的數(shù)據(jù)流向:一個(gè)文件在HDFS中是分布存儲(chǔ)在不同節(jié)點(diǎn)的block中伍绳,每一個(gè)block對(duì)應(yīng)一個(gè)Mapper,每一條數(shù)據(jù)以K,V的形式進(jìn)入一個(gè)map()方法乍桂,map()方法中對(duì)數(shù)據(jù)進(jìn)行處理(數(shù)據(jù)篩選冲杀,業(yè)務(wù)邏輯以及分區(qū))效床,再將處理結(jié)果以K,V的形式寫(xiě)入環(huán)形緩沖區(qū),一個(gè)Mapper對(duì)應(yīng)一個(gè)context权谁,context對(duì)寫(xiě)入的數(shù)據(jù)按key進(jìn)行聚合剩檀、排序、歸約旺芽。context的大小默認(rèn)為100M沪猴,當(dāng)context容量達(dá)到80%或Mapper處理結(jié)束時(shí),context會(huì)向外溢出采章,形成許多小文件运嗜,小文件為一個(gè)K和許多V的集合。處理完成后悯舟,這些文件會(huì)發(fā)送到Reducer所在節(jié)點(diǎn)担租,在該節(jié)點(diǎn)的context中,會(huì)對(duì)不同節(jié)點(diǎn)發(fā)送過(guò)來(lái)的數(shù)據(jù)按key進(jìn)行再一次的聚合抵怎、排序和歸約奋救,最后進(jìn)入Reducer,在reduce方法中對(duì)同一個(gè)<key,value集合>進(jìn)行處理(業(yè)務(wù)邏輯)便贵,然后按照分區(qū)寫(xiě)入文件菠镇。

3.MapReduce1.x的架構(gòu)


MapReduce的架構(gòu)模式分為兩個(gè)階段,MR1.x和MR2.x時(shí)期承璃,先說(shuō)MR1.x利耍,上一張圖

MapReduce采用Master/Slave架構(gòu),1個(gè)JobTracker帶多個(gè)TaskTracker

1)JobTracker: JT

? ? 作業(yè)的管理者? ? ? 管理的

? ? 將作業(yè)分解成一堆的任務(wù):Task(MapTask和ReduceTask)

? ? 將任務(wù)分派給TaskTracker運(yùn)行

? ? 作業(yè)的監(jiān)控盔粹、容錯(cuò)處理(task作業(yè)掛了隘梨,重啟task的機(jī)制)

? ? 在一定的時(shí)間間隔內(nèi),JT沒(méi)有收到TT的心跳信息舷嗡,TT可能是掛了轴猎,TT上運(yùn)行的任務(wù)會(huì)被指派到其他TT上去執(zhí)行

2)TaskTracker: TT

? ? 任務(wù)的執(zhí)行者? ? ? 干活的

? ? 在TT上執(zhí)行我們的Task(MapTask和ReduceTask)

? ? 會(huì)與JT進(jìn)行交互:執(zhí)行/啟動(dòng)/停止作業(yè),發(fā)送心跳信息給JT

3)MapTask

? ? 自己開(kāi)發(fā)的map任務(wù)交由該Task處理

? ? 解析每條記錄的數(shù)據(jù)进萄,交給自己的map方法處理

? ? 將map的輸出結(jié)果寫(xiě)到本地磁盤(pán)(有些作業(yè)只僅有map沒(méi)有reduce==>HDFS)

4)ReduceTask

? ? 將Map Task輸出的數(shù)據(jù)進(jìn)行讀取

? ? 按照數(shù)據(jù)進(jìn)行分組傳給我們自己編寫(xiě)的reduce方法處理

? ? 輸出結(jié)果寫(xiě)到HDFS

可以看出來(lái)捻脖,這種架構(gòu)模式有很大的缺陷:

只有一個(gè)JobTracker,容易出現(xiàn)單點(diǎn)故障

JobTracker同時(shí)負(fù)責(zé)資源管理和作業(yè)調(diào)度中鼠,節(jié)點(diǎn)的工作壓力巨大可婶,可擴(kuò)展性差,出現(xiàn)了缺陷援雇,就該尋找解決的辦法矛渴,這時(shí)候,我們的YARN就閃亮登場(chǎng)了

MapReduce代碼


4.什么是YARN


Apache Hadoop YARN (Yet Another Resource Negotiator惫搏,另一種資源協(xié)調(diào)者)是一種新的 Hadoop 資源管理器具温,它是一個(gè)通用資源管理系統(tǒng)蚕涤,可為上層應(yīng)用提供統(tǒng)一的資源管理和調(diào)度,它的引入為集群在利用率铣猩、資源統(tǒng)一管理和數(shù)據(jù)共享等方面帶來(lái)了巨大好處揖铜。通過(guò)YARN,不同計(jì)算框架可以共享同一個(gè)HDFS集群上的數(shù)據(jù)剂习,享受整體的資源調(diào)度蛮位。

5.YARN的基本架構(gòu)

1)ResourceManager: RM

? ? 整個(gè)集群同一時(shí)間提供服務(wù)的RM只有一個(gè),負(fù)責(zé)集群資源的統(tǒng)一管理和調(diào)度

? ? 處理客戶端的請(qǐng)求: 提交一個(gè)作業(yè)鳞绕、殺死一個(gè)作業(yè)

? ? 監(jiān)控我們的NM失仁,一旦某個(gè)NM掛了,那么該NM上運(yùn)行的任務(wù)需要告訴我們的AM來(lái)如何進(jìn)行處理

2) NodeManager: NM

? ? 整個(gè)集群中有多個(gè)们何,負(fù)責(zé)自己本身節(jié)點(diǎn)資源管理和使用

? ? 定時(shí)向RM匯報(bào)本節(jié)點(diǎn)的資源使用情況

? ? 接收并處理來(lái)自RM的各種命令:?jiǎn)?dòng)Container

? ? 處理來(lái)自AM的命令

? ? 單個(gè)節(jié)點(diǎn)的資源管理

3) ApplicationMaster: AM

? ? 每個(gè)應(yīng)用程序?qū)?yīng)一個(gè):MR萄焦、Spark,負(fù)責(zé)應(yīng)用程序的管理

? ? 為應(yīng)用程序向RM申請(qǐng)資源(core冤竹、memory)拂封,分配給內(nèi)部task

? ? 需要與NM通信:?jiǎn)?dòng)/停止task,task是運(yùn)行在container里面鹦蠕,AM也是運(yùn)行在container里面

4) Container

? ? 封裝了CPU冒签、Memory等資源的一個(gè)容器

? ? 是一個(gè)任務(wù)運(yùn)行環(huán)境的抽象

5) Client

? ? 提交作業(yè)

? ? 查詢作業(yè)的運(yùn)行進(jìn)度

? ? 殺死作業(yè)

6.YARN的工作流程

用戶向YARN中提交應(yīng)用程序,其中包括ApplicationMaster程序钟病、啟動(dòng)ApplicationMaster命令萧恕、用戶程序等

resourceManager為該應(yīng)用程序分配第一個(gè)container,并與對(duì)應(yīng)的nodeManager通信肠阱,要求它在這個(gè)container中啟動(dòng)應(yīng)用程序的ApplicationMaster

ApplicationMaster首先向ResourceManager注冊(cè)票唆,這樣用戶可以直接通過(guò)ResourceManager查看應(yīng)用程序的運(yùn)行狀態(tài),然后它將為各個(gè)任務(wù)申請(qǐng)資源屹徘,并監(jiān)控它的運(yùn)行狀態(tài)走趋,直到運(yùn)行結(jié)束,即重復(fù)4~7

ApplicationMaster采用輪詢的方式通過(guò)RPC協(xié)議向resourceManager申請(qǐng)和領(lǐng)取資源

一旦ApplicationMaster申請(qǐng)到資源后噪伊,便與對(duì)應(yīng)的Nodemanager通信簿煌,要求它啟動(dòng)任務(wù)。

NodeManager為任務(wù)設(shè)置好運(yùn)行環(huán)境(包括環(huán)境變量鉴吹、JAR包姨伟、二進(jìn)制程序等)后,將任務(wù)啟動(dòng)命令寫(xiě)到一個(gè)腳本中拙寡,并通過(guò)運(yùn)行該腳本啟動(dòng)任務(wù)

各個(gè)任務(wù)通過(guò)某個(gè)RPC協(xié)議向ApplicationMaster匯報(bào)自己的狀態(tài)和進(jìn)度,以讓ApplicationMaster隨時(shí)掌握各個(gè)任務(wù)的運(yùn)行狀態(tài)琳水,從而可以在任務(wù)失敗時(shí)重新啟動(dòng)任務(wù)肆糕。在應(yīng)用程序運(yùn)行過(guò)程中般堆,用戶可隨時(shí)通過(guò)RPC向ApplicationMaster查詢應(yīng)用程序的當(dāng)前運(yùn)行狀態(tài)

應(yīng)用程序運(yùn)行完成后,ApplicationMaster向resourceManager注銷(xiāo)并關(guān)閉自己

6.MapReduce2.x的架構(gòu)


YARN將MapReduce1.x中的JobTracker拆分為兩部分:ResourceManager和Applicationaster诚啃。大大減輕了ResourceManager上的資源消耗與負(fù)擔(dān)淮摔,下面三MR2.x的架構(gòu)圖。

————————————————

版權(quán)聲明:本文為CSDN博主「沼澤魚(yú)97」的原創(chuàng)文章始赎,遵循CC 4.0 BY-SA版權(quán)協(xié)議和橙,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/weixin_40535323/article/details/82025442

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末造垛,一起剝皮案震驚了整個(gè)濱河市魔招,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌五辽,老刑警劉巖办斑,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異杆逗,居然都是意外死亡乡翅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)罪郊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蠕蚜,“玉大人,你說(shuō)我怎么就攤上這事悔橄“欣郏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵橄维,是天一觀的道長(zhǎng)尺铣。 經(jīng)常有香客問(wèn)我,道長(zhǎng)争舞,這世上最難降的妖魔是什么凛忿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮竞川,結(jié)果婚禮上店溢,老公的妹妹穿的比我還像新娘。我一直安慰自己委乌,他們只是感情好床牧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著遭贸,像睡著了一般戈咳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天著蛙,我揣著相機(jī)與錄音删铃,去河邊找鬼。 笑死踏堡,一個(gè)胖子當(dāng)著我的面吹牛猎唁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播顷蟆,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼诫隅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了帐偎?” 一聲冷哼從身側(cè)響起逐纬,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肮街,沒(méi)想到半個(gè)月后风题,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫉父,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年沛硅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绕辖。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摇肌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仪际,到底是詐尸還是另有隱情围小,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布树碱,位于F島的核電站肯适,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏成榜。R本人自食惡果不足惜框舔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赎婚。 院中可真熱鬧刘绣,春花似錦震肮、人聲如沸炼团。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至囊榜,卻和暖如春舅柜,著一層夾襖步出監(jiān)牢的瞬間瞒窒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工恋技, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肠套,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓猖任,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瓷耙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朱躺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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