101-BigData-29Azkaban

上一篇:100-BigData-28Sqoop

一、概述

1.1 為什么需要工作流調(diào)度系統(tǒng)

1)一個完整的數(shù)據(jù)分析系統(tǒng)通常都是由大量任務(wù)單元組成:
shell腳本程序,java程序,mapreduce程序、hive腳本等
2)各任務(wù)單元之間存在時間先后及前后依賴關(guān)系
3)為了很好地組織起這樣的復(fù)雜執(zhí)行計劃,需要一個工作流調(diào)度系統(tǒng)來調(diào)度執(zhí)行;
例如,我們可能有這樣一個需求,某個業(yè)務(wù)系統(tǒng)每天產(chǎn)生20G原始數(shù)據(jù),我們每天都要對其進行處理,處理步驟如下所示:
通過Hadoop先將原始數(shù)據(jù)上傳到HDFS上(HDFS的操作);
使用MapReduce對原始數(shù)據(jù)進行清洗(MapReduce的操作);
將清洗后的數(shù)據(jù)導(dǎo)入到hive表中(hive的導(dǎo)入操作);
對Hive中多個表的數(shù)據(jù)進行JOIN處理,得到一張hive的明細表(創(chuàng)建中間表);
通過對明細表的統(tǒng)計和分析,得到結(jié)果報表信息(hive的查詢操作);

1.2 Azkaban的適用場景

根據(jù)以上業(yè)務(wù)場景: (2)任務(wù)依賴(1)任務(wù)的結(jié)果,(3)任務(wù)依賴(2)任務(wù)的結(jié)果,(4)任務(wù)依賴(3)任務(wù)的結(jié)果,(5)任務(wù)依賴(4)任務(wù)的結(jié)果。一般的做法是,先執(zhí)行完(1)再執(zhí)行(2),再一次執(zhí)行(3)(4)(5)。
這樣的話,整個的執(zhí)行過程都需要人工參加,并且得盯著各任務(wù)的進度。但是我們的很多任務(wù)都是在深更半夜執(zhí)行的,通過寫腳本設(shè)置crontab執(zhí)行。其實,整個過程類似于一個有向無環(huán)圖(DAG)。每個子任務(wù)相當(dāng)于大任務(wù)中的一個節(jié)點,也就是,我們需要的就是一個工作流的調(diào)度器,而Azkaban就是能解決上述問題的一個調(diào)度器。

1.3 什么是azkaban

Azkaban是由Linkedin公司推出的一個批量工作流任務(wù)調(diào)度器,主要用于在一個工作流內(nèi)以一個特定的順序運行一組工作和流程,它的配置是通過簡單的key:value對的方式,通過配置中的dependencies 來設(shè)置依賴關(guān)系。Azkaban使用job配置文件建立任務(wù)之間的依賴關(guān)系,并提供一個易于使用的web用戶界面維護和跟蹤你的工作流。

1.4 Azkaban特點

兼容任何版本的hadoop
易于使用的Web用戶界面
簡單的工作流的上傳
方便設(shè)置任務(wù)之間的關(guān)系
調(diào)度工作流
模塊化和可插拔的插件機制
認證/授權(quán)(權(quán)限的工作)
能夠殺死并重新啟動工作流
有關(guān)失敗和成功的電子郵件提醒

1.5 常見工作流調(diào)度系統(tǒng)

1)簡單的任務(wù)調(diào)度:直接使用crontab實現(xiàn);
2)復(fù)雜的任務(wù)調(diào)度:開發(fā)調(diào)度平臺或使用現(xiàn)成的開源調(diào)度系統(tǒng),比如ooize、azkaban等

1.6 ooize和azkaban特性對比

下面的表格對上述四種hadoop工作流調(diào)度器的關(guān)鍵特性進行了比較,盡管這些工作流調(diào)度器能夠解決的需求場景基本一致,但在設(shè)計理念,目標(biāo)用戶,應(yīng)用場景等方面還是存在顯著的區(qū)別,在做技術(shù)選型的時候,可以提供參考

