大數據面試題

spark算子

https://blog.csdn.net/dream0352/article/details/62229977

hadoop相關

hadoop平臺

hadoop平臺

現在普遍認為整個Apache Hadoop“平臺”包括Hadoop內核、MapReduce、Hadoop分布式文件系統(HDFS)以及一些相關項目,有Apache Hive和Apache HBase等等。
Hadoop的框架最核心的設計就是:HDFS和MapReduce。HDFS為海量的數據提供了存儲,則MapReduce為海量的數據提供了計算。

如圖,最下面一層就是hadoop的核心代碼,核心代碼之上實現了兩個最核心的功能:MapReduce和HDFS,這是hadoop的兩大支柱!因為hadoop是Java寫的,為了方便其他對Java語言不熟悉的程序員,在這之上又有Pig,這是一個輕量級的語言,用戶可以使用Pig用于數據分析和處理,系統會自動把它轉化為MapReduce程序。

還有一個Hive,這是一個傳統的SQL到MapReduce的映射器,面向傳統的數據庫工程師。但是不支持全部SQL。還有一個子項目叫HBase,一個非關系數據庫,NoSQL數據庫,數據是列存儲的,提高響應速度,減少IO量,可以做成分布式集群。

ZooKeeper負責服務器節點和進程間的通信,是一個協調工具,因為Hadoop的幾乎每個子項目都是用動物做logo,故這個協調軟件叫動物園管理員。

  • hdfs:
  • zookeeper:
  • YARN(Yet Another Resource Nagotiator,又一資源定位器):用于作業調度和集群資源管理的框架。

簡答說一下hadoop的map-reduce編程模型
MapReducer工作過程

  • 首先map task會從本地文件系統讀取數據,轉換成key-value形式的鍵值對集合,使用的是hadoop內置的數據類型,比如longwritable、text等;
  • 將鍵值對集合輸入mapper進行業務處理過程,將其轉換成需要的key-value在輸出之后會進行一個partition分區操作,默認使用的是hashpartitioner,可以通過重寫hashpartitioner的getpartition方法來自定義分區規則;
  • 之后會對key進行進行sort排序,grouping分組操作將相同key的value合并分組輸出,在這里可以使用自定義的數據類型,重寫WritableComparator的Comparator方法來自定義排序規則,重寫RawComparator的compara方法來自定義分組規則
  • 之后進行一個combiner歸約操作,其實就是一個本地段的reduce預處理,以減小后面shufle和reducer的工作量
  • reduce task會通過網絡將各個數據收集進行reduce處理,最后將數據保存或者顯示,結束整個join

hadoop架構

  • Namenode:也叫名稱節點,是HDFS的守護程序(一個核心程序),對整個分布式文件系統進行總控制,會紀錄所有的元數據分布存儲的狀態信息,比如文件是如何分割成數據塊的,以及這些數據塊被存儲到哪些節點上,還有對內存和I/O進行集中管理,用戶首先會訪問Namenode,通過該總控節點獲取文件分布的狀態信息,找到文件分布到了哪些數據節點,然后在和這些節點打交道,把文件拿到。故這是一個核心節點。
    不過這是個單點,發生故障將使集群崩潰。

  • Secondary Namenode:輔助名稱節點,或者檢查點節點,它是監控HDFS狀態的輔助后臺程序,可以保存名稱節點的副本,故每個集群都有一個,它與NameNode進行通訊,定期保存HDFS元數據快照。NameNode故障可以作為備用NameNode使用,目前還不能自動切換。但是功能絕不僅限于此。所謂后備也不是它的主要功能。后續詳細解釋。

  • DataNode:叫數據節點,每臺從服務器節點都運行一個,負責把HDFS數據塊讀、寫到本地文件系統。這三個東西組成了Hadoop平臺其中一個支柱——HDFS體系。

  • JobTracker:叫作業跟蹤器,運行到主節點(Namenode)上的一個很重要的進程,是MapReduce體系的調度器。用于處理作業(用戶提交的代碼)的后臺程序,決定有哪些文件參與作業的處理,然后把作業切割成為一個個的小task,并把它們分配到所需要的數據所在的子節點。
    Hadoop的原則就是就近運行,數據和程序要在同一個物理節點里,數據在哪里,程序就跑去哪里運行。這個工作是JobTracker做的,監控task,還會重啟失敗的task(于不同的節點),每個集群只有唯一一個JobTracker,類似單點的nn,位于Master節點(稍后解釋Master節點和slave節點)。

  • TaskTracker:叫任務跟蹤器,MapReduce體系的最后一個后臺進程,位于每個slave節點上,與datanode結合(代碼與數據一起的原則),管理各自節點上的task(由jobtracker分配),每個節點只有一個tasktracker,但一個tasktracker可以啟動多個JVM,用于并行執行map或reduce任務,它與jobtracker交互通信,可以告知jobtracker子任務完成情況。

  • Master與Slave:
    Master節點:運行了Namenode、或者Secondary Namenode、或者Jobtracker的節點。還有瀏覽器(用于觀看管理界面),等其它Hadoop工具。Master不是唯一的!
    Slave節點:運行Tasktracker、Datanode的機器。

