Spark在Windows下的環(huán)境搭建

由于Spark是用Scala來寫的拐袜,所以Spark對Scala肯定是原生態(tài)支持的,因此這里以Scala為主來介紹Spark環(huán)境的搭建,主要包括四個步驟撰豺,分別是:JDK的安裝,Scala的安裝拼余,Spark的安裝污桦,Hadoop的下載和配置。為了突出"From Scratch"的特點(都是標題沒選好的緣故)匙监,所以下面的步驟稍顯有些啰嗦凡橱,老司機大可不必閱讀,直接跳過就好亭姥。

一.JDK的安裝與環(huán)境變量的設(shè)置

1.1 JDK的安裝

JDK(全稱是JavaTM Platform Standard Edition Development Kit)的安裝稼钩,下載地址是Java SE Downloads,一般進入頁面后达罗,會默認顯示一個最新版的JDK坝撑,如下圖所示,當(dāng)前最新版本是JDK 8粮揉,更為詳細具體的地址是Java SE Development Kit 8 Downloads


上圖中兩個用紅色標記的地方都是可以點擊的巡李,點擊進去之后可以看到這個最新版本的一些更為詳細的信息,如下圖所示:


首先扶认,這里主要包含有8u101和8u102這兩個版本侨拦,Java給出的官方說明是:

“Java SE 8u101 includes important security fixes. Oracle strongly recommends that all Java SE 8 users upgrade to this release. Java SE 8u102 is a patch-set update, including all of 8u101 plus additional features (described in the release notes). ”

也就是說Java推薦所有開發(fā)人員從以前的版本升級到JDK 8u101,而JDK 8u102則除了包括101的所有特性之外蝠引,還有一些其他的特性阳谍。對于版本的選擇,自行選擇就好了螃概,其實對于普通開發(fā)人員來說矫夯,體現(xiàn)不了太大的區(qū)別,我這里就是使用的JDK 8u101版本吊洼。

選好8u101版本后训貌,再選擇你的對應(yīng)開發(fā)平臺,由于我的機器是64位的冒窍,所以我這里選擇Windows64位的版本递沪。記得在下載之前,必須要接受上方的許可協(xié)議综液,在上圖中用紅色圈出款慨。
  
  除了下載最新版本的JDK,也可以在Oracle Java Archive下載到歷史版本的JDK谬莹,但官方建議只做測試用檩奠。
  
  JDK在windows下的安裝非常簡單桩了,按照正常的軟件安裝思路去雙擊下載得到的exe文件,然后設(shè)定你自己的安裝目錄(安裝目錄在設(shè)置環(huán)境變量的時候需要用到)即可埠戳。

1.2 環(huán)境變量的設(shè)置

接下來設(shè)置相應(yīng)的環(huán)境變量井誉,設(shè)置方法為:在桌面右擊【計算機】--【屬性】--【高級系統(tǒng)設(shè)置】,然后在系統(tǒng)屬性里選擇【高級】--【環(huán)境變量】整胃,然后在系統(tǒng)變量中找到“Path”變量颗圣,并選擇“編輯”按鈕后出來一個對話框,可以在里面添加上一步中所安裝的JDK目錄下的bin文件夾路徑名屁使,我這里的bin文件夾路徑名是:F:\Program Files\Java\jdk1.8.0_101\bin在岂,所以將這個添加到path路徑名下,注意用英文的分號“;”進行分割屋灌。這樣設(shè)置好后洁段,便可以在任意目錄下打開的cmd命令行窗口下運行

java -version

觀察是否能夠輸出相關(guān)java的版本信息,如果能夠輸出共郭,說明JDK安裝這一步便全部結(jié)束了祠丝。

全部流程如下圖所示(后續(xù)軟件安裝的系統(tǒng)變量設(shè)置都是這套流程):

1.3 一些題外話