image.png

1.7 Azkaban的架構(gòu)
Azkaban由三個關(guān)鍵組件構(gòu)成:

image.png

AzkabanWebServer:AzkabanWebServer是整個Azkaban工作流系統(tǒng)的主要管理者,它用戶登錄認證、負責(zé)project管理、定時執(zhí)行工作流、跟蹤工作流執(zhí)行進度等一系列任務(wù)。

AzkabanExecutorServer:負責(zé)具體的工作流的提交、執(zhí)行,它們通過mysql數(shù)據(jù)庫來協(xié)調(diào)任務(wù)的執(zhí)行。

關(guān)系型數(shù)據(jù)庫(MySQL):存儲大部分執(zhí)行流狀態(tài),AzkabanWebServer和AzkabanExecutorServer都需要訪問數(shù)據(jù)庫。

1.8 Azkaban下載地址
下載地址:http://azkaban.github.io/downloads.html

2.5.0版本下載

密碼:9h71

二、Azkaban安裝部署

2.1 安裝前準(zhǔn)備

將Azkaban Web服務(wù)器、Azkaban執(zhí)行服務(wù)器、Azkaban的sql執(zhí)行腳本及MySQL安裝包拷貝到bigdata111虛擬機/opt/software目錄下
azkaban-web-server-2.5.0.tar.gz
azkaban-executor-server-2.5.0.tar.gz
azkaban-sql-script-2.5.0.tar.gz
mysql-libs.zip
選擇Mysql作為Azkaban數(shù)據(jù)庫,因為Azkaban建立了一些Mysql連接增強功能,以方便Azkaban設(shè)置,并增強服務(wù)可靠性。

2.2 安裝Azkaban

在/opt/module/目錄下創(chuàng)建azkaban目錄

[AncientMing@bigdata111 module]$ mkdir azkaban

解壓azkaban-web-server-2.5.0.tar.gz、azkaban-executor-server-2.5.0.tar.gz、azkaban-sql-script-2.5.0.tar.gz到/opt/module/azkaban目錄下

[AncientMing@bigdata111 software]$ tar -zxvf azkaban-web-server-2.5.0.tar.gz -C /opt/module/azkaban/
[AncientMing@bigdata111 software]$ tar -zxvf azkaban-executor-server-2.5.0.tar.gz -C /opt/module/azkaban/
[AncientMing@bigdata111 software]$ tar -zxvf azkaban-sql-script-2.5.0.tar.gz -C /opt/module/azkaban/

對解壓后的文件重新命名

[AncientMing@bigdata111 azkaban]$ mv azkaban-web-2.5.0/ server
[AncientMing@bigdata111 azkaban]$ mv azkaban-executor-2.5.0/ executor

azkaban腳本導(dǎo)入
進入mysql,創(chuàng)建azkaban數(shù)據(jù)庫,并將解壓的腳本導(dǎo)入到azkaban數(shù)據(jù)庫。

[AncientMing@bigdata111 azkaban]$ mysql -uroot -p000000
mysql> create database azkaban;
mysql> use azkaban;
mysql> source /opt/module/azkaban/azkaban-2.5.0/create-all-sql-2.5.0.sql