hadoop的TextInputFormat作用是什么,如何自定義實現
InputFormat會在map操作之前對數據進行兩方面的預處理
1是getSplits,返回的是InputSplit數組,對數據進行split分片,每片交給map操作一次
2是getRecordReader,返回的是RecordReader對象,對每個split分片進行轉換為key-value鍵值對格式傳遞給map

常用的InputFormat是TextInputFormat,使用的是LineRecordReader對每個分片進行鍵值對的轉換,以行偏移量作為鍵,行內容作為值

自定義類繼承InputFormat接口,重寫createRecordReader和isSplitable方法
在createRecordReader中可以自定義分隔符

hadoop和spark的都是并行計算,那么他們有什么相同和區別

兩者都是用mr模型來進行并行計算,hadoop的一個作業稱為job,job里面分為map task和reduce task,每個task都是在自己的進程中運行的,當task結束時,進程也會結束

spark用戶提交的任務成為application,一個application對應一個sparkcontext,app中存在多個job,每觸發一次action操作就會產生一個job

這些job可以并行或串行執行,每個job中有多個stage,stage是shuffle過程中DAGSchaduler通過RDD之間的依賴關系劃分job而來的,每個stage里面有多個task,組成taskset有TaskSchaduler分發到各個executor中執行,executor的生命周期是和app一樣的,即使沒有job運行也是存在的,所以task可以快速啟動讀取內存進行計算

hadoop的job只有map和reduce操作,表達能力比較欠缺而且在mr過程中會重復的讀寫hdfs,造成大量的io操作,多個job需要自己管理關系

spark的迭代計算都是在內存中進行的,API中提供了大量的RDD操作如join,groupby等,而且通過DAG圖可以實現良好的容錯。

為什么要用flume導入hdfs,hdfs的構架是怎樣的

flume可以實時的導入數據到hdfs中,當hdfs上的文件達到一個指定大小的時候會形成一個文件,或者超過指定時間的話也形成一個文件

文件都是存儲在datanode上面的,namenode記錄著datanode的元數據信息,而namenode的元數據信息是存在內存中的,所以當文件切片很小或者很多的時候會卡死

map-reduce程序運行的時候會有什么比較常見的問題

比如說作業中大部分都完成了,但是總有幾個reduce一直在運行

這是因為這幾個reduce中的處理的數據要遠遠大于其他的reduce,可能是因為對鍵值對任務劃分的不均勻造成的數據傾斜

解決的方法可以在分區的時候重新定義分區規則對于value數據很多的key可以進行拆分、均勻打散等處理,或者是在map端的combiner中進行數據預處理的操作

簡單說一下hadoop和spark的shuffle過程

hadoop:map端保存分片數據,通過網絡收集到reduce端
spark:spark的shuffle是在DAGSchedular劃分Stage的時候產生的,TaskSchedule要分發Stage到各個worker的executor

減少shuffle可以提高性能