這里講兩句題外話,各位看官不關(guān)心的話可以跳過這里除嘹,不影響后續(xù)的安裝步驟写半。
  在軟件安裝的時候,相信各位沒少遇到過環(huán)境變量和系統(tǒng)變量尉咕,所以這里就來扒一扒令人頭疼的PATH, CLASSPATHJAVA_HOME等參數(shù)的具體含義叠蝇。

1.3.1 環(huán)境變量、系統(tǒng)變量和用戶變量

  • 環(huán)境變量包括系統(tǒng)變量和用戶變量
  • 系統(tǒng)變量的設(shè)置針對該操作系統(tǒng)下的所有用戶起作用年缎;
  • 用戶變量的設(shè)置只針對當(dāng)前用戶起作用

如果對這些概念還不是特別熟悉的悔捶,建議先看完下面幾個點之后,再回過頭來看這三句話单芜。

1.3.2 PATH

也就是上一步設(shè)置的系統(tǒng)變量蜕该,告訴操作系統(tǒng)去哪里找到Java.exe的執(zhí)行路徑,當(dāng)你在命令行窗口冷不丁的敲上如下命令的時候洲鸠,

java -version

操作系統(tǒng)首先會一驚堂淡,What the hell does "java" mean? 不過吐槽歸吐槽,活還是得干扒腕,于是悠悠的記起來了蓋茨爸爸說過的三句話:

  1. 當(dāng)你看不懂命令行窗口中的一個命令的時候绢淀,你首先去你所在的當(dāng)前目錄下找找,是否有這個命令的.exe程序瘾腰?如果有皆的,那就用它來啟動執(zhí)行;
  2. 如果沒有蹋盆,千萬別放棄祭务,記得要去Path系統(tǒng)變量下的那些目錄下去找一找内狗,如果找到了怪嫌,啟動并執(zhí)行命令义锥;
  3. 如果上面兩個地方依然還沒找到,那你就撒個嬌岩灭,報個錯好了拌倍。

所以我們將JDK安裝目錄下的bin文件夾添加到Path系統(tǒng)變量的目的也就在這里,告訴操作系統(tǒng):如果在當(dāng)前目錄下找不到j(luò)ava.exe噪径,就去Path系統(tǒng)變量里的那些路徑下挨個找一找柱恤,直到找到j(luò)ava.exe為止。那為什么要設(shè)置bin文件夾找爱,而不是JDK安裝的根目錄呢梗顺?原因就在于根目錄下沒有java.exe啊,只有bin文件夾下才有啊喂......

如果只是在命令行窗口下運行一下java的命令车摄,那其實也可以不設(shè)置系統(tǒng)變量寺谤,只是每次在命令行窗口運行java的命令時,都必須帶上一長串路徑名吮播,來直接指定java.exe的位置变屁,如下所示。

C:\Users\weizierxu>F:\Program Files\Java\jdk1.8.0_101\bin\java.exe -version
'F:\Program' 不是內(nèi)部或外部命令意狠,也不是可運行的程序
或批處理文件粟关。

注意:這里報錯的原因并不是說直接指定java.exe的路徑名這種方式有問題,而是命令行下無法解析帶有空格的路徑名环戈,所以需要用到雙引號闷板,如下:

C:\Users\weizierxu>"F:\Program Files"\Java\jdk1.8.0_101\bin\java.exe -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)

1.3.3 CLASSPATH

CLASSPATH是在Java執(zhí)行一個已經(jīng)編譯好的class文件時,告訴Java去哪些目錄下找到這個class文件院塞,比如你的程序里用到某個Jar包(Jar包里的都是已經(jīng)編譯好的class文件)遮晚,那么在執(zhí)行的時候,Java需要找到這個Jar包才行迫悠,去哪找呢鹏漆?從CLASSPATH指定的目錄下,從左至右開始尋找(用分號區(qū)分開的那些路徑名)创泄,直到找到你指定名字的class文件艺玲,如果找不到就會報錯。這里做一個實驗鞠抑,就能明白具體是什么意思了饭聚。

  首先,我在F:\Program Files\Java目錄下搁拙,利用Windows自帶的記事本寫了一個類似于Hello World的程序秒梳,保存為testClassPath.java文件(注意后綴名得改成java)法绵,內(nèi)容如下:

