Spark在Windows下运行,本地提交sp…

【问题】Spark在windows能跑集群模式吗?
我认为是可以的,但是需要详细了解cmd命令行的写法。目前win下跑spark的单机模式是没有问题的。

【关键点】spark启动机制容易被windows的命令行cmd坑
  1、带空格、奇怪字符的安装路径,cmd不能识别。最典型的坑就是安装在Program Files文件夹下的程序,因为 Program和Files之间有个空格,所以 cmd竟不能识别。之前就把JDK安装在了Program Files下面,然后启动spark的时候,总是提示我找不到JDK。我明明配置了环境变量了啊?这就是所谓了《已经配置环境变量,spark 仍然找不到Java》的错误问题。至于奇怪的字符,如感叹号!,我经常喜欢用来将重要的文件夹排在最前面,但cmd命令提示符不能识别。

  2、是否需要配置hadoop的路径的问题——答案是需要用HDFS或者yarn就配,不需要用则不需配置。目前大多数的应用场景里面,Spark大规模集群基本安装在Linux服务器上,而自己用windows跑spark的情景,则大多基于学习或者实验性质,如果我们所要读取的数据文件从本地windows系统的硬盘读取(比如说d:\data\ml.txt),基本上不需要配置hadoop路径。我们都知道,在编spark程序的时候,可以指定spark的启动模式,而启动模式有这么三中(以python代码举例):
   (2.1)本地情况,conf = SparkConf().setMaster("local[*]") ——>也就是拿本机的spark来跑程序
   (2.2)远程情况,conf = SparkConf().setMaster("spark://remotehost:7077") ——>远程spark主机
   (2.3)yarn情况,conf = SparkConf().setMaster("yarn-client") ——>远程或本地 yarn集群代理spark
针对这3种情况,配置hadoop安装路径都有什么作用呢?(2.1)本地的情况,直接拿本机安装的spark来运行spark程序(比如d:\spark-1.6.2),则配不配制hadoop路径取决于是否需要使用hdfs。java程序的情况就更为简单,只需要导入相应的hadoop的jar包即可,是否配置hadoop路径并不重要。(2.2)的情况大体跟(2.1)的情况相同,虽然使用的远程spark,但如果使用本地数据,则运算的元数据也是从本地上传到远程spark集群的,无需配置hdfs。而(2.3)的情况就大不相同,经过我搜遍baidu、google、bing引擎,均没找到SparkConf直接配置远程yarn地址的方法,唯一的一个帖子介绍可以使用yarn://remote:8032的形式,则会报错“无法解析 地址”。查看Spark的官方说明, Spark其实是通过hadoop路径下的etc\hadoop文件夹中的配置文件来寻找yarn集群的:
Ensure that HADOOP_CONF_DIR or YARN_CONF_DIR points to the directory which contains the (client side) configuration files for the Hadoop cluster. These configs are used to write to HDFS and connect to the YARN ResourceManager.
——http://spark.apache.org/docs/1.6.2/running-on-yarn.html
  因此, 需要使用yarn来运行spark的情况,在spark那 配置好hadoop的目录就 尤为重要。后期经过虚拟机的验证,表明,只要windows本地配置的host地址等信息与linux服务器端相同(注意应更改hadoop-2/etc/hadoop 下各种文件夹的配置路径,使其与windows本地一致),是可以直接在win下用yarn-client提交spark任务到远程集群的。参考的spark-env.cmd(注意是cmd而不是sh,需要自己在spark\conf文件夹下建立这个文件)配置如下:
set HADOOP_HOME=D:\hadoop-2.7.2test
set HADOOP_CONF_DIR=D:\hadoop-2.7.2test\etc\hadoop
set SPARK_YARN_USER_ENV="CLASSPATH=D:\hadoop-2.7.2test\etc\hadoop"
set SPARK_MASTER_HOST=bigmaster
set SPARK_WORKER_CORES=2
set SPARK_WORKER_MEMORY=1g

  3、是否需要配置环境变量的问题,若初次配置,可以考虑在IDE里面配置,或者在程序本身用setProperty函数进行配置。因为配置windows下的hadoop、spark环境是个非常头疼的问题,有可能路径不对而导致无法找到相应要调用的程序。待实验多次成功率提高以后,再直接配置windows的全局环境变量不迟。

  4、使用Netbeans这个IDE的时候,有遇到Netbeans不能清理构建的问题。原因,极有可能是导入了重复的库,spark里面含有hadoop包,记得检查冲突。同时,在清理构建之前,记得重新编译一遍程序,再进行清理并构建。

  5、经常遇到WARN YarnClusterScheduler: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources资源不足无法运行的问题,添加conf.set("spark.executor.memory", "512m");语句进行资源限制。先前在虚拟机跑spark,由于本身机子性能不高,给虚拟机设置的内存仅仅2G,导致hadoop和spark双开之后系统资源严重不足。因此可以缩小每个executor的运算规模。其他资源缺乏问题的解决方法参考 http://blog.sina.com.cn/s/blog_4b1452dd0102wyzo.html










你可能感兴趣的:(【C,Java与网络编程】)