——-補充更新———

1、Hive中存放是什么?
表。
存的是和hdfs的映射關系,hive是邏輯上的數據倉庫,實際操作的都是hdfs上的文件,HQL就是用sql語法來寫的mr程序。

2、Hive與關系型數據庫的關系?
沒有關系,hive是數據倉庫,不能和數據庫一樣進行實時的CURD操作。
是一次寫入多次讀取的操作,可以看成是ETL工具。

3、Flume工作機制是什么?
核心概念是agent,里面包括source、chanel和sink三個組件。
source運行在日志收集節點進行日志采集,之后臨時存儲在chanel中,sink負責將chanel中的數據發送到目的地。
只有成功發送之后chanel中的數據才會被刪除。
首先書寫flume配置文件,定義agent、source、chanel和sink然后將其組裝,執行flume-ng命令。

4、Sqoop工作原理是什么?
hadoop生態圈上的數據傳輸工具。
可以將關系型數據庫的數據導入非結構化的hdfs、hive或者bbase中,也可以將hdfs中的數據導出到關系型數據庫或者文本文件中。
使用的是mr程序來執行任務,使用jdbc和關系型數據庫進行交互。
import原理:通過指定的分隔符進行數據切分,將分片傳入各個map中,在map任務中在每行數據進行寫入處理沒有reduce。
export原理:根據要操作的表名生成一個java類,并讀取其元數據信息和分隔符對非結構化的數據進行匹配,多個map作業同時執行寫入關系型數據庫

5、Hbase行健列族的概念,物理模型,表的設計原則?
行健:是hbase表自帶的,每個行健對應一條數據。
列族:是創建表時指定的,為列的集合,每個列族作為一個文件單獨存儲,存儲的數據都是字節數組,其中的數據可以有很多,通過時間戳來區分。
物理模型:整個hbase表會拆分為多個region,每個region記錄著行健的起始點保存在不同的節點上,查詢時就是對各個節點的并行查詢,當region很大時使用.META表存儲各個region的起始點,-ROOT又可以存儲.META的起始點。
rowkey的設計原則:各個列簇數據平衡,長度原則、相鄰原則,創建表的時候設置表放入regionserver緩存中,避免自動增長和時間,使用字節數組代替string,最大長度64kb,最好16字節以內,按天分表,兩個字節散列,四個字節存儲時分毫秒。
列族的設計原則:盡可能少(按照列族進行存儲,按照region進行讀取,不必要的io操作),經常和不經常使用的兩類數據放入不同列族中,列族名字盡可能短。

6、Spark Streaming和Storm有何區別?
一個實時毫秒一個準實時亞秒,不過storm的吞吐率比較低。

7、mllib支持的算法?
大體分為四大類,分類、聚類、回歸、協同過濾。

8、簡答說一下hadoop的map-reduce編程模型?
首先map task會從本地文件系統讀取數據,轉換成key-value形式的鍵值對集合。
將鍵值對集合輸入mapper進行業務處理過程,將其轉換成需要的key-value在輸出。
之后會進行一個partition分區操作,默認使用的是hashpartitioner,可以通過重寫hashpartitioner的getpartition方法來自定義分區規則。
之后會對key進行進行sort排序,grouping分組操作將相同key的value合并分組輸出。
在這里可以使用自定義的數據類型,重寫WritableComparator的Comparator方法來自定義排序規則,重寫RawComparator的compara方法來自定義分組規則。
之后進行一個combiner歸約操作,其實就是一個本地段的reduce預處理,以減小后面shufle和reducer的工作量。
reduce task會通過網絡將各個數據收集進行reduce處理,最后將數據保存或者顯示,結束整個job。

9、Hadoop平臺集群配置、環境變量設置?
zookeeper:修改zoo.cfg文件,配置dataDir,和各個zk節點的server地址端口,tickTime心跳時間默認是2000ms,其他超時的時間都是以這個為基礎的整數倍,之后再dataDir對應目錄下寫入myid文件和zoo.cfg中的server相對應。