public class testClassPath{
    public static void main(String[] args){
        System.out.println("Hello, this is a test on CLASSPATH!");
    }
}

然后,我將cmd的當(dāng)前目錄切換到(通過cd命令)F:\Program Files\Java目錄下酪碘,然后用javac命令來對這個.java文件進行編譯朋譬,如下圖所示:




從上圖中可以看到,javac命令可以正常使用(沒有任何輸出的就表明正確編譯了)兴垦,這是因為執(zhí)行該命令的javac.exe同樣存在于JDK安裝路徑下的bin目錄中徙赢,而這個目錄我們已經(jīng)添加到Path系統(tǒng)變量中去了,所以cmd能夠認識這個命令探越。這個時候可以看到F:\Program Files\Java目錄下多了一個testClassPath.class文件狡赐。不過運行這個class文件的時候,報錯了钦幔。這個時候枕屉,CLASSPATH就派上用場了,和1.2節(jié)中對Path系統(tǒng)變量設(shè)置的方法一樣鲤氢,這里在CLASSPATH(如果系統(tǒng)變量的列表中沒有CLASSPATH這個選項搀擂,那么點擊新建,然后添加路徑即可)中最后面添加上;.铜异,英文的分號表示和前面已有的路徑分割開哥倔,后面的小點.表示當(dāng)前目錄的意思。

這個時候記得要另起一個新的cmd窗口揍庄,然后利用cd命令切換到testClassPath.class所在目錄咆蒿,然后再去執(zhí)行,便可以成功得到結(jié)果了蚂子。

F:\Program Files\Java>java testClassPath
Hello, this is a test on CLASSPATH!

因此沃测,和Path變量不同的是,Java在執(zhí)行某個class文件的時候食茎,并不會有默認的先從當(dāng)前目錄找這個文件蒂破,而是只去CLASSPATH指定的目錄下找這個class文件,如果CLASSPATH指定的目錄下有這個class文件别渔,則開始執(zhí)行附迷,如果沒有則報錯(這里有去當(dāng)前目錄下找這個class文件,是因為當(dāng)前路徑通過.的方式哎媚,已經(jīng)添加到了CLASSPATH系統(tǒng)變量中)喇伯。

  上面講的指定CLASSPATH系統(tǒng)變量的方法,都是直接寫死在系統(tǒng)變量中的拨与,為了避免造成干擾(比如多個同名class文件存在于多個路徑中稻据,這些路徑都有添加到CLASSPATH系統(tǒng)變量中,由于在找class文件的時候买喧,是從左往右掃描CLASSPATH系統(tǒng)變量中的路徑的捻悯,所以在利用java testClassPath方法執(zhí)行的時候匆赃,運行的便是位置在CLASSPATH系統(tǒng)變量中最左邊的那個路徑中,對應(yīng)的class文件今缚,而這顯然不是我們想要的結(jié)果)算柳,因此在諸如Eclipse等等這些IDE中,并不需要人為手動設(shè)定CLASSPATH系統(tǒng)變量荚斯,而是只設(shè)定當(dāng)前程序的特定的CLASSPATH系統(tǒng)變量埠居,這樣便不會影響到其他程序的運行了。

1.3.4 JAVA_HOME

