window10下spark2.1.0单节点环境及开发环境搭建及运行全流程走通

来源:互联网 发布:js日期插件实现 编辑:程序博客网 时间:2024/06/05 20:02

作为一名初入spark编程的初级工程师,在工作中总是会有一些程序需要先在自己的spark环境下试跑,所以需要自己在自己电脑中安装自己的spark运行环境以及开发,方便用于调试,还可以时不时的测试一下API,玩一玩自己随手编的小程序,以便学习,因为开源的东西变化太快,总是需要你不断学习...最近在工作中就有这样的一个需求,而网上也没有最新的资源,抱着和大家分享一起学习的心态,从头到尾咱们来一遍!

首先啥也不说了,安装好JDK8和Scala2.11.8,JDK不得低于1.7,Scala则需要对应好自己选择的Spark的版本。版本选择如下:


大家注意“Note”它明确标识了这是基于scala2.11打包好的程序,如果大家想要使用别的版本scala打包spark,下载sapark源码使用SBT打包即可。

作为standalone单节点spark,不必太复杂,只要能运行spark程序、调试以及学习源码就行,所以一切最简:直接在window10上搭建最简单的spark环境以及开发环境(linux固然好,其实搭建起来也不慢,更可以练手,大家可以去了解),我的语言选择如下:


(偷个懒,去听ASMR了,最近真的累,后续会在明天周末更新完毕,请不要骂我)。

这是基本的语言环境,然后就要配置maven了。去官网下载maven,解压(不要去修改任何东西)以后并配置路径(配置路径相信大家都会,在window环境变量里面配置即可)。为什么下载maven,因为现在开发起来,maven便于管理,代码是代码,jar是jar包,在不同的directory下,就像MVC结构清晰简单。下载maven并配置完以后,大家最好给maven目录的conf目录中的settings.xml修改一下,我修改的如下:


做这个修改的原因是下载jar速度太慢,所以我使用了阿里的镜像,去阿里云下载,当然上面还有proxy,大家可以去设置proxy也会变快,一般在公司,大家都会修改后者,便于监控工作人员下载了什么东西,不修改镜像的话下载的是在github上托管的jar,这些服务器在国外,所以这是有必要修改settings.xml的原因。


设置好maven以后,看看maven能不能用:以管理员身份(我的电脑必须以管理员身份打开,才能使用java、scala等命令,个人不一样)打开cmd,看到这些信息,就知道maven可以使用了。大家不要慌,讲道理我第一眼看到这么多error就傻了,其实仔细看看,没有什么!

  基本的语言环境和maven配置好了,现在就去spark官网http://spark.apache.org/downloads.html下载spark,我选择是spark-2.1.0-bin-hadoop2.7最新版本。解压以后,和之前一样配置好环境变量,那么现在就可以在cmd中开启我们的spark了:

这个时候看cmd上显示的log,会发现有很多东西在显示,我们去spark的conf中修改一下log输出的级别:


如蓝色所示,复制log4j.properties.template文件,变为log4j.properties并将级别变为ERROR,由于显示error:not found:spark import spark.sql,在系统这个盘(我的是C盘)的根目录下,发现有一个tmp目录,将这个目录权限修改为rwx,还要指定HADOOP_HOME的环境变量:即下载对应版本的hadoop的winutils(这个.exe文件相当于指定我们的运行环境是window,解决诸如环境变量读取等等问题,举一个最简单的例子:如linux下变量是$美元符,而其实window的转义符是%X%,X对应环境变量名字),链接是https://github.com/steveloughran/winutils/tree/master/hadoop-2.7.1/bin,个人user变量是HADOOP_HOME,系统变量则在path后加上%HADOOP_HOME%\bin,值得提出的是直接在path后面加全路径,是不能识别的这个运行环境的,这个configuration应该写死了,除非去修改。再次输入spark-shell,看看log:


再没有之前那么多log,也没有那么多错误了,我已经修改过这个目录所有用户的权限到rwx了,并将tmp移至winutils.exe同级目录下,还是显示我的spark.sql有问题,还好这个问题不是那么关键,我们暂时不用spark.hive,那么稍后去解决。那么我们来搭建一下spark的开发环境,并写下我们的第一个程序,决定我们的window版standalone的spark能不能跑程序(毕竟只有程序能跑才说明我们成功了),实践是检查理论的唯一标准。每一步过程如下:

1、选择样板


2、工程名


3、指定之前我们设定好的maven的settings.xml,和jar下载以后存储的路径



接下来一路next就行,直到进入工程。