注:source后跟.sql文件,用于批量處理.sql文件中的sql語句。
2.3 生成密鑰庫
Keytool是java數(shù)據(jù)證書的管理工具,使用戶能夠管理自己的公/私鑰對及相關(guān)證書。
-keystore 指定密鑰庫的名稱及位置(產(chǎn)生的各類信息將不在.keystore文件中)
-genkey 在用戶主目錄中創(chuàng)建一個默認文件".keystore"
-alias 對我們生成的.keystore 進行指認別名;如果沒有默認是mykey
-keyalg 指定密鑰的算法 RSA/DSA 默認是DSA
1)生成 keystore的密碼及相應(yīng)信息的密鑰庫
[AncientMing@bigdata111 azkaban]$ keytool -keystore keystore -alias jetty -genkey -keyalg RSA
輸入密鑰庫口令: 000000
再次輸入新口令: 000000
您的名字與姓氏是什么?
[Unknown]:
您的組織單位名稱是什么?
[Unknown]:
您的組織名稱是什么?
[Unknown]:
您所在的城市或區(qū)域名稱是什么?
[Unknown]:
您所在的省/市/自治區(qū)名稱是什么?
[Unknown]:
該單位的雙字母國家/地區(qū)代碼是什么?
[Unknown]:
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown是否正確?
[否]: y

輸入 <jetty> 的密鑰口令 000000
(如果和密鑰庫口令相同, 按回車):
再次輸入新口令: 000000
注意:
密鑰庫的密碼至少必須6個字符,可以是純數(shù)字或者字母或者數(shù)字和字母的組合等等
密鑰庫的密碼最好和<jetty> 的密鑰相同,方便記憶
2)將keystore 拷貝到 azkaban web服務(wù)器根目錄中

[AncientMing@bigdata111 azkaban]$ mv keystore /opt/module/azkaban/server/

2.4 時間同步配置
先配置好服務(wù)器節(jié)點上的時區(qū)
如果在/usr/share/zoneinfo/這個目錄下不存在時區(qū)配置文件Asia/Shanghai,就要用 tzselect 生成。
[AncientMing@bigdata111 azkaban]$ tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.

  1. Africa
  2. Americas
  3. Antarctica
  4. Arctic Ocean
  5. Asia
  6. Atlantic Ocean
  7. Australia
  8. Europe
  9. Indian Ocean
  10. Pacific Ocean
  11. none - I want to specify the time zone using the Posix TZ format.
#? 5

Please select a country.

  1. Afghanistan 18) Israel 35) Palestine
  2. Armenia 19) Japan 36) Philippines
  3. Azerbaijan 20) Jordan 37) Qatar
  4. Bahrain 21) Kazakhstan 38) Russia
  5. Bangladesh 22) Korea (North) 39) Saudi Arabia
  6. Bhutan 23) Korea (South) 40) Singapore
  7. Brunei 24) Kuwait 41) Sri Lanka
  8. Cambodia 25) Kyrgyzstan 42) Syria
  9. China 26) Laos 43) Taiwan
  10. Cyprus 27) Lebanon 44) Tajikistan
  11. East Timor 28) Macau 45) Thailand
  12. Georgia 29) Malaysia 46) Turkmenistan
  13. Hong Kong 30) Mongolia 47) United Arab Emirates
  14. India 31) Myanmar (Burma) 48) Uzbekistan
  15. Indonesia 32) Nepal 49) Vietnam
  16. Iran 33) Oman 50) Yemen
  17. Iraq 34) Pakistan
#? 9

Please select one of the following time zone regions.

  1. Beijing Time
  2. Xinjiang Time
#? 1

The following information has been given:

    China
    Beijing Time

Therefore TZ='Asia/Shanghai' will be used.
Local time is now: Thu Oct 18 16:24:23 CST 2018.
Universal Time is now: Thu Oct 18 08:24:23 UTC 2018.
Is the above information OK?

  1. Yes
  2. No
#? 1

You can make this change permanent for yourself by appending the line
TZ='Asia/Shanghai'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai
2)拷貝該時區(qū)文件,覆蓋系統(tǒng)本地時區(qū)配置

[AncientMing@bigdata111 azkaban]$ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  

3)集群時間同步(同時發(fā)給三個窗口)

[AncientMing@bigdata111 azkaban]$ sudo date -s '2019-05-20 20:39:30'

