Spark Pipe使用方法(外部程序调用方法)
写在前面:
1、我们使用的是Hadoop2.2.0,Spark 1.0。
2、这里使用的样例是经典的求pai程序来演示这个开发过程。
3、我们暂时使用java程序来开发,按照需要后面改用scala来开发。
4、我们使用的IDE是IntelliJ IDEA,采用maven来做项目管理。
一、项目创建
1.1 运行IDE,通过下面命令 ~/idea-IC-133.696/idea.sh
1.2 创建一个maven项目。

1.2 新建的项目添加库文件。
1) scala中lib的安装路径,如我们的路径在/usr/share/scala/lib
2) spark的lib文件,比如我们的文件在~/spark-1.0.0/assembly/target/scala-2.10/spark-assembly-1.0.0-hadoop2.2.0.jar
我们需要在IDE中添加这两个库文件。
1)按ctrl+alt+shift+s快捷键,选中global libraries,出现如下窗口,把上面两个目录添加进去,最后如下。

二、代码编写
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.util.FloatVector; import java.util.ArrayList;
import java.util.List; public final class GPUPi { public static void main(String[] args) throws Exception {
SparkConf sparkConf = new SparkConf().setAppName("JavaSparkPi");
JavaSparkContext jsc = new JavaSparkContext(sparkConf);
int slices = (args.length == 1) ? Integer.parseInt(args[0]) : 2;
int n = slices;
int t = 100000000;
List<Integer> l = new ArrayList<Integer>(n);
for (int i = 0; i < n; i++) {
l.add(t);
}
String s = "./pi " + new Integer(n / slices).toString();
int count = jsc.parallelize(l, slices)
.pipe(s)
.map(
new Function<String, Integer>() {
@Override
public Integer call(String line) {
return Integer.parseInt(line);
}
}
).reduce(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer integer, Integer integer2) {
return integer + integer2;
}
});
System.out.println("Pi is roughly " + 4.0 * count / n / t);
}
}
这段代码通过RDDPipe,调用一个外部程序来计算,最后通过reduce+操作,获得几个外部程序的计算结果,这样一个接口,可以使得外部程序完全独立,和spark不会有太大的关系,甚至可以在外部程序中使用cuda等来加速。
这里需要说明一下pipe接口,这是因为在spark1.0中,我们依然没有在example样例中看到演示这个接口的任何代码。pipe接受一个cmd指令,然后在外部执行它,如“./pi"就是执行一个叫pi的可执行文件,所不同的是,这个外部程序所有的输入流都是由spark中的RDD传送给他的,同时,外部程序的输出,会形成一个新的RDD。
我们对应的c语言代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h> int main(int argc, char *argv[]) {
int num = , count = ,t;
double z = RAND_MAX;
z = z * z;
t = atoi(argv[]);
for(int i = ; i < t; i++){
scanf("%d",&num);
for(int j = ; j < num; j++){
double x = rand();
double y = rand();
if(x * x + y * y <= z){
count++;
}
}
}
printf("%d\n",count);
return ;
}
三、编译
由于项目已经采用maven来管理了,这里也就使用maven来打包了。命令是mvn package,这样就会在target目录下生成gpu-1.0-SNAPSHOT.jar文件。
四、作业提交。
mvn package
spark-submit \
--class GPUPi \
--master yarn-cluster \
--executor-memory 2G \
--num-executors \
--files /home/yarn/cuda-workspace/pi/Release/pi \
target/gpu-1.0-SNAPSHOT.jar
--files把可执行文件pi发送到每一台机器上面。
--master指定执行的模式,一般都是选yarn-cluster模式,让spark跑在yarn上面,其他可以参考文档说明。
Spark Pipe使用方法(外部程序调用方法)的更多相关文章
- MVC,如何在视图中声明方法,调用方法?
<div> <!--在视图中申明方法,此方法的类型已经固定为HelperResult--> @helper ShowHello(string s) { <div> ...
- php -- 魔术方法 之 调用方法:__call()、__callStatic()
方法重载:当调用一个不存在或者权限不够的方法的时候,会自动调用__call()方法 public function __call($name,$args){} :用对象调用方法 public sta ...
- @Transactional-同一个类中方法自调,调用方法事物失效
问题分析 一个类中的方法调用另一个事物传播性为创建事物的方法,调用的方法事物失效? SpringAOP 代理的Service对象调用了其方法,这个方法再去调用这个Service中的其他方法是没有使用A ...
- Java反射 - 1(得到类对象的几种方法,调用方法,得到包下的所有类)
通过反射获得对象的方法 准备工作: 有一个User类如下 package o1; /** * Created by yesiming on 16-11-19. */ public class User ...
- EasyUI相同的Tab只打开一个(即EasyUI方法的调用方法)
function addTabA(title){ if ($('#tt').tabs('exists', title)){ $('#tt').tabs('select', title); } else ...
- 利用GetType反射方法再调用方法进行传递参数实现调用
直接上代码: TestMenuService.MenuServiceCSClient tesClient = new TestMenuService.MenuServiceCSClient(); va ...
- NDK开发之调用方法
与NDK开发之访问域中介绍的一样,Java中的方法也是分为两类:实例方法和静态方法.JNI提供了访问两类方法的函数,下面我们一起来看看怎么在C中访问Java中的方法. 我们的MainActivity中 ...
- JavaSE复习日记 : 方法的调用和方法的重载
/* * 方法的调用和方法重载 */ /* * 什么是方法? * 方法就是一个有名字的代码段; * 方法的调用: * 在方法里调用另外一个方法里面的东西就是方法调用; * 或者可以认为"另外 ...
- Java入门(2) —— 变量详解、运算符、定义类和定义方法以及方法的调用
1.变量 1.定义变量 1.声明的同时直接赋值 数据类型 变量名 = 值; 2.先声明,后赋值 声明: 数据类型 变量名; 赋值: 变量名 = 值; 2.数据类型 基本数据类型:4类8种 整数 --- ...
随机推荐
- #Leet Code# Unique Path(todo)
描述: 使用了递归,有些计算是重复的,用了额外的空间,Version 1是m*n Bonus:一共走了m+n步,例如 m = 2, n = 3 [#, @, @, #, @],所以抽象成数学问题,解是 ...
- 在jsp中运用ajax实现同一界面不跳转处理事件
目前,编写应用程序时有两种基本的选择: 桌面应用程序 Web应用程序 它们有什么区别呢?桌面应用程序一般很快(就在您的计算机上运行,不用等待互联网连接),具有漂亮的用户界面(通常和操作系统有关)和非凡 ...
- C#如何控制方法的执行时间,超时则强制退出方法执行
转自:http://outofmemory.cn/code-snippet/1762/C-how-control-method-zhixingshijian-chaoshi-ze-force-quit ...
- List<>过滤重复的简单方法
List<int> ss = new List<int>(); ss.Add(); ss.Add(); ss.Add(); ss.Add(); ss.Add(); ss.Add ...
- 对CURL的一些研究
http://www.kuqin.com/article/23candcplusplus/586014.html 前两天看到有人求客户端socket 发HTTP包的代码,受flw版主启发找了一些per ...
- POJ2301+水~~~~~~
有比这更水的么.............. #include<stdio.h> int main(){ int n; scanf("%d",&n); while ...
- IntelliJ IDEA 中文乱码解决
显示乱码的主要原因,编辑器自带的字体里没有对中文的支持, 将字体换成有中文支持的即可,例如:为微软雅黑.宋体.... 字体转换位置 Ctrl+Alt+S > Appearance > ...
- 如何在Blog中使用feedburner管理RSS订阅
http://www.cnblogs.com/procoder/archive/2010/02/12/feedburner.html
- ANDROID_MARS学习笔记_S01原始版_010_ContentProvider
一.简介 一.代码1.xml(1)main.xml <?xml version="1.0" encoding="utf-8"?> <Linea ...
- Date简介
Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Date ...