在File下选择Project Structure,在libraries加一下scala的SDK。接着我们import一下pom.xml即可开发scala文件了。pom.xml修改(参考官方maven的配置,链接是http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.spark%22)如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>nju_mc.test</groupId>  <artifactId>nju_mc</artifactId>  <version>1.0-SNAPSHOT</version>  <inceptionYear>2008</inceptionYear>  <properties>    <scala.version>2.11.8</scala.version>    <scala.binary.version>2.11</scala.binary.version>    <spark.community.version>2.1.0</spark.community.version>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    <project.reproting.outputEncoding>UTF-8</project.reproting.outputEncoding>    <java.version>1.8</java.version>  </properties>  <repositories>    <repository>      <id>scala-tools.org</id>      <name>Scala-Tools Maven2 Repository</name>      <url>http://scala-tools.org/repo-releases</url>    </repository>  </repositories>  <pluginRepositories>    <pluginRepository>      <id>scala-tools.org</id>      <name>Scala-Tools Maven2 Repository</name>      <url>http://scala-tools.org/repo-releases</url>    </pluginRepository>  </pluginRepositories>  <dependencies>    <dependency>      <groupId>org.apache.maven.plugins</groupId>      <artifactId>maven-site-plugin</artifactId>      <version>3.3</version>    </dependency>    <dependency>      <groupId>org.scala-lang</groupId>      <artifactId>scala-library</artifactId>      <version>${scala.version}</version>    </dependency>    <!--<dependency>-->    <!--<groupId>junit</groupId>-->    <!--<artifactId>junit</artifactId>-->    <!--<version>4.4</version>-->    <!--<scope>test</scope>-->    <!--</dependency>-->    <dependency>      <groupId>org.specs</groupId>      <artifactId>specs</artifactId>      <version>1.2.5</version>      <scope>test</scope>    </dependency>    <dependency>      <groupId>commons-logging</groupId>      <artifactId>commons-logging</artifactId>      <version>1.1.1</version>      <type>jar</type>    </dependency>    <dependency>      <groupId>org.apache.commons</groupId>      <artifactId>commons-lang3</artifactId>      <version>3.1</version>    </dependency>    <dependency>      <groupId>log4j</groupId>      <artifactId>log4j</artifactId>      <version>1.2.9</version>    </dependency>    <dependency>      <groupId>org.apache.hadoop</groupId>      <artifactId>hadoop-client</artifactId>      <version>2.7.2</version>    </dependency>    <dependency>      <groupId>org.apache.hadoop</groupId>      <artifactId>hadoop-common</artifactId>      <version>2.7.2</version>    </dependency>    <dependency>      <groupId>org.apache.hadoop</groupId>      <artifactId>hadoop-hdfs</artifactId>      <version>2.7.2</version>    </dependency>    <!--spark-->    <dependency>      <groupId>org.apache.spark</groupId>      <artifactId>spark-core_2.11</artifactId>      <version>2.1.0</version>    </dependency>    <dependency>      <groupId>org.apache.spark</groupId>      <artifactId>spark-mllib_2.11</artifactId>      <version>2.1.0</version>    </dependency>    <!--<dependency>-->    <!--<groupId>org.apache.spark</groupId>-->    <!--<artifactId>spark-tools_2.10</artifactId>-->    <!--<version>2.0.0-SNAPSHOT</version>-->    <!--</dependency>-->    <!--<dependency>-->    <!--<groupId>org.apache.spark</groupId>-->    <!--<artifactId>spark-assembly_2.10</artifactId>-->    <!--<version>2.0.0</version>-->    <!--</dependency>-->    <dependency>      <groupId>org.apache.spark</groupId>      <artifactId>spark-repl_2.11</artifactId>      <version>2.1.0</version>    </dependency>    <dependency>      <groupId>org.apache.spark</groupId>      <artifactId>spark-catalyst_2.11</artifactId>      <version>2.1.0</version>    </dependency>    <dependency>      <groupId>org.apache.spark</groupId>      <artifactId>spark-network-common_2.11</artifactId>      <version>2.1.0</version>    </dependency>    <!--spark on yarn-->    <dependency>      <groupId>org.apache.spark</groupId>      <artifactId>spark-yarn_2.10</artifactId>      <version>2.1.0</version>    </dependency>    <dependency>      <groupId>org.apache.spark</groupId>      <artifactId>spark-network-yarn_2.11</artifactId>      <version>2.1.0</version>    </dependency>    <!--spark-sql-->    <dependency>      <groupId>org.apache.spark</groupId>      <artifactId>spark-sql_2.11</artifactId>      <version>2.1.0</version>    </dependency>    <dependency>      <groupId>org.apache.spark</groupId>      <artifactId>spark-hive_2.11</artifactId>      <version>2.1.0</version>    </dependency>    <dependency>      <groupId>org.apache.spark</groupId>      <artifactId>spark-hive-thriftserver_2.10</artifactId>      <version>2.1.0</version>    </dependency>    <!--spark-streaming-->    <dependency>      <groupId>org.apache.spark</groupId>      <artifactId>spark-streaming_2.10</artifactId>      <version>2.1.0</version>    </dependency>    <dependency>      <groupId>org.apache.spark</groupId>      <artifactId>spark-streaming-flume_2.10</artifactId>      <version>2.1.0</version>    </dependency>    <dependency>      <groupId>org.apache.spark</groupId>      <artifactId>spark-streaming-flume-sink_2.10</artifactId>      <version>2.1.0</version>    </dependency>  </dependencies>  <build>    <sourceDirectory>src/main/scala</sourceDirectory>    <testSourceDirectory>src/test/scala</testSourceDirectory>    <plugins>      <plugin>        <groupId>net.alchim31.maven</groupId>        <artifactId>scala-maven-plugin</artifactId>        <version>3.2.0</version>        <executions>          <execution>            <id>attach-scaladocs</id>            <phase>verify</phase>            <goals>              <goal>doc-jar</goal>            </goals>          </execution>        </executions>        <configuration>          <scalaversion>${scala.version}</scalaversion>          <recompileMode>incremental</recompileMode>          <useZincServer>true</useZincServer>          <args>            <arg>-unchecked</arg>            <arg>-deprecation</arg>            <arg>-feature</arg>          </args>          <javaArgs>            <javaArg>-source</javaArg>            <javaArg>${java.version}</javaArg>            <javaArg>-target</javaArg>            <javaArg>${java.version}</javaArg>          </javaArgs>        </configuration>      </plugin>      <plugin>        <groupId>org.apache.maven.plugins</groupId>        <artifactId>maven-assembly-plugin</artifactId>        <version>2.5.3</version>        <executions>          <execution>            <phase>package</phase>            <goals>              <goal>single</goal>            </goals>          </execution>        </executions>        <configuration>          <descriptorRefs>
<!--注意一定要加这句话,这句话表明你打的jar是把了你所有的使用的jar加进去了,这样你换了其他机器照样能跑-->
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>       
 </configuration>      
      </plugin>    
    </plugins>  
  </build>  
