天天看点

《Spark核心技术与高级应用》——3.3节独立应用程序编程

本节书摘来自华章社区《spark核心技术与高级应用》一书中的第3章,第3.3节独立应用程序编程,作者于俊 向海 代其锋 马海平,更多章节内容可以访问云栖社区“华章社区”公众号查看

3.3 独立应用程序编程

不同于使用spark shell自动初始化sparkcontext的例子,独立应用程序需要初始化一个sparkcontext作为程序的一部分,然后将一个包含应用程序信息的sparkconf对象传递给sparkcontext构造函数。

接下来编写简单应用程序simpleapp,并描述一些简单的编码流程。

3.3.1 创建sparkcontext对象

编写一个spark程序,首先创建sparkconf对象,该对象包含应用的信息。sparkconf对象构建完毕,需要创建sparkcontext对象,该对象可以访问spark集群。

3.3.2 编写简单应用程序

一个常见的hadoop数据流模式是mapreduce,spark可以轻易地实现mapreduce数据流,我们通过spark api创建一个简单的spark应用程序simpleapp.scala。

这个程序统计了spark的readme.md中含有“a”的行数和含有“b”的行数。实际需要用spark的安装路径替换your_spark_home。

3.3.3 编译并提交应用程序

可以采用idea生成jar包的方式,也可以采取sbt或者mvn的方式打成jar包。以sbt package为例,创建一个包含应用程序代码的jar包。

一旦用户的应用程序被打包,就可以使用$spark_home./bin/spark-submit脚本启动应用程序。spark-submit脚本负责建立spark的类路径和相关依赖,并支持不同的集群管理(local、standalone、yarn)和部署模式(client、cluster),通过提交参数进行区别。

1.?使用sbt打成jar包

使用sbt打成jar包过程如下:

选项解释说明:

--class:应用程序入口位置,如org.apache.spark.examples.sparkpi。

--master:集群的master的url,如spark://xxx.xxx.xxx.xxx:7077;或使用local在本地单线程地运行,或使用local[n]在本地以n个线程运行。通常应该由运行local进行测试开始。

--deploy-mode:集群部署模式,cluster模式和client模式(默认模式)。

application-jar:包含应用程序和所有依赖的jar包的路径。该url必须是在集群中全局可见的,如一个hdfs://路径或者一个在所有worker节点都出现的f?ile://路径。

application-arguments:传递给主类的main函数的参数。

对于python应用,在的位置传入一个.py文件代替一个jar包,并且以-py-f?iles的方式在搜索路径下加入python.zip、.egg或.py文件。

常见的部署策略是从同一物理位置,即同一个网关的服务器上提交应用程序。在这种设置中,采用client模式比较合适。在client模式中,driver直接在用户的spark-submit进程中启动,应用程序的输入和输出连接到控制台(console)。因此,这个模式对于涉及repl(read-eval-print loop,“读取-求值-输出”循环)的应用程序尤其合适。

另外,如果你的应用程序是从远离worker机器的某台机器上提交的(如你的笔记本电脑上),一般要用cluster模式,使drivers和executors之间的网络延迟最小化。(目前standalone部署模式、mesos集群模式和python编写的应用不支持cluster

模式。)

传递给spark的master url可以是如表3-1所示的某个格式。

《Spark核心技术与高级应用》——3.3节独立应用程序编程

3.以local模式提交应用程序

以local模式在4个cpu核上运行应用程序,命令如下: