Hadoop基礎(chǔ):從概念到操作到編碼三包服務(wù)

概念:

hadoop是一個(gè)開源的、可靠的、可擴(kuò)展的分布式計(jì)算框架。
hadoop可以使用簡單的編程模型跨集群對大數(shù)據(jù)集進(jìn)行分布式的處理,hadoop被設(shè)計(jì)出來就是為了達(dá)到改變只能使單臺服務(wù)提供計(jì)算和存儲的狀況舍败,讓其能擴(kuò)展到使用成百上千臺服務(wù)器都能提供計(jì)算和存儲的目的,hadoop能夠構(gòu)建數(shù)據(jù)倉庫,能對PB級的數(shù)據(jù)進(jìn)行存儲邻薯、處理裙戏、分析、統(tǒng)計(jì)

hadoop的組成:

Hadoop Common:通用的工具類厕诡,提供對hadoop各個(gè)框架的支持
HDFS:分布式文件系統(tǒng)累榜,使應(yīng)用數(shù)據(jù)的訪問具有高吞吐量
YARN:執(zhí)行hadoop作業(yè)的調(diào)度和提供hadoop集群資源的管理
MapReduce:基于YARN之上的框架,用于并行處理大數(shù)據(jù)集

HDFS

HDFS是hadoop的分布式文件系統(tǒng)灵嫌,是使用java構(gòu)建的壹罚,其特點(diǎn)就是具有高可擴(kuò)展性、高容錯(cuò)性寿羞、高吞吐量猖凛、可存儲海量數(shù)據(jù)的特點(diǎn),可以存儲超大的文件绪穆,HDFS使用了流式的數(shù)據(jù)訪問方式辨泳,適合處理大數(shù)據(jù)集的場景,可以在普通廉價(jià)的硬件上運(yùn)行玖院,并支持水平橫行的擴(kuò)展菠红,數(shù)據(jù)以分布式的方式存儲在HDFS中
1、高可擴(kuò)展性:HDFS可以運(yùn)行在普通的廉價(jià)機(jī)器上难菌,并可以支持簡單的水平橫行擴(kuò)展的方式進(jìn)行擴(kuò)容刽锤,達(dá)到了高可擴(kuò)展性
2硫眨、高容錯(cuò)性:HDFS可以將文件分成數(shù)據(jù)塊扼倘,以多節(jié)點(diǎn)多副本方式存儲在不同的節(jié)點(diǎn)上诡蜓,實(shí)現(xiàn)了HDFS的高容錯(cuò)性
3、高吞吐量:HDFS將文件拆分成多個(gè)大小均勻的數(shù)據(jù)塊存儲在各個(gè)節(jié)點(diǎn)上猎塞,并以多機(jī)并行處理節(jié)點(diǎn)上的數(shù)據(jù)塊,使HDFS擁有高的吞吐量
4杠纵、存儲海量數(shù)據(jù)和超大文件:HDFS可以通過水平橫行擴(kuò)展的方式進(jìn)行擴(kuò)容荠耽,將數(shù)據(jù)分成塊存放在集群的各個(gè)節(jié)點(diǎn)上,相對于單機(jī)存儲比藻,HDFS的存儲數(shù)據(jù)的能力會(huì)大得多铝量,所以HDFS可以支持存儲海量的數(shù)據(jù),并適用于超大文件的存儲
5银亲、流式的數(shù)據(jù)訪問:hdfs以流式數(shù)據(jù)訪問的形式慢叨,達(dá)到一次寫入,多次讀取务蝠,使得hdfs非常適用于大數(shù)據(jù)集的分析任務(wù)

隨之而來的缺點(diǎn)是:
1拍谐、不適用于小的文件存儲
2、不能適用于低延遲場景,hdfs追求的是高的吞吐量
3轩拨、不支持文件的修改操作

HDFS架構(gòu):

官方的圖片可能不是那么好理解

官方文檔的圖片

這個(gè)網(wǎng)上隨便找的這個(gè)圖比較好理解點(diǎn)

image.png