<reporting>    
<plugins>      
<plugin>        
<groupId>org.scala-tools</groupId>        
<artifactId>maven-scala-plugin</artifactId>        
<configuration>          
<scalaVersion>${scala.version}</scalaVersion>        
/configuration>      
</plugin>    
</plugins>  
</reporting>
</project>
     
配好了pom.xml,点击import pom.xml的更新,等待下载完毕所有开发需要的依赖包。

下载完所有依赖(其实暂时也用不到,但是总要准备好),我们写一个Pi的模拟概率算法实现,原理是1*1坐标系中投掷点,落在圆半径1内,其概率=总次数/投掷的总次数,就约等于Pi/4.将这个概率乘以4就是Pi了。新建如下:

源码如下:

package nju_mc.test/**  * Created by maocan on 2017/2/12.  */import scala.math.randomobject SparkPi {  def main(args: Array[String]) {    var count = 0    for (i <- 1 to 100000) {      val x = random * 2 - 1      val y = random * 2 - 1      if (x*x + y*y < 1) count += 1    }    println("Pi is roughly " + 4 * count / 100000.0)  }}
好了,现在我们用maven打包我们的程序:


一般点击compile,再点击package打包,不过打包之前就会compile,看个人习惯。打包成功,我们去打包的路径下(一般都在本工程了target目录下,我们加载数据,也可以将数据放在target目录,引用的时候使用相对路径),按住shift右击鼠标,在这里打开cmd,输入spark-submit --class nju_mc.test.SparkPi --master local[*] nju_mc-1.0-SNAPSHOT-jar-with-dependencies.jar 100(100是task):


程序运行完全没有问题,但是报错了,我们去bin目录下查看log:

at org.apache.spark.util.logging.FileAppender$$anon$1.run(FileAppender.scala:38)17/02/13 19:15:04 INFO Worker: Executor app-20170213151444-0005/1 finished with state KILLED exitStatus 14317/02/13 19:15:04 INFO Worker: Cleaning up local directories for application app-20170213151444-000517/02/13 19:15:04 WARN ReliableDeliverySupervisor: Association with remote system [akka.tcp://sparkExecutor@worker1:43177] has failed, address is now gated for [5000] ms. Reason is: [Disassociated].17/02/13 19:15:04 INFO LocalActorRef: Message [akka.remote.transport.ActorTransportAdapter$DisassociateUnderlying] from Actor[akka://sparkWorker/deadLetters] to Actor[akka://sparkWorker/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FsparkWorker%40192.168.1.105%3A39296-7#1191656166] was not delivered. [8] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.,内存太小了,我的电脑内存实在太小了,我在公司电脑上反复试过了,可以运行。最后总结一点个人在学习中的看法:大家没有必要总是去下载源码然后自己打包,有现成的为什么不用呢!身为程序员究根刨底是没错,但是很多东西起码要先学会用,然后再去访问底层源码,看别人是怎么实现功能的。

0 0
原创粉丝点击