原文地址:

https://blog.csdn.net/jiangpeng59/article/details/72867368

作者:PJ-Javis
来源:CSDN

------------------------------------------------------------------------------------------------------

1.实验环境

Centos7+Python2.7+Java8+Spark1.6+Hadoop2.7+Tensorflow0.12.1


Spark和Hadoop的集群搭建网上教程比较多,这里以最简洁的方法配置集群,针对tensorflow添加的额外配置,我会进行强调(其实地上本没有坑,跌的人多了,也便成了Keng)

1>系统环境环境变量

  1. export JAVA_HOME=/hadoop/jdk1.8.0_65
  2. export HADOOP_HOME=/hadoop/hadoop-2.7.0
  3. export SPARK_HOME=/hadoop/spark-1.6.0
  4. export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$SPARK_HOME/bin
  5. CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

在/etc/profile或者~/.bashrc中配置都行,CLASSPATH不能少(Keng1)

2>hadoop集群

需修改的配置文件都在$HADOOP_HOME/hadoop-2.7.0/etc/hadoop目录下

(1)修改hadoop-env.sh 文件

  1. export JAVA_HOME=/hadoop/jdk1.8.0_65

(2)修改core-site.xml

  1. <configuration>
  2. <property>
  3. <name>fs.defaultFS</name>
  4. <value>hdfs://master:9000</value>
  5. </property>
  6. <property>
  7. <name>hadoop.tmp.dir</name>
  8. <value>/hadoop/hadoop-2.7.0/tmp</value>
  9. </property>
  10. </configuration>

注意这里我把hdfs的namenode也设置在master节点上,hadoop.tmp.dir为hadoop的绝对路径

(3)修改文件hdfs-site.xml

  1. <configuration>
  2. <property>
  3. <name>dfs.replication</name>
  4. <value>2</value>
  5. </property>
  6. <property>
  7. <name>dfs.namenode.name.dir</name>
  8. <value>/hadoop/hadoop-2.7.0/dfs/name</value>
  9. </property>
  10. <property>
  11. <name>dfs.datanode.data.dir</name>
  12. <value>/hadoop/hadoop-2.7.0/dfs/data</value>
  13. </property>
  14. </configuration>

(4)修改slaves文件,配置DataNode节点地址

这里的hosts我已经配置好,所以输入你对应的hostname就行了

  1. slave01
  2. slave02
  3. slave03

(5)格式化namenode并启动hdfs

  1. hdfs namenode -format
  2. $HADOOP_HOME/sbin/start-dfs.sh

3>Spark集群

Spark集群Standalone的配置非常简单,修改2个文件即可,在此之前记得重命名去掉template

(1)配置spark-env.sh

  1. export JAVA_HOME=/hadoop/jdk1.8.0_65
  2. export HADOOP_CONF_DIR=/hadoop/hadoop-2.7.0/etc/hadoop
  3. export HADOOP_HDFS_HOME=/hadoop/hadoop-2.7.0
  4. SPARK_MASTER_IP=master
  5. SPARK_WORKER_CORES=4
  6. SPARK_WORKER_MEMORY=12G
  7. SPARK_EXECUTOR_MEMORY=8G

核数和内存根据自己的机器进行设置,环境变量HADOOP_CONF_DIR和HADOOP_HDFS_HOME不能少(Keng2)

(2)配置slaves

  1. slave01
  2. slave02
  3. slave03

(3)启动spark集群

  1. $SPARK_HOME/sbin/start-all.sh

Worker Id     Cores     Memory
worker1     4 (0 Used)     12.0 GB (0.0 B Used)
worker2     4 (0 Used)     12.0 GB (0.0 B Used)
worker3     4 (0 Used)     12.0 GB (0.0 B Used)

集群总共3个worker-instance,每个worker4核12G,总12核,所有的环境配置均和master节点一致(Keng3)

2.Tensorflow安装

雅虎目前开源的框架是基于python2.7和Tensorflow0.12.1的,目前Tensorflow版本为1.2,但是考虑到兼容性,我们还是使用推荐的版本进行测试。

安装Tensorflow0.12.1

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

测试tf,无异常说明安装成功

  1. import tensorflow as tf

3.下载TensorflowOnSpark源码

  1. git clone https://github.com/yahoo/TensorFlowOnSpark.git
  2. cd TensorFlowOnSpark
  3. export TFoS_HOME=$(pwd)

