假设我有以下个人电脑
1 2 3
4 5 6
7 8 9
现在假设我有两个火花作业A和B.作业生成数据C,B作为输入。为了获得C,我需要像这样的集群
群集1:主人:1,奴隶:2 3
集群2:主人:4,奴隶:5 6
群集3:主人:7,奴隶:8 9
对于B工作,我需要有这样的集群:
集群4:主人:4,奴隶:1 7
如何设置这样的集群,其中同一台PC可能在不同的时间属于不同的集群并且可以成为主/从?
最重要的是,即使这样的配置成为可能,那么对这样的火花应用进行编码的最佳实践是什么,这样我们就不需要为作业A和B单独设置火花应用了?
答案 0 :(得分:-1)
我假设你在YARN / MapReduce2 + HDFS集群之上运行你的火花作业。
要执行您想要的操作,您不需要多个集群,可以使用Apache Oozie编写工作流来实现所需的编排级别(就像在这种情况下,运行A然后使用A的输出运行B )。
在另一个类似的主题上,如果你害怕每个作业消耗的资源,你可以在YARN中创建队列并将每个作业提交到不同的队列,这样做可以确保他们都获得你的资源量想要,他们可以同时运行。
最后,如果您在$ cat t109.cu
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <stdlib.h>
void check(cudaError x) {
fprintf(stderr, "%s\n", cudaGetErrorString(x));
}
void showMatrix2(int* v1, int width, int height) {
printf("---------------------\n");
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
printf("%d ", v1[i * width + j]);
}
printf("\n");
}
}
__global__ void kernel(int* tab,int width, int height, int pitch) {
int row = threadIdx.x + blockIdx.x * blockDim.x;
int col = threadIdx.y + blockIdx.y * blockDim.y;
if (row < width && col < height) {
*( ((int *)(((char *)tab) + (row * pitch))) + col) = 9;
}
}
int main()
{
int width = 4;
int height = 4;
int* d_tab;
int* h_tab;
int realSize = width * height* sizeof(int);
size_t pitch;
check( cudaMallocPitch(&d_tab, &pitch, width * sizeof(int), height) );
h_tab = (int*)malloc(realSize);
check( cudaMemset(d_tab, 0, realSize) );
dim3 grid(4, 4);
dim3 block(4, 4);
kernel <<<grid, block>>>(d_tab, width, height, pitch);
check( cudaMemcpy2D(h_tab, width*sizeof(int), d_tab, pitch, width*sizeof(int), height, cudaMemcpyDeviceToHost) );
showMatrix2(h_tab, width, height);
printf("\nPitch size: %ld \n", pitch);
return 0;
}
$ nvcc -arch=sm_61 -o t109 t109.cu
$ cuda-memcheck ./t109
========= CUDA-MEMCHECK
no error
no error
no error
---------------------
9 9 9 9
9 9 9 9
9 9 9 9
9 9 9 9
Pitch size: 512
========= ERROR SUMMARY: 0 errors
$
和--deploy-mode cluster
中提交这些工作,则不必担心主人和奴隶,因为--master yarn
和spark driver
会保持在集群中分发。