hadoop:修改
hadoop-env.sh配置java環境變量
core-site.xml配置zk地址,臨時目錄等
hdfs-site.xml配置nn信息,rpc和http通信地址,nn自動切換、zk連接超時時間等
yarn-site.xml配置resourcemanager地址
mapred-site.xml配置使用yarn
slaves配置節點信息
格式化nn和zk。

hbase:修改
hbase-env.sh配置java環境變量和是否使用自帶的zk
hbase-site.xml配置hdfs上數據存放路徑,zk地址和通訊超時時間、master節點
regionservers配置各個region節點
zoo.cfg拷貝到conf目錄下

spark:
安裝Scala
修改spark-env.sh配置環境變量和master和worker節點配置信息

環境變量的設置:直接在/etc/profile中配置安裝的路徑即可,或者在當前用戶的宿主目錄下,配置在.bashrc文件中,該文件不用source重新打開shell窗口即可,配置在.bash_profile的話只對當前用戶有效。

10、Hadoop性能調優?

調優可以通過系統配置、程序編寫和作業調度算法來進行。
hdfs的block.size可以調到128/256(網絡很好的情況下,默認為64)
調優的大頭:mapred.map.tasks、mapred.reduce.tasks設置mr任務數(默認都是1)
mapred.tasktracker.map.tasks.maximum每臺機器上的最大map任務數
mapred.tasktracker.reduce.tasks.maximum每臺機器上的最大reduce任務數
mapred.reduce.slowstart.completed.maps配置reduce任務在map任務完成到百分之幾的時候開始進入
這個幾個參數要看實際節點的情況進行配置,reduce任務是在33%的時候完成copy,要在這之前完成map任務,(map可以提前完成)
mapred.compress.map.output,mapred.output.compress配置壓縮項,消耗cpu提升網絡和磁盤io
合理利用combiner
注意重用writable對象

11、Hadoop高并發?
首先肯定要保證集群的高可靠性,在高并發的情況下不會掛掉,支撐不住可以通過橫向擴展。
datanode掛掉了使用hadoop腳本重新啟動。

12、hadoop的TextInputFormat作用是什么,如何自定義實現?
InputFormat會在map操作之前對數據進行兩方面的預處理。
1是getSplits,返回的是InputSplit數組,對數據進行split分片,每片交給map操作一次 。
2是getRecordReader,返回的是RecordReader對象,對每個split分片進行轉換為key-value鍵值對格式傳遞給map。
常用的InputFormat是TextInputFormat,使用的是LineRecordReader對每個分片進行鍵值對的轉換,以行偏移量作為鍵,行內容作為值。
自定義類繼承InputFormat接口,重寫createRecordReader和isSplitable方法 。
在createRecordReader中可以自定義分隔符。

13、hadoop和spark的都是并行計算,那么他們有什么相同和區別?
兩者都是用mr模型來進行并行計算,hadoop的一個作業稱為job,job里面分為map task和reduce task,每個task都是在自己的進程中運行的,當task結束時,進程也會結束。
spark用戶提交的任務成為application,一個application對應一個sparkcontext,app中存在多個job,每觸發一次action操作就會產生一個job。
這些job可以并行或串行執行,每個job中有多個stage,stage是shuffle過程中DAGSchaduler通過RDD之間的依賴關系劃分job而來的,每個stage里面有多個task,組成taskset有TaskSchaduler分發到各個executor中執行,executor的生命周期是和app一樣的,即使沒有job運行也是存在的,所以task可以快速啟動讀取內存進行計算。
hadoop的job只有map和reduce操作,表達能力比較欠缺而且在mr過程中會重復的讀寫hdfs,造成大量的io操作,多個job需要自己管理關系。
spark的迭代計算都是在內存中進行的,API中提供了大量的RDD操作如join,groupby等,而且通過DAG圖可以實現良好的容錯。

14、為什么要用flume導入hdfs,hdfs的構架是怎樣的?
flume可以實時的導入數據到hdfs中,當hdfs上的文件達到一個指定大小的時候會形成一個文件,或者超過指定時間的話也形成一個文件。
文件都是存儲在datanode上面的,namenode記錄著datanode的元數據信息,而namenode的元數據信息是存在內存中的,所以當文件切片很小或者很多的時候會卡死。

