如何安裝Spark & TensorflowOnSpark

對的,你沒看錯,這是我的一條龍服務,我在入坑填坑無數之後終於成功搭建起了Spark和TensorflowOnSpark的運行環境,併成功運行了示例程序(大概就是手寫識別的訓練和識別吧)。

安裝JAVA和Hadoop

這裏提供一個很好的教程,就是又好用,又好看的教程。
http://www.powerxing.com/install-hadoop/
按照這個教程來,基本上就沒有太多坑地完成安裝。不過也要注意一些點。

  1. spark從master發送命令的時候好像是按照路徑尋找文件,因此你一定一定要把集羣上所有的計算機的用戶名都配置成一樣的,比如我的都叫ubuntu,而文中的都叫hadoop,這裏你要注意,如果你不跟着教程也叫hadoop的話,注意識別裏面有一些命令或者路徑你是不能直接複製的,而是把裏面的hadoop改成你的用戶名,比如在僞分佈式配置core-site.xml的時候裏面路徑,你要改成你的實際路徑纔可以。
  2. 就是在按照教程配置了JAVA_HOME之後還會出現找不到JAVA_HOME的情況,應該修改hadoop/etc/hadoop/hadoop-env.sh中的JAVA_HOME的內容爲絕對路徑即可。
    2.另外那個ssh免密登錄可以不用這個,因爲要搭建的是真集羣的,所以這個用不着,搭好了再告訴你。這裏如果不設置的話在啓動hadoop的時候可能會報錯
  3. 在分佈式下,可能會出現這種很奇怪的情況:Live nodes只有一個(應該有倆),而且你每次刷新竟然都不一樣。這樣的解決方法是修改hdfs-site.xml,講data.dir改成不一樣的就可以了。
  4. 集羣管理器如果是新手的話建議直接使用standalone模式(如果你不知道啥是集羣管理器的話,那就更這麼建議了[微笑]),也就是spark自帶的集羣管理器,這就意味着上邊那個教程裏的“啓動yarn”這一節你就完全可以跳過了。
  5. 然後就沒什麼坑了,bulabula配置好,你就擁有的僞分佈式的Hadoop了,你就已經向spark邁進了一大步了。

    上面那個是僞分佈式的搭建,如果是想要真的分佈式的話(分佈式就是多臺計算機的意思啦),需要看一下這個教程
    https://my.oschina.net/jackieyeah/blog/657750
    照着這個教程完全修改一波,而且是每個計算機都要做相同的修改,另外這裏有個小坑(也坑了我一晚上),就是如果按照最上面那個教程裏搭僞分佈式的話,core-site.xml這個文件的這個屬性
    要從localhost:9000改成master:9000

         <property>
             <name>fs.defaultFS</name>
             <value>hdfs://master:9000</value>
        </property>

安裝scala和Spark

搭建好了上邊的來我們進行下一個教程[微笑]
1. 安裝scala最好選擇一個2.10.X,這樣對spark支持比較好,不會出現一些幺蛾子。這有個教程,應該是可以的http://www.runoob.com/scala/scala-install.html
2. 安裝spark大概是這裏面最簡單的事了吧點這裏下載spark。鑑於我們已經安裝好了hadoop,所以我們就下載一個不需要hadoop的spark包,就是這個with user-provided Hadoop這個

我用的是1.6.0好像大家用這個的比較多,最新的已經到2.1.x了。
解壓到你想安裝的目錄

sudo tar -zxf ~/下載/spark-1.6.0-bin-without-hadoop.tgz -C /usr/local/
cd /usr/local
sudo mv ./spark-1.6.0-bin-without-hadoop/ ./spark
sudo chown -R hadoop:hadoop ./spark          # 此處的 hadoop 爲你的用戶名

之後很重點的一步是修改spark-env.sh的內容,好像要改好多好多。。。

cd /usr/local/spark
cp ./conf/spark-env.sh.template ./conf/spark-env.sh
vim conf/spark-enf.sh

