Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spark中对不同的工作人员运行任务?_Java_Apache Spark - Fatal编程技术网

Java 如何在Spark中对不同的工作人员运行任务?

Java 如何在Spark中对不同的工作人员运行任务?,java,apache-spark,Java,Apache Spark,我有以下Spark代码: 包my.spark; 导入java.util.ArrayList; 导入java.util.List; 导入org.apache.spark.api.java.JavaRDD; 导入org.apache.spark.api.java.JavaSparkContext; 导入org.apache.spark.sql.SparkSession; 公共类ExecutionTest{ 公共静态void main(字符串[]args){ 火花会话火花=火花会话 .builder(

我有以下Spark代码:

包my.spark;
导入java.util.ArrayList;
导入java.util.List;
导入org.apache.spark.api.java.JavaRDD;
导入org.apache.spark.api.java.JavaSparkContext;
导入org.apache.spark.sql.SparkSession;
公共类ExecutionTest{
公共静态void main(字符串[]args){
火花会话火花=火花会话
.builder()
.appName(“执行测试”)
.getOrCreate();
JavaSparkContext jsc=新的JavaSparkContext(spark.sparkContext());
int切片=2;
int n=切片;
列表=新的ArrayList(n);
对于(int i=0;i{
System.out.println(“值:+str”);
睡眠(10000);
});
系统输出打印项次(“完成”);
spark.stop();
}
}
我使用以下命令运行了master node和两个worker(localhost上的所有内容;Windows):

bin\spark-class org.apache.spark.deploy.master.Master
及(两次):

bin\spark类org.apache.spark.deploy.worker.worker spark://:7077
一切都开始正常

使用命令提交作业后:

bin\spark-submit --class my.spark.ExecutionTest --master spark://<local-ip>:7077 file:///<pathToFatJar>/FatJar.jar
bin\spark提交——类my.spark.ExecutionTest——主spark://:7077file:////FatJar.jar
命令已启动,但
值:0
值:1
输出由其中一个工作进程写入(如与该工作进程关联的页面上的
日志>标准输出所示)。第二个工作进程在
日志>标准输出中没有任何内容。据我所知,这意味着每次迭代都是由同一个工人完成的


如何在两个不同的运行人员上运行这些任务?

这是可能的,但我不确定它是否能在任何时候、任何地方都正常工作。然而,在测试过程中,每次它都按预期工作

我已经使用Windows 10 x64的主机和4个虚拟机(VM)测试了我的代码:带Debian 9(stretch)内核的VirtualBox 4.9.0 x64、纯主机网络、Java 1.8.0144、Apache Spark 2.2.0 for Hadoop 2.7(Spark-2.2.0-bin-hadoop2.7.tar.gz)

我一直在虚拟机上使用master和3个slave,在Windows上使用另外一个slave:

  • debian master-1个CPU,1 GB RAM
  • debian-slave1-1个CPU,1 GB RAM
  • debian-slave2-1 CPU,1 GB RAM
  • debian-slave3-2 CPU,1 GB RAM
  • windows从-4个CPU,8 GB RAM
我正在将我的作业从Windows计算机提交到位于VM上的主机

开头和前面一样:

SparkSession spark=SparkSession
.builder()
.config(“spark.cores.max”,coresunt)//不需要
.appName(“执行测试”)
.getOrCreate();
[重要]
coresont
对于分区是必不可少的-我必须使用使用的内核数对数据进行分区,而不是工作者/执行者数

接下来,我必须创建JavaSparkContext和RDD。重用RDD允许对同一组worker执行多次

JavaSparkContext jsc=新的JavaSparkContext(spark.sparkContext());
JavaRDD rddList
=jsc.parallelize(
IntStream.range(0,coresunt*2)
.boxed().collect(收集器.toList())
.重新分配(共分);
我已经创建了
rddList
,其中包含
coresont*2
元素。等于
coresCount
的元素数不允许在所有关联的辅助进程上运行(在我的例子中)。也许,
coresunt+1
就足够了,但是我没有测试它,因为
coresunt*2
也不太好

接下来要做的是运行命令:

bin\spark-class org.apache.spark.deploy.master.Master
列出主机列表
=rddList.map(值->{
线程。睡眠(3000);
返回InetAddress.getLocalHost().getHostAddress();
})
.distinct()
.收集();
System.out.println(“------>hostsList=“+hostsList”);
Thread.sleep(3000)
是正确分配任务所必需的。3秒钟对我来说足够了。这个值可能更小,有时可能需要更高的值(我想这个值取决于工作人员从master获取任务的速度)

上面的代码将在与worker关联的每个核心上运行,因此每个worker都有多个核心。为了在每个worker上只运行一个命令,我使用了以下代码:

/*作为类的静态字段*/
私有静态最终AtomicBoolean ONE_ON_WORKER=新AtomicBoolean(false);
...
长节点计数
=rddList.map(值->{
线程。睡眠(3000);
if(一个工作线程上的一个线程。getAndSet(true)=false){
System.out.println(“在上执行”
+InetAddress.getLocalHost().getHostName());
返回1;
}否则{
返回0;
}
})
.filter(val->val!=0)
.count();
System.out.println(“--->使用#nodes=“+nodeCount”)完成;
当然,在最后一站:

spark.stop();

这是可能的,但我不确定它是否在任何时候、任何地方都能正常工作。然而,在测试过程中,每次它都按预期工作

我已经使用Windows 10 x64的主机和4个虚拟机(VM)测试了我的代码:带Debian 9(stretch)内核的VirtualBox 4.9.0 x64、纯主机网络、Java 1.8.0144、Apache Spark 2.2.0 for Hadoop 2.7(Spark-2.2.0-bin-hadoop2.7.tar.gz)

我一直在虚拟机上使用master和3个slave,在Windows上使用另外一个slave:

  • debian master-1个CPU,1 GB RAM
  • debian-slave1-1个CPU,1 GB RAM
  • debian-slave2-1 CPU,1 GB RAM
  • <