15、map-reduce程序運行的時候會有什么比較常見的問題?
比如說作業中大部分都完成了,但是總有幾個reduce一直在運行。
這是因為這幾個reduce中的處理的數據要遠遠大于其他的reduce,可能是因為對鍵值對任務劃分的不均勻造成的數據傾斜。
解決的方法可以在分區的時候重新定義分區規則對于value數據很多的key可以進行拆分、均勻打散等處理,或者是在map端的combiner中進行數據預處理的操作。

16、簡單說一下hadoop和spark的shuffle過程?
hadoop:map端保存分片數據,通過網絡收集到reduce端。
spark:spark的shuffle是在DAGSchedular劃分Stage的時候產生的,TaskSchedule要分發Stage到各個worker的executor。
減少shuffle可以提高性能。

17、RDD機制?
rdd分布式彈性數據集,簡單的理解成一種數據結構,是spark框架上的通用貨幣。
所有算子都是基于rdd來執行的,不同的場景會有不同的rdd實現類,但是都可以進行互相轉換。
rdd執行過程中會形成dag圖,然后形成lineage保證容錯性等。
從物理的角度來看rdd存儲的是block和node之間的映射。

18、spark有哪些組件?
(1)master:管理集群和節點,不參與計算。
(2)worker:計算節點,進程本身不參與計算,和master匯報。
(3)Driver:運行程序的main方法,創建spark context對象。
(4)spark context:控制整個application的生命周期,包括dagsheduler和task scheduler等組件。
(5)client:用戶提交程序的入口。

19、spark工作機制?
用戶在client端提交作業后,會由Driver運行main方法并創建spark context上下文。
執行add算子,形成dag圖輸入dagscheduler,按照add之間的依賴關系劃分stage輸入task scheduler。
task scheduler會將stage劃分為task set分發到各個節點的executor中執行。

20、spark的優化怎么做?
通過spark-env文件、程序中sparkconf和set property設置。
(1)計算量大,形成的lineage過大應該給已經緩存了的rdd添加checkpoint,以減少容錯帶來的開銷。
(2)小分區合并,過小的分區造成過多的切換任務開銷,使用repartition。

21、kafka工作原理?
producer向broker發送事件,consumer從broker消費事件。
事件由topic區分開,每個consumer都會屬于一個group。
相同group中的consumer不能重復消費事件,而同一事件將會發送給每個不同group的consumer。

22、ALS算法原理?
答:對于user-product-rating數據,als會建立一個稀疏的評分矩陣,其目的就是通過一定的規則填滿這個稀疏矩陣。
als會對稀疏矩陣進行分解,分為用戶-特征值,產品-特征值,一個用戶對一個產品的評分可以由這兩個矩陣相乘得到。
通過固定一個未知的特征值,計算另外一個特征值,然后交替反復進行最小二乘法,直至差平方和最小,即可得想要的矩陣。

23、kmeans算法原理?
隨機初始化中心點范圍,計算各個類別的平均值得到新的中心點。
重新計算各個點到中心值的距離劃分,再次計算平均值得到新的中心點,直至各個類別數據平均值無變化。

24、canopy算法原理?
根據兩個閾值來劃分數據,以隨機的一個數據點作為canopy中心。
計算其他數據點到其的距離,劃入t1、t2中,劃入t2的從數據集中刪除,劃入t1的其他數據點繼續計算,直至數據集中無數據。

25、樸素貝葉斯分類算法原理?
對于待分類的數據和分類項,根據待分類數據的各個特征屬性,出現在各個分類項中的概率判斷該數據是屬于哪個類別的。

26、關聯規則挖掘算法apriori原理?
一個頻繁項集的子集也是頻繁項集,針對數據得出每個產品的支持數列表,過濾支持數小于預設值的項,對剩下的項進行全排列,重新計算支持數,再次過濾,重復至全排列結束,可得到頻繁項和對應的支持數。