這裏是我的spark-env.sh的一些配置

export HADOOP_HOME=/home/ubuntu/workspace/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

export HADOOP_HDFS_HOME=/home/ubuntu/workspace/hadoop

export SPARK_DIST_CLASSPATH=$(/home/ubuntu/workspace/hadoop/bin/hadoop classpath)

export JAVA_HOME=/home/ubuntu/workspace/jdk/
export SCALA_HOME=/home/ubuntu/workspace/scala

export SPARK_MASTER_IP=192.168.1.129
export SPARK_WORKER_MEMORY=1G

export SPARK_MASTER_PORT=7077
export SPARK_WORKER_CORES=1
export SPARK_WORDER_INSTANCES=2

export SPARK_EXECUTOR_INSTANCES=2

屬性不明白的可以打開spark-env.sh,裏面前面又好多註釋,講各種屬性的意思。(ps:這裏有個SPARK_DIST_CLASSPATH一定要照着改對,否則會運行不起來)
這是給力星大大的教程寫得很好。
http://www.powerxing.com/spark-quick-start-guide/
3. 分佈式spark部署
重點來了,當然,教程在這裏
https://my.oschina.net/jackieyeah/blog/659741
這裏好像沒什麼坑,但是好像我記得剛開始的時候別的機器上的worker老是啓動不起來,但是忘記是什麼原因了,可能是免密登錄沒設置還是怎麼的。
照着教程完成了之後,你就獲得了spark的集羣辣,撒花~(≧▽≦)/~

ps:這裏還有個搭建standalone集羣的簡單介紹,Spark的Standalone模式安裝部署

安裝TensorflowOnSpark

這個真是說難也難,說簡單真是巨簡單,因爲步驟github上已經寫得好好的了,但是,有些坑,確實會把人坑死的。
雅虎開源的TensorflowOnSpark
1. 啥?你說全是英文看不懂,好吧我也看不懂,不過你想安裝TensorflowOnSpark的話,應該拉到底點這裏的wiki site
選擇安裝TensorflowOnSpark
2. 由於前面說了,我們用的是自帶的standalone集羣管理器,所以,就點
standalone模式
3. 進入了教程之後,第一步複製粘貼,如果沒git請按照提示安裝git;
第二步不需要,因爲你安裝好了Spark了;第三步點進去那個instruction,或者你會發現你點不開(我就點不開。。。),你可以選擇這裏:tensorflow中文網。要注意的一點小坑是,在第三步的最後有一個測試

python ${TFoS_HOME}/tensorflow/tensorflow/examples/tutorials/mnist/mnist_with_summaries.py --data_dir ${TFoS_HOME}/mnist

如果你下載的是tensorflow1.x的版本,可能會有問題運行不出來,因此我下載的是0.12.1版本,啥,你問我怎麼下,就是教程裏的這句

 $ pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl

裏的0.5.0改成0.12.1就木有問題了。
還有就是那個mnist的數據集可能由於某些原因鏈接不上那個網址也下載不下來(我也是醬紫的。。。),可以到我的csdn上下載http://download.csdn.net/detail/fishseeker/9779536
4. 第四步就是啓動spark了,其實直接啓動就行了,底下那些亂七八糟的設置可以自行配置。
5. 第五步,把我坑成狗。。。需要像下面這麼改,而這個cv.py其實就是改了文件輸入的路徑,好像本來是在hdfs上,我給改成本地的路徑,噢,對了,這裏的輸出是輸出到hdfs上,所以一定要打開hdfs啊,否則就GG了。

${SPARK_HOME}/bin/spark-submit \
--master spark://master:7077 \
${TFoS_HOME}/examples/mnist/cv.py \
--output examples/mnist/csv \
--format csv