JAVA_HOME并不是Java本身所需要的參數(shù)事期,而是其他的一些第三方工具需要這個參數(shù)來配置它們自己的參數(shù),它存在的意義無非是告訴那些軟件纸颜,我的JDK安裝在這個目錄下兽泣,你如果要用到我的Java程序的話,直接來我這個目錄下找就好了胁孙,而JAVA_HOME就是JDK的安裝路徑名唠倦。比如我的JDK安裝在F:\Program Files\Java\jdk1.8.0_101目錄下(注意該目錄下的bin目錄,就是在1.3.2節(jié)里Path系統(tǒng)變量中要添加的值)涮较,那么JAVA_HOME里要添加的值便是F:\Program Files\Java\jdk1.8.0_101稠鼻,以后碰到類似HOME的系統(tǒng)變量,都是軟件的安裝目錄狂票。

二. Scala的安裝

首先從DOWNLOAD PREVIOUS VERSIONS下載到對應(yīng)的版本候齿,在這里需要注意的是,Spark的各個版本需要跟相應(yīng)的Scala版本對應(yīng)闺属,比如我這里使用的Spark 1.6.2就只能使用Scala 2.10的各個版本慌盯,目前最新的Spark 2.0就只能使用Scala 2.11的各個版本,所以下載的時候掂器,需要注意到這種Scala版本與Spark版本相互對應(yīng)的關(guān)系亚皂。我這里現(xiàn)在用的是Scala 2.10.6,適配Spark從1.3.0到Spark 1.6.2之間的各個版本国瓮。在版本頁面DOWNLOAD PREVIOUS VERSIONS選擇一個適合自己需要的版本后灭必,會進入到該版本的具體下載頁面,如下圖所示乃摹,記得下載二進制版本的Scala禁漓,點擊圖中箭頭所指,下載即可:

下載得到Scala的msi文件后峡懈,可以雙擊執(zhí)行安裝璃饱。安裝成功后,默認會將Scala的bin目錄添加到PATH系統(tǒng)變量中去(如果沒有肪康,和JDK安裝步驟中類似荚恶,將Scala安裝目錄下的bin目錄路徑撩穿,添加到系統(tǒng)變量PATH中),為了驗證是否安裝成功谒撼,開啟一個新的cmd窗口食寡,輸入scala然后回車,如果能夠正常進入到Scala的交互命令環(huán)境則表明安裝成功廓潜。如下圖所示:



如果不能顯示版本信息抵皱,并且未能進入Scala的交互命令行,通常有兩種可能性:

  • Path系統(tǒng)變量中未能正確添加Scala安裝目錄下的bin文件夾路徑名辩蛋,按照JDK安裝中介紹的方法添加即可呻畸。
  • Scala未能夠正確安裝,重復(fù)上面的步驟即可悼院。

三. Spark的安裝

Spark的安裝非常簡單伤为,直接去Download Apache Spark。有兩個步驟:

  • 選擇好對應(yīng)Hadoop版本的Spark版本据途,如下圖中所示绞愚;
  • 然后點擊下圖中箭頭所指的spark-1.6.2-bin-hadoop2.6.tgz,等待下載結(jié)束即可颖医。


這里使用的是Pre-built的版本位衩,意思就是已經(jīng)編譯了好了,下載來直接用就好熔萧,Spark也有源碼可以下載糖驴,但是得自己去手動編譯之后才能使用。下載完成后將文件進行解壓(可能需要解壓兩次)哪痰,最好解壓到一個盤的根目錄下遂赠,并重命名為Spark,簡單不易出錯晌杰。并且需要注意的是跷睦,在Spark的文件目錄路徑名中,不要出現(xiàn)空格肋演,類似于“Program Files”這樣的文件夾名是不被允許的抑诸。

解壓后基本上就差不多可以到cmd命令行下運行了。但這個時候每次運行spark-shell(spark的命令行交互窗口)的時候爹殊,都需要先cd到Spark的安裝目錄下蜕乡,比較麻煩,因此可以將Spark的bin目錄添加到系統(tǒng)變量PATH中梗夸。例如我這里的Spark的bin目錄路徑為D:\Spark\bin层玲,那么就把這個路徑名添加到系統(tǒng)變量的PATH中即可,方法和JDK安裝過程中的環(huán)境變量設(shè)置一致,設(shè)置完系統(tǒng)變量后辛块,在任意目錄下的cmd命令行中畔派,直接執(zhí)行spark-shell命令,即可開啟Spark的交互式命令行模式润绵。

