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'.,内存太小了,我的电脑内存实在太小了,我在公司电脑上反复试过了,可以运行。最后总结一点个人在学习中的看法:大家没有必要总是去下载源码然后自己打包,有现成的为什么不用呢!身为程序员究根刨底是没错,但是很多东西起码要先学会用,然后再去访问底层源码,看别人是怎么实现功能的。
- window10下spark2.1.0单节点环境及开发环境搭建及运行全流程走通
- sakai开发环境及运行环境搭建
- Myeclipse下PHP开发环境搭建及运行
- window10下python开发环境的搭建,用于数据处理
- window10下php7 nginx mysql redis 开发环境快速搭建
- zstack(一)运行及开发环境搭建及说明
- Ubuntu下搭建单节点hadoop环境
- JAVA环境搭建及运行
- Python 环境搭建及运行
- 1.1linux下mpi开发环境搭建流程及过程中出现的一些问题解决方法。
- zigbee cc2530环境搭建及程序开发大概流程
- PHP开发环境及开发环境搭建
- Ubuntu下Android开发环境搭建及源代码下载、编译、运行
- Window10下docker配置PHP开发环境
- Android studio下NDK开发环境配置及开发流程
- Windows下RN环境搭建及官方Demo运行
- Android NDK开发(一)环境搭建及运行示例
- Android NDK开发(一)环境搭建及运行示例
- c++==命名空间(5)
- 迟来的2016年总结
- 常用电路
- C/C++中常用的数学公式
- IOS开发之OC篇(3)—— NSArray、NSMutableArray
- window10下spark2.1.0单节点环境及开发环境搭建及运行全流程走通
- WC2017 酱油记
- If you ever have a broken heart
- PackageManger.getLaunchIntentForPackage(String packageName)获取Intent对象启动Activity的坑
- Shiro安全框架
- 机器学习算法基础--矩阵
- Palette调色板的使用
- PAT 1009 说反话
- c++运算符重载实例