cv.py的改動就是把mnist_data_setup.py第132,133行調用writeMNIST的方法的參數改了。具體見下圖
修改前
改動後是這樣
修改後
這個代碼運行了之後去50070端口的hdfs查看你的文件就有了。
轉換後的文件
6. 第六步是train,就是用剛纔那個轉換的數據進行訓練模型,這裏也需要改一些東西

${SPARK_HOME}/bin/spark-submit \
--master spark://master:7077 \
--py-files ${TFoS_HOME}/tfspark.zip,${TFoS_HOME}/examples/mnist/spark/mnist_dist.py \
--conf spark.cores.max=4 \
--conf spark.task.cpus=2 \
--conf spark.executorEnv.JAVA_HOME="$JAVA_HOME" \
${TFoS_HOME}/examples/mnist/spark/mnist_spark.py \
--cluster_size 2 \
--images examples/mnist/csv/train/images \
--labels examples/mnist/csv/train/labels \
--format csv \
--mode train \
--model mnist_model

注意有幾個worker這個cluster_size就至少要設置成幾,spark.task.cpu的數量要大於等於worker的數量。雖然都設置好了,也看起來像跑起來了,但是會被卡住不動。這時需要進入8080端口裏看看worker的strerr,我這裏曾經報錯說沒有設置 HADOOP_HDFS_HOME,這個需要在spark-env.sh裏export一下,就設置成和HADOOP_HOME一樣就行了。這隻好了還是動,需要改一下mnist_spark.py的第109行,把logdir=logdir –>logdir=None(另外這裏119行也同樣改動,否則下一步識別的時候也會卡住)
7. 第七步的時候還是照常修改一些數(主要是我沒設置這些),然後改一下代碼。

${SPARK_HOME}/bin/spark-submit \
--master spark://master:7077 \
--py-files ${TFoS_HOME}/tfspark.zip,${TFoS_HOME}/examples/mnist/spark/mnist_dist.py \
--conf spark.cores.max=4 \
--conf spark.task.cpus=2 \
--conf spark.executorEnv.JAVA_HOME="$JAVA_HOME" \
${TFoS_HOME}/examples/mnist/spark/mnist_spark.py \
--cluster_size 2 \
--images examples/mnist/csv/test/images \
--labels examples/mnist/csv/test/labels \
--mode inference \
--format csv \
--model mnist_model \
--output predictions
  1. 然後你愉快地發現你的hdfs上有了識別後的結果了
    就像這樣(強迫症地切割了下圖片)
    最後運行結果
    然後你打開個就看見了和網站上差不多的美妙結果。

    ==============2017.4.15更新==================
    今天在運行程序的時候發生了莫名其妙的bug,主要症狀就是task會卡在某個地方不再進行了,點進去看詳細的task會發現是在某個slave上的某個task卡住了,調試無果。關機重啓之後再次運行不再卡頓,原因大概是系統要求的資源沒有達到,以後遇到這種情況,建議重新調小運行需要的cpu數量以及內存數量等資源配置選項再試試,實在不行就關機重啓,一般都可以解決

    ==============2017.7.28更新====================
    又踩到一個坑是,還是在識別的時候可能會卡住,可能是因爲其他的worker中的namenode忘記format了。
    另外還有識別的準確率很低的問題,可能是因爲python找不到Jar包了,使用以下方法可以:
    原來python在寫hdfs文件的時候,找不到對應的jar包,在提交的時候添加如下的配置信息

--conf spark.executorEnv.LD_LIBRARY_PATH="${JAVA_HOME}/jre/lib/amd64/server" \
--conf spark.executorEnv.CLASSPATH="$($HADOOP_HOME/bin/hadoop classpath --glob):${CLASSPATH}" 

這裏致謝評論區中的“她說巷尾的櫻花開了 2017-07-13 10:10發表 [回覆]“ 提供解決方法
相關鏈接:

利用IDEA查看和修改spark源碼
http://blog.csdn.net/fishseeker/article/details/63741265

修改spark源碼並編譯部署
http://blog.csdn.net/fishseeker/article/details/68957206

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章