作者:@小黑

以下是自己的理解,如果有不對的地方希望各位大俠可以幫我指出來~:

1、簡答說一下hadoop的map-reduce編程模型

首先map task會從本地文件系統讀取數據,轉換成key-value形式的鍵值對集合

使用的是hadoop內置的數據類型,比如longwritable、text等

將鍵值對集合輸入mapper進行業務處理過程,將其轉換成需要的key-value在輸出

之后會進行一個partition分區操作,默認使用的是hashpartitioner,可以通過重寫hashpartitioner的getpartition方法來自定義分區規則

之后會對key進行進行sort排序,grouping分組操作將相同key的value合并分組輸出,在這里可以使用自定義的數據類型,重寫WritableComparator的Comparator方法來自定義排序規則,重寫RawComparator的compara方法來自定義分組規則

之后進行一個combiner歸約操作,其實就是一個本地段的reduce預處理,以減小后面shufle和reducer的工作量

reduce task會通過網絡將各個數據收集進行reduce處理,最后將數據保存或者顯示,結束整個job

2、hadoop的TextInputFormat作用是什么,如何自定義實現

InputFormat會在map操作之前對數據進行兩方面的預處理
1是getSplits,返回的是InputSplit數組,對數據進行split分片,每片交給map操作一次
2是getRecordReader,返回的是RecordReader對象,對每個split分片進行轉換為key-value鍵值對格式傳遞給map

常用的InputFormat是TextInputFormat,使用的是LineRecordReader對每個分片進行鍵值對的轉換,以行偏移量作為鍵,行內容作為值

自定義類繼承InputFormat接口,重寫createRecordReader和isSplitable方法
在createRecordReader中可以自定義分隔符

3、hadoop和spark的都是并行計算,那么他們有什么相同和區別

兩者都是用mr模型來進行并行計算,hadoop的一個作業稱為job,job里面分為map task和reduce task,每個task都是在自己的進程中運行的,當task結束時,進程也會結束

spark用戶提交的任務成為application,一個application對應一個sparkcontext,app中存在多個job,每觸發一次action操作就會產生一個job

這些job可以并行或串行執行,每個job中有多個stage,stage是shuffle過程中DAGSchaduler通過RDD之間的依賴關系劃分job而來的,每個stage里面有多個task,組成taskset有TaskSchaduler分發到各個executor中執行,executor的生命周期是和app一樣的,即使沒有job運行也是存在的,所以task可以快速啟動讀取內存進行計算

hadoop的job只有map和reduce操作,表達能力比較欠缺而且在mr過程中會重復的讀寫hdfs,造成大量的io操作,多個job需要自己管理關系

spark的迭代計算都是在內存中進行的,API中提供了大量的RDD操作如join,groupby等,而且通過DAG圖可以實現良好的容錯

4、為什么要用flume導入hdfs,hdfs的構架是怎樣的

flume可以實時的導入數據到hdfs中,當hdfs上的文件達到一個指定大小的時候會形成一個文件,或者超過指定時間的話也形成一個文件

文件都是存儲在datanode上面的,namenode記錄著datanode的元數據信息,而namenode的元數據信息是存在內存中的,所以當文件切片很小或者很多的時候會卡死

5、map-reduce程序運行的時候會有什么比較常見的問題

比如說作業中大部分都完成了,但是總有幾個reduce一直在運行

這是因為這幾個reduce中的處理的數據要遠遠大于其他的reduce,可能是因為對鍵值對任務劃分的不均勻造成的數據傾斜

解決的方法可以在分區的時候重新定義分區規則對于value數據很多的key可以進行拆分、均勻打散等處理,或者是在map端的combiner中進行數據預處理的操作

6、簡單說一下hadoop和spark的shuffle過程

hadoop:map端保存分片數據,通過網絡收集到reduce端
spark:spark的shuffle是在DAGSchedular劃分Stage的時候產生的,TaskSchedule要分發Stage到各個worker的executor

減少shuffle可以提高性能

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

推薦閱讀更多精彩內容