HDFS工作概述
HDFS采用的是主從(maser/slave)架構(gòu)践瓷,一個(gè)master帶多個(gè)slave,HDFS的master稱為namenode,slave 稱為datanode,namenode作為master管理著整個(gè)hdfs文件系統(tǒng)目錄樹namespace以及控制客戶端對文件的訪問亡蓉,而datanode主要管理數(shù)據(jù)的存儲和讀寫操作晕翠,通常每個(gè)節(jié)點(diǎn)都存放一個(gè)datanode,一個(gè)文件在hdfs中將會(huì)拆分成多個(gè)數(shù)據(jù)塊block,并且block是被標(biāo)記有序號的砍濒,通常一個(gè)block有128M淋肾,這些block將以多副本的方式分散的存儲在各個(gè)datanode中(已經(jīng)存儲的文件不支持修改),這也是hdfs達(dá)到高容錯(cuò)性的方式爸邢。namenode可以對namespace的文件及目錄進(jìn)行打開樊卓,關(guān)閉,重命名的操作以及確認(rèn)客戶端的請求映射到哪個(gè)datanode上,還負(fù)責(zé)管理block副本創(chuàng)建的系數(shù)及位置甲棍,而datanode則可以對文件進(jìn)行讀寫操作以響應(yīng)客戶端的讀寫請求简识。block的創(chuàng)建和刪除也是由datanode進(jìn)行操作。
關(guān)鍵名詞總結(jié):
namenode:作為hdfs的核心主要負(fù)責(zé)接受客戶端的請求感猛,對元數(shù)據(jù)進(jìn)行管理包括了記錄文件的名稱七扰、副本的系數(shù)、block存放在哪個(gè)datanode上陪白【弊撸客戶端進(jìn)行寫操作時(shí)請求首先會(huì)到namenode處,namenode會(huì)讓客戶端把文件拆分成均勻大小的數(shù)據(jù)塊咱士,namenode通過計(jì)算返回給客戶端存儲每一個(gè)數(shù)據(jù)塊對應(yīng)datanode的地址立由,并且是以多副本的方式存儲;當(dāng)客戶端進(jìn)行讀操作時(shí)序厉,請求也是先到達(dá)namenode處锐膜,namenode會(huì)將客戶端需要的文件對應(yīng)的所有block的信息返回給客戶端其中包括了客戶端需要按照什么樣的順序進(jìn)行讀取以及對應(yīng)的block存儲在哪個(gè)datanode上,namenode還會(huì)定期收集datanode上block的信息及datanode的各種信息和健康狀況
datanode:負(fù)責(zé)存儲和讀取用戶文件對應(yīng)的block,定期向namenode發(fā)送心跳信息弛房,并匯報(bào)datanode上的所有信息包括block信息道盏、datanode的健康狀態(tài)
block:文件的數(shù)據(jù)塊,一般為128M,文件被拆分成多個(gè)數(shù)據(jù)塊文捶,被分散存儲在不同的datanode上荷逞,除了最后一個(gè)數(shù)據(jù)塊會(huì)小于等于其他的數(shù)據(jù)塊以外,每一個(gè)數(shù)據(jù)塊的大小都是一樣的粹排,并以多副本的方式存儲
replication:block的副本种远,block通常會(huì)以多副本的方式存儲在不同的datanode上,而副本的系數(shù)顽耳,存放的位置由namenode決定坠敷,同一個(gè)block的多個(gè)副本通常會(huì)放置在不同機(jī)架(多個(gè)節(jié)點(diǎn)組成一個(gè)機(jī)架)的datanode上妙同,這樣使hdfs擁有高容錯(cuò)性

block的多副本

HDFS 高可用

Active NameNode 和 Standby NameNode:兩臺 NameNode 形成互備,一臺處于 Active 狀態(tài)常拓,為主 NameNode渐溶,另外一臺處于 Standby 狀態(tài),為備 NameNode弄抬,只有主 NameNode 才能對外提供讀寫服務(wù)茎辐。

主備切換控制器 ZKFailoverController:ZKFailoverController 作為獨(dú)立的進(jìn)程運(yùn)行,對 NameNode 的主備切換進(jìn)行總體控制掂恕。ZKFailoverController 能及時(shí)檢測到 NameNode 的健康狀況拖陆,在主 NameNode 故障時(shí)借助 Zookeeper 實(shí)現(xiàn)自動(dòng)的主備選舉和切換。