四.HADOOP下載

系統(tǒng)變量設(shè)置后线椰,就可以在任意當(dāng)前目錄下的cmd中運行spark-shell,但這個時候很有可能會碰到各種錯誤尘盼,這里主要是因為Spark是基于Hadoop的憨愉,所以這里也有必要配置一個Hadoop的運行環(huán)境。在Hadoop Releases里可以看到Hadoop的各個歷史版本卿捎,這里由于下載的Spark是基于Hadoop 2.6的(在Spark安裝的第一個步驟中配紫,我們選擇的是Pre-built for Hadoop 2.6),我這里選擇2.6.4版本娇澎,選擇好相應(yīng)版本并點擊后笨蚁,進入詳細的下載頁面,如下圖所示趟庄,選擇圖中紅色標記進行下載,這里上面的src版本就是源碼伪很,需要對Hadoop進行更改或者想自己進行編譯的可以下載對應(yīng)src文件戚啥,我這里下載的就是已經(jīng)編譯好的版本,即圖中的hadoop-2.6.4.tar.gz文件锉试。



  
  下載并解壓到指定目錄猫十,然后到環(huán)境變量部分設(shè)置HADOOP_HOME為Hadoop的解壓目錄,我這里是F:\Program Files\hadoop呆盖,然后再設(shè)置該目錄下的bin目錄到系統(tǒng)變量的PATH下拖云,我這里也就是F:\Program Files\hadoop\bin,如果已經(jīng)添加了HADOOP_HOME系統(tǒng)變量应又,也可以用%HADOOP_HOME%\bin來指定bin文件夾路徑名宙项。這兩個系統(tǒng)變量設(shè)置好后,開啟一個新的cmd株扛,然后直接輸入spark-shell命令尤筐。

正常情況下是可以運行成功并進入到Spark的命令行環(huán)境下的,但是對于有些用戶可能會遇到空指針的錯誤洞就。這個時候盆繁,主要是因為Hadoop的bin目錄下沒有winutils.exe文件的原因造成的。這里的解決辦法是:

  • https://github.com/steveloughran/winutils 選擇你安裝的Hadoop版本號旬蟋,然后進入到bin目錄下油昂,找到winutils.exe文件,下載方法是點擊winutils.exe文件,進入之后在頁面的右上方部分有一個Download按鈕冕碟,點擊下載即可拦惋。
  • 下載好winutils.exe后,將這個文件放入到Hadoop的bin目錄下鸣哀,我這里是F:\Program Files\hadoop\bin架忌。
  • 在打開的cmd中輸入

F:\Program Files\hadoop\bin\winutils.exe chmod 777 /tmp/hive

這個操作是用來修改權(quán)限的。注意前面的`F:\Program Files\hadoop\bin`部分要對應(yīng)的替換成實際你所安裝的bin目錄所在位置我衬。

  經(jīng)過這幾個步驟之后叹放,然后再次開啟一個新的cmd窗口,如果正常的話挠羔,應(yīng)該就可以通過直接輸入`spark-shell`來運行Spark了井仰。