2.5 配置文件
2.5.1 Web服務(wù)器配置
1)進入azkaban web服務(wù)器安裝目錄 conf目錄,打開azkaban.properties文件

[AncientMing@bigdata111 conf]$ pwd
/opt/module/azkaban/server/conf
[AncientMing@bigdata111 conf]$ vi azkaban.properties

2)按照如下配置修改azkaban.properties文件。

#Azkaban Personalization Settings
#服務(wù)器UI名稱,用于服務(wù)器上方顯示的名字
azkaban.name=Test
#描述
azkaban.label=My Local Azkaban
#UI顏色
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
#默認web server存放web文件的目錄
web.resource.dir=/opt/module/azkaban/server/web/
#默認時區(qū),已改為亞洲/上海 默認為美國
default.timezone.id=Asia/Shanghai

#Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
#用戶權(quán)限管理默認類(絕對路徑)
user.manager.xml.file=/opt/module/azkaban/server/conf/azkaban-users.xml

#Loader for projects
#global配置文件所在位置(絕對路徑)
executor.global.properties=/opt/module/azkaban/executor/conf/global.properties
azkaban.project.dir=projects

#數(shù)據(jù)庫類型
database.type=mysql
#端口號
mysql.port=3306
#數(shù)據(jù)庫連接IP
mysql.host=bigdata112
#數(shù)據(jù)庫實例名
mysql.database=azkaban
#數(shù)據(jù)庫用戶名
mysql.user=root
#數(shù)據(jù)庫密碼
mysql.password=000000
#最大連接數(shù)
mysql.numconnections=100

# Velocity dev mode
velocity.dev.mode=false

# Azkaban Jetty server properties.
# Jetty服務(wù)器屬性.
#最大線程數(shù)
jetty.maxThreads=25
#Jetty SSL端口
jetty.ssl.port=8443
#Jetty端口
jetty.port=8081
#SSL文件名(絕對路徑)
jetty.keystore=/opt/module/azkaban/server/keystore
#SSL文件密碼
jetty.password=000000
#Jetty主密碼與keystore文件相同
jetty.keypassword=000000
#SSL文件名(絕對路徑)
jetty.truststore=/opt/module/azkaban/server/keystore
#SSL文件密碼
jetty.trustpassword=000000

# Azkaban Executor settings
executor.port=12321

# mail settings
mail.sender=
mail.host=
job.failure.email=
job.success.email=

lockdown.create.projects=false

cache.directory=cache

3)web服務(wù)器用戶配置
在azkaban web服務(wù)器安裝目錄 conf目錄,按照如下配置修改azkaban-users.xml 文件,增加管理員用戶。

[AncientMing@bigdata111 conf]$ vi azkaban-users.xml
<azkaban-users>
    <user username="azkaban" password="azkaban" roles="admin" groups="azkaban" />
    <user username="metrics" password="metrics" roles="metrics"/>
    <user username="admin" password="admin" roles="admin,metrics" />
    <role name="admin" permissions="ADMIN" />
    <role name="metrics" permissions="METRICS"/>
</azkaban-users>

2.5.2 執(zhí)行服務(wù)器配置
1)進入執(zhí)行服務(wù)器安裝目錄conf,打開azkaban.properties

[AncientMing@bigdata111 conf]$ pwd
/opt/module/azkaban/executor/conf

[AncientMing@bigdata111 conf]$ vim azkaban.properties

按照如下配置修改azkaban.properties文件。

#Azkaban
#時區(qū)
default.timezone.id=Asia/Shanghai

# Azkaban JobTypes Plugins
#jobtype 插件所在位置
azkaban.jobtype.plugin.dir=plugins/jobtypes

#Loader for projects
executor.global.properties=/opt/module/azkaban/executor/conf/global.properties
azkaban.project.dir=projects

database.type=mysql
mysql.port=3306
mysql.host=bigdata112
mysql.database=azkaban
mysql.user=root
mysql.password=000000
mysql.numconnections=100