Zookeeper 集群:為主備切換控制器提供主備選舉支持懊亡。共享存儲系統(tǒng):共享存儲系統(tǒng)是實(shí)現(xiàn) NameNode 的高可用最為關(guān)鍵的部分依啰,共享存儲系統(tǒng)保存了 NameNode 在運(yùn)行過程中所產(chǎn)生的 HDFS 的元數(shù)據(jù)。

主 NameNode 和 備 NameNode: 通過共享存儲系統(tǒng)實(shí)現(xiàn)元數(shù)據(jù)同步店枣。在進(jìn)行主備切換的時(shí)候速警,新的主 NameNode 在確認(rèn)元數(shù)據(jù)完全同步之后才能繼續(xù)對外提供服務(wù)。

DataNode:會(huì)同時(shí)向主 NameNode 和備 NameNode 上報(bào)數(shù)據(jù)塊的位置信息鸯两。

hdfs環(huán)境安裝

安裝hdfs的前置條件是要先安裝好jdk和ssh,準(zhǔn)備完成后闷旧,開始安裝:
將hdfs的壓縮包下載并解壓,然后配置配置文件钧唐,先配置安裝目錄下的/etc/hadoop/hadoop-env.sh 配置好jdk的安裝路徑

image.png

然后到安裝目錄下的/etc/hadoop/core-site.xml忙灼,配置hadoop的相關(guān)配置,注意這里千萬不要把端口配置成9000,9000是以前版本的配置钝侠,我就是被Apache官網(wǎng)坑了该园,配來配去發(fā)現(xiàn)是9000端口不能配

image.png

然后到安裝目錄下的/etc/hadoop/hdfs-site.xml,配置副本數(shù)
image.png

然后進(jìn)入安裝目錄下的bin目錄執(zhí)行./hdfs namenode -format對hdfs進(jìn)行初始化帅韧,
然后進(jìn)入安裝目錄下的sbin目錄執(zhí)行./start-dfs.sh啟動(dòng)hdfs里初,然后瀏覽器輸入地址 ip:50070,ip地址是你們配置的那個(gè)忽舟,我本機(jī)配置的是192.168.200.128,所以瀏覽器輸入http://192.168.200.128:50070/
image.png

顯示active表示啟動(dòng)完成

hdfs的常用命令:

在操作hdfs之前把hdfs的配置到環(huán)境環(huán)境變量去青瀑,這樣方便后面的操作:

image.png
image.png

出現(xiàn)輸出hdfs的版本是出現(xiàn)jdk版本就代表配置成功

上傳文件:hadoop fs -put test.txt /

image.png

下載文件:hadoop fs -get /test.txt

image.png

