对的,你没看错,这是我的一条龙服务,我在入坑填坑无数之后终于成功搭建起了Spark和TensorflowOnSpark的运行环境,并成功运行了示例程序(大概就是手写识别的训练和识别吧)。
这里提供一个很好的教程,就是又好用,又好看的教程。
http://www.powerxing.com/install-hadoop/
按照这个教程来,基本上就没有太多坑地完成安装。不过也要注意一些点。
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
搭建好了上边的来我们进行下一个教程微笑
我用的是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/
ps:这里还有个搭建standalone集群的简单介绍,Spark的Standalone模式安装部署
这个真是说难也难,说简单真是巨简单,因为步骤github上已经写得好好的了,但是,有些坑,确实会把人坑死的。
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。
${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查看你的文件就有了。
${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行也同样改动,否则下一步识别的时候也会卡住)
${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
然后你打开个就看见了和网站上差不多的美妙结果。
==============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源码
https://cloud.tencent.com/developer/article/1016232
修改spark源码并编译部署