# Azkaban Executor settings
#最大線程數(shù)
executor.maxThreads=50
#端口號(如修改,請與web服務(wù)中一致)
executor.port=12321
#線程數(shù)
executor.flow.threads=30

2.6 啟動executor服務(wù)器
在executor服務(wù)器目錄下執(zhí)行啟動命令

[AncientMing@bigdata111 executor]$ pwd
/opt/module/azkaban/executor
[AncientMing@bigdata111 executor]$ bin/azkaban-executor-start.sh

2.7 啟動web服務(wù)器
在azkaban web服務(wù)器目錄下執(zhí)行啟動命令

[AncientMing@bigdata111 server]$ pwd
/opt/module/azkaban/server
[AncientMing@bigdata111 server]$ bin/azkaban-web-start.sh

注意:
先執(zhí)行executor,再執(zhí)行web,避免Web Server會因為找不到執(zhí)行器啟動失敗。
jps查看進程

[AncientMing@bigdata111 server]$ jps

3601 AzkabanExecutorServer
5880 Jps
3661 AzkabanWebServer
啟動完成后,在瀏覽器(建議使用谷歌瀏覽器)中輸入https://服務(wù)器IP地址:8443,即可訪問azkaban服務(wù)了。
在登錄中輸入剛才在azkaban-users.xml文件中新添加的戶用名及密碼,即admin和admin,點擊 login。

三、Azkaban實戰(zhàn)

Azkaba內(nèi)置的任務(wù)類型支持command、java
3.1單一job案例
1)創(chuàng)建job描述文件

[AncientMing@bigdata111 jobs]$ vim first.job
#first.job
type=command
command=echo 'this is my first job'
  1. 將job資源文件打包成zip文件
[AncientMing@bigdata111 jobs]$ zip first.zip first.job 
  adding: first.job (deflated 15%)
[AncientMing@bigdata111 jobs]$ ll

總用量 8
-rw-rw-r--. 1 AncientMing AncientMing 60 10月 18 17:42 first.job
-rw-rw-r--. 1 AncientMing AncientMing 219 10月 18 17:43 first.zip
注意:
目前,Azkaban上傳的工作流文件只支持xxx.zip文件。zip應(yīng)包含xxx.job運行作業(yè)所需的文件和任何文件(文件名后綴必須以.job結(jié)尾,否則無法識別)。作業(yè)名稱在項目中必須是唯一的。
3)通過azkaban的web管理平臺創(chuàng)建project并上傳job的zip包
首先創(chuàng)建project

image.png

上傳zip包

image.png

4)啟動執(zhí)行該job

image.png

點擊執(zhí)行工作流

image.png

點擊繼續(xù)

image.png

5)Job執(zhí)行成功

image.png

6)點擊查看job日志

image.png

3.2多job工作流案例
1)創(chuàng)建有依賴關(guān)系的多個job描述
第一個job:1.job

[AncientMing@bigdata111 jobs]$ vi 1.job
type=command
command=/opt/module/hadoop-2.8.4/bin/hadoop fs -put /opt/module/datas/word.txt /

第二個job:2.job依賴1.job

[AncientMing@bigdata111 jobs]$ vi 2.job
type=command
command=/opt/module/hadoop-2.8.4/bin/hadoop jar /opt/module/hadoop-2.8.4/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.4.jar wordcount /word.txt /out
dependencies=1

2)注意:將所有job資源文件打到一個zip包中
3)在azkaban的web管理界面創(chuàng)建工程并上傳zip包
4)查看結(jié)果
思考:
將student.txt文件上傳到hdfs,根據(jù)所傳文件創(chuàng)建外部表,再將表中查詢到的結(jié)果寫入到本地文件
3.3 java操作任務(wù)
使用Azkaban調(diào)度java程序
1)編寫java程序


import java.io.FileOutputStream;
import java.io.IOException;