这里使用git进行下载,最后我会所有用到资源的百度云链接。顺便提一句,TensorflowOnSpark最近好像更新了,但是指导文档貌似有点问题,下面会进行说明。

  1. [root@master TensorFlowOnSpark]# ls
  2. examples LICENSE README.md scripts setup.cfg setup.py tensorflow tensorflowonspark tfspark.zip

下载成功后,你会得到类似上面的文件夹,tfspark.zip是我们生成的python库文件,之后提交Spark的时候用到,其就是把tensorflowonspark所有文件进行了打包,在TensorFlowOnSpark目录运行如下的命令进行打包(Keng4)

  1. zip -r tfspark.zip tensorflowonspark/*

Spark集群测试

1>转换MNIST数据文件

  1. ${SPARK_HOME}/bin/spark-submit \
  2. --master=local[*] \
  3. ${TFoS_HOME}/examples/mnist/mnist_data_setup.py \
  4. --output examples/mnist/csv \
  5. --format csv

该命令的功能是把之前下载的.gz文件转换为对应的scv文件,网上有人说要修改源码才能正常运行,能偷懒的地方绝不放过。可以先看下mnist_data_setup.py的源码

  1. def writeMNIST(sc, input_images, input_labels, output, format, num_partitions):
  2. """Writes MNIST image/label vectors into parallelized files on HDFS"""
  3. # load MNIST gzip into memory
  4. with open(input_images, 'rb') as f:
  5. images = numpy.array(mnist.extract_images(f))
  6. imageRDD = sc.parallelize(images.reshape(shape[0], shape[1] * shape[2]), num_partitions)
  7.  
  8. if not args.read:
  9. # Note: these files are inside the mnist.zip file
  10. writeMNIST(sc, "mnist/train-images-idx3-ubyte.gz", "mnist/train-labels-idx1-ubyte.gz", args.output + "/train", args.format, args.num_partitions)
  11. writeMNIST(sc, "mnist/t10k-images-idx3-ubyte.gz", "mnist/t10k-labels-idx1-ubyte.gz", args.output + "/test", args.format, args.num_partitions)

使用python的IO流读取gz文件数据,显然gz文件肯定本地而非hdfs上,因此为了兼容源码,可以把mnist放在$PARK_HOME/bin下,然后使用本地模式进行数据转换即可

里面的内容和之前tensorflow介绍的一样是一个[,28*28]的向量,这里就是784个数为一行。

2>训练模型

  1. ${SPARK_HOME}/bin/spark-submit \
  2. --master=spark://master:7077 \
  3. --conf spark.executorEnv.LD_LIBRARY_PATH="${JAVA_HOME}/jre/lib/amd64/server" \
  4. --conf spark.executorEnv.CLASSPATH="$($HADOOP_HOME/bin/hadoop classpath --glob):${CLASSPATH}" \
  5. --py-files ${TFoS_HOME}/examples/mnist/spark/mnist_dist.py,${TFoS_HOME}/tfspark.zip \
  6. --conf spark.cores.max=12 \
  7. --conf spark.task.cpus=4 \
  8. ${TFoS_HOME}/examples/mnist/spark/mnist_spark.py \
  9. --cluster_size 3 \
  10. --images examples/mnist/csv/train/images \
  11. --labels examples/mnist/csv/train/labels \
  12. --format csv \
  13. --mode train \
  14. --model mnist_model

这里是个天Keng,
-No.1_作者更新git,在指导文档中居然没有再提及tfspark.zip,这叫我这个Python菜鸟情何以堪
-No.2_因为本人的Spark集群和作者的不一样,这里建议设置spark.cores.max(集群总核数)和spark.task.cpus(worker节点分配核数)满足

否则会出现无尽等待的情况:

  1. 2017-06-05 09:20:06,132 INFO (MainThread-23875) waiting for 1 reservations
  2. ..........

-No.3_这个Keng有点深,之前不知道是什么原因,执行命后会出现卡住的情况,百度到如下解决方案:

  1. 需要改一下mnist_dist.py的第109行,把logdir=logdir 改成 logdir=None

虽然解决了卡主的情况,但是训练完成后,不知道mnist_model去哪了?本地和hdfs都找不到,继续执行测试集,发现准确度几乎是0%(⊙﹏⊙)…之后查看worker的error日志,发现该信息一直都存在

  1. INFO:tensorflow:Waiting for model to be ready. Ready_for_local_init_op: None, ready: Variables not initialized: hid_w, hid_b, sm_w, sm_b, Variable, hid_w/Adagrad, hid_b/Adagrad, sm_w/Adagrad, sm_b/Adagrad
  2. 2017-06-05 05:00:55,324 INFO (MainThread-31600) Waiting for model to be ready. Ready_for_local_init_op: None, ready: Variables not initialized: hid_w, hid_b, sm_w, sm_b, Variable, hid_w/Adagrad, hid_b/Adagrad, sm_w/Adagrad, sm_b/Adagrad

最终在github上找到了解决方法,原来python在写hdfs文件的时候,找不到对应的jar包,在提交的时候添加如下的配置信息

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

最终可以解决卡住的情况,终于在hdfs上面和model相遇了O(∩_∩)O~

3>模型测试

如此多的Keng 做铺垫,测试的时候终于一气呵成了!

  1. ${SPARK_HOME}/bin/spark-submit \
  2. --master spark://master:7077 \
  3. --conf spark.executorEnv.LD_LIBRARY_PATH="${JAVA_HOME}/jre/lib/amd64/server" \
  4. --conf spark.executorEnv.CLASSPATH="$($HADOOP_HOME/bin/hadoop classpath --glob):${CLASSPATH}" \
  5. --py-files ${TFoS_HOME}/tfspark.zip,${TFoS_HOME}/examples/mnist/spark/mnist_dist.py \
  6. --conf spark.cores.max=12 \
  7. --conf spark.task.cpus=4 \
  8. --conf spark.executorEnv.JAVA_HOME="$JAVA_HOME" \
  9. ${TFoS_HOME}/examples/mnist/spark/mnist_spark.py \
  10. --cluster_size 3 \
  11. --images examples/mnist/csv/test/images \
  12. --labels examples/mnist/csv/test/labels \
  13. --mode inference \
  14. --format csv \
  15. --model mnist_model \
  16. --output predictions

部分结果如下:

  1. [root@slave01 ~]# hadoop fs -cat /user/root/predictions/part-00000
  2. 2017-06-05T05:48:00.385513 Label: 7, Prediction: 7
  3. 2017-06-05T05:48:00.385574 Label: 2, Prediction: 2
  4. 2017-06-05T05:48:00.385591 Label: 1, Prediction: 1
  5. 2017-06-05T05:48:00.385625 Label: 0, Prediction: 0
  6. 2017-06-05T05:48:00.385639 Label: 4, Prediction: 4
  7. 2017-06-05T05:48:00.385653 Label: 1, Prediction: 1
  8. 2017-06-05T05:48:00.385667 Label: 4, Prediction: 4
  9. 2017-06-05T05:48:00.385680 Label: 9, Prediction: 9
  10. 2017-06-05T05:48:00.385697 Label: 5, Prediction: 6
  11. 2017-06-05T05:48:00.385711 Label: 9, Prediction: 9
  12. 2017-06-05T05:48:00.385724 Label: 0, Prediction: 0
  13. 2017-06-05T05:48:00.385736 Label: 6, Prediction: 6
  14. 2017-06-05T05:48:00.385749 Label: 9, Prediction: 9
  15. 2017-06-05T05:48:00.385762 Label: 0, Prediction: 0
  16. 2017-06-05T05:48:00.385775 Label: 1, Prediction: 1
  17. 2017-06-05T05:48:00.385788 Label: 5, Prediction: 5

解铃还须系铃人,问题来于Git解决于Git
tf百度资源:http://pan.baidu.com/s/1bpEhPHP

参考:
https://github.com/yahoo/TensorFlowOnSpark/issues/33

------------------------------------------------------------------------------------------------------

【转载】 TensorflowOnSpark:1)Standalone集群初体验的更多相关文章

  1. docker从零开始(四)集群初体验,docker-machine swarm

    介绍 在第三节中,选择了第二节中编写的应用程序,并通过将其转换为服务来定义它应如何在生产中运行,并生成五个应用实例 在本节中,将此应用程序部署到群集上,在多台计算机上运行它.多容器,多机应用程序通过连 ...

  2. Centos 7下VMware三台虚拟机Hadoop集群初体验

    一.下载并安装Centos 7 传送门:https://www.centos.org/download/    注:下载DVD ISO镜像 这里详解一下VMware安装中的两个过程 网卡配置 是Add ...

  3. 【备忘:待完善】nsq集群初体验

    本机的一个节点及监控与管理后台 虚拟机中的一个节点 命令: [root@vm-vagrant nsq]# nsqd --lookupd-tcp-address=192.168.23.150:4160 ...

  4. (二)win7下用Intelij IDEA 远程调试spark standalone 集群

    关于这个spark的环境搭建了好久,踩了一堆坑,今天 环境: WIN7笔记本  spark 集群(4个虚拟机搭建的) Intelij IDEA15 scala-2.10.4 java-1.7.0 版本 ...

  5. flink部署操作-flink standalone集群安装部署

    flink集群安装部署 standalone集群模式 必须依赖 必须的软件 JAVA_HOME配置 flink安装 配置flink 启动flink 添加Jobmanager/taskmanager 实 ...

  6. spark使用idea以client模式提交应用到standalone集群

    使用idea以client方式提交代码到standalone集群非常简单. 1.首先有一个部署好且已经启动的standalone集群 --------------------------------- ...

  7. spark standalone集群部署 实践记录

    本文记录了一次搭建spark-standalone模式集群的过程,我准备了3个虚拟机服务器,三个centos系统的虚拟机. 环境准备: -每台上安装java1.8 -以及scala2.11.x (x代 ...

  8. 04、Spark Standalone集群搭建

    04.Spark Standalone集群搭建 4.1 集群概述 独立模式是Spark集群模式之一,需要在多台节点上安装spark软件包,并分别启动master节点和worker节点.master节点 ...

  9. Standalone 集群部署

    Spark中调度其实是分为两个层级的,即集群层级的资源分配和任务调度,以及任务层级的任务管理.其中集群层级调度是可配置的,Spark目前提供了Local,Standalone,YARN,Mesos.任 ...

随机推荐

  1. 01:云计算三种服务模式SaaS、PaaS和IaaS

    1.1 云计算 1.什么是云计算 1. 云计算服务是指将大量用网络连接的计算资源统一管理和调度,构成一个计算资源池向用户按需服务. 2. 用户通过网络以按需.易扩展的方式获得所需资源和服务(资源包括网 ...

  2. Tomcat的overview界面说明

    Tomcat的overview界面说明 一.Tomcat的overview界面 双击或者open,进入Tomcat的overview界面, 一般情况workspace的子路径为.metadata.pl ...

  3. oracle substr函数

    //截取下划线后的字符串 select substr('GY_272',instr('GY_272', '_', -1, 1)+1)   from dual select substr('GY_272 ...

  4. BZOJ5487: [Usaco2018 Dec]Cowpatibility

    Description 研究证明,有一个因素在两头奶牛能否作为朋友和谐共处这方面比其他任何因素都来得重要--她们是不是喜欢同 一种口味的冰激凌!Farmer John的N头奶牛(2≤N≤50,000) ...

  5. Configuration in ASP.NET Core(未完,待续)

    Configuration in ASP.NET Core App configuration in ASP.NET Core is based on key-value pairs establis ...

  6. wrk 安装使用

    ==================== 安装 ====================https://github.com/wg/wrk/wiki sudo yum -y groupinstall ...

  7. echarts4的学习

    echarts的学习 1.echarts的全解注释.https://www.2cto.com/kf/201708/665624.html ### 2.从echarts3开始学习echarts源码.ht ...

  8. vnpy官网说明文档网址

    接触VNPY一年多,一直对作者设计原理和思想有所困惑.发一篇vnpy官网的说明文档,便于以后理解项目代码. http://www.vnpy.org/archives.html

  9. Mysql增量恢复

    mysqldump增量恢复何时需要使用备份的数据? 备份最牛逼的层次,就是永远都用不上备份.--老男孩 不管是逻辑备份还是物理备份,备份的数据什么时候需要用?===================== ...

  10. 中国历史人物传记数据库 CBDB 若干表简介

    ''' 推荐使用SQLite版本的CBDB数据库 推荐使用SQlite Studio进行数据库的操作 免费,可视化操作,轻量级应用,无需配置,学习扩展性好,非常适合广大历史系学生. ''' 一 人物基 ...