查看文件:
hadoop fs -ls /**
image.png

查看文件內(nèi)容:hadoop fs -text /test.txt

image.png

創(chuàng)建文件:hadoop fs -mkdir /test
image.png

遞歸創(chuàng)建文件夾和遞歸查看文件:hadoop fs -mkdir -p /a/b/c/d,hadoop fs -ls -R /

image.png

刪除文件:hadoop fs -rm /test.txt

image.png

在hadoop的管理網(wǎng)頁上可以查看hdfs文件的信息
image.png

yarn

概念:

yarn是一個(gè)資源調(diào)度器,可以將更多的計(jì)算框架萧诫,運(yùn)行在同一個(gè)集群中,運(yùn)行多個(gè)不同的類型的作業(yè)枝嘶,改變了mapreduce1.X只能運(yùn)行mr作業(yè)的狀況帘饶,并共享HDFS的數(shù)據(jù),多個(gè)不同的計(jì)算框架和作業(yè)可以享受整體資源的調(diào)度群扶,極大的提高了集群的資源利用率及刻,yarn可以說是一個(gè)操作系統(tǒng)級別的資源調(diào)度框架

yarn的工作流程及組件

客戶端向服務(wù)端提交的作業(yè)會(huì)到達(dá)yarn的ResourceManage處镀裤,ResourceManage會(huì)為作業(yè)分配資源,然后讓集群中一個(gè)nodemanager去啟動(dòng)container(運(yùn)行環(huán)境)缴饭,在第一個(gè)啟動(dòng)的container中啟動(dòng)一個(gè)applicationMaster,applicationMaster啟動(dòng)完成后會(huì)將信息注冊到ResourceManager中暑劝,同時(shí)向ResourceManager申請資源,applicationMaster獲取資源后就會(huì)在對應(yīng)的nodeManager上啟動(dòng)container颗搂,然后在container中運(yùn)行作業(yè)

image.png

ResourceManager:負(fù)責(zé)集群資源的統(tǒng)一管理和調(diào)度担猛,處理客戶端請求,監(jiān)控nodemanager 包括健康狀態(tài)資源使用情況丢氢,監(jiān)控applicationMaster包括作業(yè)的運(yùn)行情況
nodeManager:接收并執(zhí)行ResourceManager和applicationMaster的命令傅联,啟動(dòng)container并定期向ResourceManager發(fā)送心跳和container的運(yùn)行狀況資源使用情況,監(jiān)控container資源的使用情況疚察,負(fù)責(zé)并管理自己的資源使用情況
applicationMaster:applicationMaster負(fù)責(zé)管理運(yùn)行在yarn上的應(yīng)用程序蒸走,應(yīng)用程序可能是一個(gè)spark、mr等的作業(yè),applicationMaster將作業(yè)拆分成一個(gè)個(gè)task,這些task會(huì)運(yùn)行在一個(gè)或者多個(gè)容器中貌嫡,applicationMaster向ResourceManager申請資源比驻,分配資源給內(nèi)部的task進(jìn)行啟動(dòng),task會(huì)被運(yùn)行在nodeManager啟動(dòng)的container中,applicationMaster會(huì)運(yùn)行在第一個(gè)啟動(dòng)的container上岛抄,applicationMaster將信息注冊到ResourceManager别惦,ResourceManager將對applicationMaster的運(yùn)行情況進(jìn)行監(jiān)控,包括task的運(yùn)行情況弦撩,
container:集成了cpu,內(nèi)存等一系列步咪,是一個(gè)任務(wù)運(yùn)行環(huán)境抽象,作業(yè)和applicationMaster都是運(yùn)行在其中

yarn的環(huán)境搭建:

進(jìn)入hadoop的安裝目錄里的etc目錄益楼,將mapred-site.xml.template拷貝一份出來改名為mapred-site.xml猾漫,將配置寫入:

image.png

然后編輯etc目錄下的yarn-site.xml,加入配置

image.png

進(jìn)入安裝目錄下的sbin目錄中執(zhí)行 ./start-yarn.sh啟動(dòng)yarn
image.png

jps查看yarn是否啟動(dòng):

image.png

進(jìn)入yarn的管理界面感凤,瀏覽器訪問ip:8088悯周,如我虛擬機(jī)的ip是192.168.200.128
http://192.168.200.128:8088/通過這個(gè)頁面查看yarn的作業(yè)情況

image.png

yarn作業(yè)的提交
命令 hadoop jar XXXXX.jar classname 參數(shù)1 參數(shù)2 .....
例如hadoop安裝目錄下的/share/hadoop/mapreduce中有一個(gè)名為hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar的包,里面有個(gè)pi的類陪竿,可以使用它進(jìn)行試驗(yàn)執(zhí)行 hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar pi 3 4
程序在執(zhí)行中

image.png

執(zhí)行結(jié)果
image.png

到頁面看禽翼,可以看的任務(wù)的列表記錄

image.png

MapReduce

概述
mapreduce是一個(gè)能夠提供輕松編寫一個(gè)應(yīng)用程序的框架,這個(gè)應(yīng)用程序是用于以并行的方式去對一個(gè)集群上的海量數(shù)據(jù)進(jìn)行離線的批處理族跛,這個(gè)集群可以擁有上千個(gè)節(jié)點(diǎn)的闰挡、可以是使用廉價(jià)機(jī)器組成的集群
mapreduce工作過程:
mapreduce能夠?qū)?shù)據(jù)集拆分成一個(gè)個(gè)獨(dú)立的數(shù)據(jù)塊,多個(gè)map作業(yè)會(huì)以并行的方式對數(shù)據(jù)塊進(jìn)行處理礁哄,mapreduce會(huì)對這些map作業(yè)的輸出進(jìn)行排序长酗,并將結(jié)果作為reduce作業(yè)的輸入,而這些作業(yè)的輸出和輸入都會(huì)被存儲在文件系統(tǒng)hdfs中桐绒,mapreduce會(huì)對這些作業(yè)進(jìn)行調(diào)度夺脾,監(jiān)視和重新執(zhí)行失敗的作業(yè)

通過mapreduce的wc案例理解mapreduce的工作:如下圖我們要統(tǒng)計(jì)文件中三行英文的相同單詞出現(xiàn)的個(gè)數(shù)之拨,mapreduce利用inputFormat將文件輸入并拆分成三個(gè)輸入分片split,然后對split中的數(shù)據(jù)讀取,這個(gè)過程叫做splitting咧叭,利用Recordreaders將每個(gè)split數(shù)據(jù)讀取出來蚀乔,每個(gè)split都會(huì)產(chǎn)生一個(gè)作業(yè)map task,一般一個(gè)block只對應(yīng)一個(gè)split菲茬;圖中有三個(gè)split所以產(chǎn)生三個(gè)作業(yè)將split的數(shù)據(jù)讀取出來進(jìn)行并行的處理吉挣,將數(shù)據(jù)拆分成一個(gè)個(gè)單詞,這個(gè)過程稱為mapping生均;然后通過將各個(gè)節(jié)點(diǎn)上相同的單詞匯聚到同一個(gè)節(jié)點(diǎn)上進(jìn)行計(jì)算听想,這個(gè)過程稱為shuffing;之后將數(shù)據(jù)交由對應(yīng)的reduce task對各個(gè)節(jié)點(diǎn)上單詞的個(gè)數(shù)
進(jìn)行統(tǒng)計(jì)马胧,這個(gè)過程稱為reducing汉买;最后各個(gè)reduce task將統(tǒng)計(jì)的結(jié)果通過OutputFormat輸出到hdfs中。這個(gè)案例體現(xiàn)了mapreduce分而治之的思想

image.png

image.png

MapReduce編程:

我們還是以最經(jīng)典的案例wordcount進(jìn)行演示佩脊,統(tǒng)計(jì)英文單詞蛙粘,不多BB直接上代碼
先看map過程的方法,這個(gè)對應(yīng)的拆分(mapping)的過程


/**
 * 類Mapper<LongWritable, Text, Text, IntWritable>的四個(gè)泛型分別表示
 * map方法的輸入的鍵的類型key-input威彰、值的類型value-input出牧;輸出的鍵的類型key-output、輸出的值的類型value-output
 * key-input 指的是當(dāng)前所讀行行首相對于split分片開頭的字節(jié)偏移量,所以是long類型歇盼,對應(yīng)序列化類型LongWritable
 * value-input 指的是當(dāng)前所讀行舔痕,類型是String,對應(yīng)序列化類型Text
 * key-output 輸出鍵,指的是單詞豹缀,類型是String伯复,對應(yīng)序列化類型是Text
 * value-output 輸出值,指的是單詞的個(gè)數(shù),1邢笙,類型是int啸如,對應(yīng)序列化類型是IntWritable
 *
 */