正常的運行界面應(yīng)該如下圖所示:<br>
![](http://upload-images.jianshu.io/upload_images/274100-fdd06e57470e32ed.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)<br>
從圖中可以看到,在直接輸入`spark-shell`命令后破加,Spark開始啟動俱恶,并且輸出了一些日志信息,大多數(shù)都可以忽略范舀,需要注意的是兩句話:

Spark context available as sc.
SQL context available as sqlContext.


`Spark context`和`SQL context`分別是什么合是,后續(xù)再講,現(xiàn)在只需要記住锭环,只有看到這兩個語句了聪全,才說明Spark真正的成功啟動了。

# 五. Python下的PySpark

  針對Python下的Spark辅辩,和Scala下的spark-shell類似难礼,也有一個PySpark,它同樣也是一個交互式的命令行工具玫锋,可以對Spark進行一些簡單的調(diào)試和測試蛾茉,和spark-shell的作用類似。對于需要安裝Python的來說撩鹿,這里建議使用Python(x,y)谦炬,它的優(yōu)點就是集合了大多數(shù)的工具包,不需要自己再單獨去下載而可以直接import來使用三痰,并且還省去了繁瑣的環(huán)境變量配置吧寺,下載地址是[Python(x,y) - Downloads](https://python-xy.github.io/downloads.html),下載完成后散劫,雙擊運行安裝即可稚机。因為本教程主要以Scala為主,關(guān)于Python的不做過多講解获搏。

# 六. 小結(jié)

  至此赖条,基本的Spark本地調(diào)試環(huán)境便擁有了失乾,對于初步的Spark學(xué)習(xí)也是足夠的。但是這種模式在實際的Spark開發(fā)的時候纬乍,依然是不夠用的碱茁,需要借助于一個比較好用的IDE來輔助開發(fā)過程。下一講就主要講解ItelliJ IDEA以及Maven的配置過程仿贬。
  
# 參考
- [PATH and CLASSPATH](http://https://docs.oracle.com/javase/tutorial/essential/environment/paths.html)(Oracle官方給出的一些關(guān)于Path和CLASSPATH的解釋纽竣,推薦)
- [Difference among JAVA_HOME,JRE_HOME,CLASSPATH and PATH](http://https://coderanch.com/t/600047/java/Difference-JAVA-HOME-JRE-HOME)
- [Java中設(shè)置classpath、path茧泪、JAVA_HOME的作用](http://http://www.cnblogs.com/echomyecho/p/3334617.html)
- [Why does starting spark-shell fail with NullPointerException on Windows?](http://stackoverflow.com/questions/32721647/why-does-starting-spark-shell-fail-with-nullpointerexception-on-windows)(關(guān)于如何解決啟動spark-shell時遇到的NullPointerException問題)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜓氨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子队伟,更是在濱河造成了極大的恐慌穴吹,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗜侮,死亡現(xiàn)場離奇詭異港令,居然都是意外死亡,警方通過查閱死者的電腦和手機锈颗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門顷霹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人击吱,你說我怎么就攤上這事泼返。” “怎么了姨拥?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長渠鸽。 經(jīng)常有香客問我叫乌,道長,這世上最難降的妖魔是什么徽缚? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任憨奸,我火速辦了婚禮,結(jié)果婚禮上凿试,老公的妹妹穿的比我還像新娘排宰。我一直安慰自己,他們只是感情好那婉,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布板甘。 她就那樣靜靜地躺著,像睡著了一般详炬。 火紅的嫁衣襯著肌膚如雪盐类。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音在跳,去河邊找鬼枪萄。 笑死,一個胖子當(dāng)著我的面吹牛猫妙,可吹牛的內(nèi)容都是我干的瓷翻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼割坠,長吁一口氣:“原來是場噩夢啊……” “哼齐帚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起韭脊,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤童谒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沪羔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饥伊,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年蔫饰,在試婚紗的時候發(fā)現(xiàn)自己被綠了琅豆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡篓吁,死狀恐怖茫因,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杖剪,我是刑警寧澤冻押,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站盛嘿,受9級特大地震影響洛巢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜次兆,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一稿茉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芥炭,春花似錦漓库、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至砰琢,卻和暖如春蘸嘶,著一層夾襖步出監(jiān)牢的瞬間良瞧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工训唱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褥蚯,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓况增,卻偏偏與公主長得像赞庶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子澳骤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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