public class AzkabanTest {
    public void run() throws IOException {
        // 根據(jù)需求編寫具體代碼
        FileOutputStream fos = new FileOutputStream("/opt/module/azkaban/output.txt");
        fos.write("this is a java progress".getBytes());
        fos.close();
    }


    public static void main(String[] args) throws IOException {
        AzkabanTest azkabanTest = new AzkabanTest();
        azkabanTest.run();
    }
}

2)將java程序打成jar包,創(chuàng)建lib目錄,將jar放入lib內(nèi)

[AncientMing@bigdata111 azkaban]$ mkdir lib
[AncientMing@bigdata111 azkaban]$ cd lib/
[AncientMing@bigdata111 lib]$ ll

總用量 4
-rw-rw-r--. 1 AncientMing AncientMing 3355 10月 18 20:55 azkaban-0.0.1-SNAPSHOT.jar
3)編寫job文件

[AncientMing@bigdata111 jobs]$ vi azkabanJava.job
#azkabanJava.job
type=javaprocess
java.class=AzkabanTest(全類名)
classpath=/opt/module/azkaban/lib/*

4)將job文件打成zip包

[AncientMing@bigdata111 jobs]$ zip azkabanJava.zip azkabanJava.job 
  adding: azkabanJava.job (deflated 19%)

5)通過azkaban的web管理平臺創(chuàng)建project并上傳job壓縮包,啟動執(zhí)行該job

[AncientMing@bigdata111 azkaban]$ cat /opt/module/azkaban/output.txt 

3.3 HDFS操作任務(wù)
1)創(chuàng)建job描述文件

[AncientMing@bigdata111 jobs]$ vi hdfs.job
#hdfs job
type=command
command=/opt/module/hadoop-2.8.4/bin/hadoop fs -mkdir /azkaban

2)將job資源文件打包成zip文件

[AncientMing@bigdata111 jobs]$ zip fs.zip fs.job 
  adding: fs.job (deflated 12%)

3)通過azkaban的web管理平臺創(chuàng)建project并上傳job壓縮包
4)啟動執(zhí)行該job
5)查看結(jié)果

3.4 mapreduce任務(wù)
mapreduce任務(wù)依然可以使用azkaban進行調(diào)度
創(chuàng)建job描述文件,及mr程序jar包

[AncientMing@bigdata111 jobs]$ vim mapreduce.job
#mapreduce job
type=command
command=/opt/module/hadoop-2.8.4/bin/hadoop jar /opt/module/hadoop-2.8.4/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.4.jar wordcount /wordcount/input /wordcount/output

將所有job資源文件打到一個zip包中

[AncientMing@bigdata111 jobs]$ zip mapreduce.zip mapreduce.job 
  adding: mapreduce.job (deflated 43%)

3)在azkaban的web管理界面創(chuàng)建工程并上傳zip包
4)啟動job
5)查看結(jié)果
3.5 Hive腳本任務(wù)
1)創(chuàng)建job描述文件和hive腳本
(1)Hive腳本:student.sql

[AncientMing@bigdata111 jobs]$ vim student.sql

use default;
drop table student;
create table student(id int, name string)
row format delimited fields terminated by '\t';
load data local inpath '/opt/module/datas/student.txt' into table student;
insert overwrite local directory '/opt/module/datas/student'
row format delimited fields terminated by '\t'
select * from student;
(2)Job描述文件:hive.job

[AncientMing@bigdata111 jobs]$ vim hive.job
#hive job
type=command
command=/opt/module/hive/bin/hive -f /opt/module/azkaban/jobs/student.sql

將所有job資源文件打到一個zip包中
3)在azkaban的web管理界面創(chuàng)建工程并上傳zip包
4)啟動job
5)查看結(jié)果
[AncientMing@bigdata111 student]$ cat /opt/module/datas/student/000000_0

下一篇:102-BigData-30HBase

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

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