public class MapService extends Mapper<LongWritable, Text,Text,LongWritable> {
    @Override
    protected void map(LongWritable key, Text value, Context context) throws 
            IOException, InterruptedException {
        String line = value.toString();//每行句子 Dear Bear River
        String[] words = line.split(" ");//每行句子的單詞
        for (String word : words) {
            //得到的結(jié)果以鍵值對顯示,如  Bear:1,將所有的單詞都以這樣的形式輸出給reduce
            context.write(new Text(word),new LongWritable(1));
        }
    }
}


/**
 * 這里reduce的輸入就是map的輸出氮惯,reduce的key-input叮雳、value-input分別與map的key-output、value-output
 * Reducer<Text, IntWritable, Text, IntWritable>的四個(gè)泛型分別表示
 * reduce方法的輸入的鍵key-input妇汗、輸入的值value-input帘不;輸出的鍵key-output、輸出的值value-output
 *
 */
public class ReduceService extends Reducer<Text,LongWritable,Text,LongWritable> {
    //Iterable<LongWritable> 是相同單詞的 value值的集合杨箭,也就是一堆1寞焙,這個(gè)就對應(yīng)shuffling過程
    @Override
    protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
        long sum=0;
        for (LongWritable value : values) {
            sum+=value.get();//統(tǒng)計(jì)相同單詞的總數(shù)
        }
        context.write(key,new LongWritable(sum));//輸出 如:Dear:5;
    }
}


public class WcTest {
    public static void main(String[] args) throws Exception{
        Configuration configuration=new Configuration();
        Job wc = Job.getInstance(configuration, "WC");//作業(yè)的名字是WC
        wc.setJarByClass(WcTest.class);//訪問入口類
        FileInputFormat.setInputPaths(wc, new Path(args[0])); //設(shè)置輸入
        FileOutputFormat.setOutputPath(wc, new Path(args[1]));//輸出路徑

        wc.setMapperClass(MapService.class);//map類
        wc.setMapOutputKeyClass(Text.class);//map輸出key類型
        wc.setMapOutputValueClass(LongWritable.class);//map輸出value類型

        wc.setReducerClass(ReduceService.class);//reduce類
        wc.setMapOutputKeyClass(Text.class);//reduce輸出key類型
        wc.setMapOutputValueClass(LongWritable.class);//reduce輸出value類型

        wc.waitForCompletion(true);//提交作業(yè)

    }

}

程序打包

image.png
image.png

統(tǒng)計(jì)這個(gè)文件內(nèi)的單詞,這個(gè)文件的名稱是mr.txt

image.png

上傳文件到hadoop的test目錄

告唆。棺弊。

把架包傳到服務(wù)器

image.png

執(zhí)行命令:
hadoop jar mapreduceDemo-1.0-SNAPSHOT.jar mapreduce.WcTest hdfs://localhost:8020/test/mr.txt hdfs://localhost:8020/out/wc
執(zhí)行成功

image.png

hadoop fs -ls /out/wc 進(jìn)入/out/wc目錄查看

image.png

hadoop fs -text /out/wc/part-r-00000 查看生成的文件part-r-00000的內(nèi)容

image.png

統(tǒng)計(jì)成功了!G苄模她!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市懂牧,隨后出現(xiàn)的幾起案子侈净,更是在濱河造成了極大的恐慌,老刑警劉巖僧凤,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畜侦,死亡現(xiàn)場離奇詭異,居然都是意外死亡躯保,警方通過查閱死者的電腦和手機(jī)旋膳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來途事,“玉大人验懊,你說我怎么就攤上這事∈洌” “怎么了义图?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長召烂。 經(jīng)常有香客問我碱工,道長,這世上最難降的妖魔是什么奏夫? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任怕篷,我火速辦了婚禮,結(jié)果婚禮上桶蛔,老公的妹妹穿的比我還像新娘匙头。我一直安慰自己,他們只是感情好仔雷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布蹂析。 她就那樣靜靜地躺著,像睡著了一般碟婆。 火紅的嫁衣襯著肌膚如雪电抚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天竖共,我揣著相機(jī)與錄音蝙叛,去河邊找鬼。 笑死公给,一個(gè)胖子當(dāng)著我的面吹牛借帘,可吹牛的內(nèi)容都是我干的蜘渣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肺然,長吁一口氣:“原來是場噩夢啊……” “哼蔫缸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起际起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拾碌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后街望,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體校翔,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年灾前,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了防症。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豫柬,死狀恐怖告希,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烧给,我是刑警寧澤燕偶,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站础嫡,受9級特大地震影響指么,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜榴鼎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一伯诬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧巫财,春花似錦盗似、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闽瓢,卻和暖如春接癌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扣讼。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工缺猛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓荔燎,卻偏偏與公主長得像耻姥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子有咨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354