Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.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
Azure 使用云服务进行并行文件处理_Azure_Amazon Web Services_Google Compute Engine_Google Cloud Dataflow_Google Cloud Dataproc - Fatal编程技术网

Azure 使用云服务进行并行文件处理

Azure 使用云服务进行并行文件处理,azure,amazon-web-services,google-compute-engine,google-cloud-dataflow,google-cloud-dataproc,Azure,Amazon Web Services,Google Compute Engine,Google Cloud Dataflow,Google Cloud Dataproc,我有许多图像需要通过java程序运行以创建更多图像文件——这是一个令人尴尬的并行情况。每个输入文件大约为500 mb,在处理过程中需要大约4 GB的内存,运行需要30秒到2分钟。java程序是多线程的,但对输入文件进行并行化比使用更多线程获得更多收益。我每天需要启动几次进程(我不想手动打开/关闭集群,也不想全天候付费) 我有点迷失在各种各样的云选项中: Amazon的系统资源不足(内存不足) 谷歌云,看来我必须编写自己的管道源代码才能使用他们的云存储桶。很好,但如果这不是一个合适的解决方案(可

我有许多图像需要通过java程序运行以创建更多图像文件——这是一个令人尴尬的并行情况。每个输入文件大约为500 mb,在处理过程中需要大约4 GB的内存,运行需要30秒到2分钟。java程序是多线程的,但对输入文件进行并行化比使用更多线程获得更多收益。我每天需要启动几次进程(我不想手动打开/关闭集群,也不想全天候付费)

我有点迷失在各种各样的云选项中:

  • Amazon的系统资源不足(内存不足)
  • 谷歌云,看来我必须编写自己的管道源代码才能使用他们的云存储桶。很好,但如果这不是一个合适的解决方案(可能是这样,我还不知道),我不想浪费时间
  • 亚马逊看起来相当于谷歌云数据流。(为了完整性,在编辑中添加。)
  • 谷歌云,这不是map/reduce hadoop-y的情况,但可能仍然有效。不过,我不想管理自己的集群
  • 谷歌计算引擎或自动缩放的AWS,我只是为机器上的每个核心启动进程。我有更多的管理经验,但没有API可供学习
  • 微软还没有发布,看起来像是hadoop-y
  • 微软似乎很合适(但我问这个问题是因为我对其他选择仍然很好奇)

有人能告诉我们什么样的解决方案可以解决这个问题吗?

您应该能够非常轻松地使用数据流实现这一点。管道可能看起来像(假设您的文件位于地面军事系统上):

类图像处理器{
公共静态无效处理(GcsPath路径){
//打开图像,进行所需的处理,然后写入
//输出到您想要的位置。
//您可以使用GcsUtil.open()和GcsUtil.create()来
//GCS上的读写路径。
}
}
//这将很好地工作,直到数万个文件。
//如果你还有更多,请告诉我。
List filesToProcess=GcsUtil.expand(GcsPath.fromUri(“…”);
p、 应用(创建.of(filesToProcess))
.apply(MapElements.via(ImageProcessor::process)
.withOutputType(新类型描述符(){}));
p、 run();
这是一种常见的情况,其中数据流被用作令人尴尬的并行编排框架,而不是数据处理框架,但它应该可以工作


您需要Dataflow SDK 1.2.0来使用MapElements转换(1.2.0中新增了对Java 8 lambdas的支持)。

是否有特别的原因要避免使用Hadoop(或Spark)进行此处理?我想这是为了让你不必重写你的应用程序,但我想请你确认一下@James我对Spark/Hadoop不太熟悉,所以我的理由可能有缺陷。java程序是一个大型的第三方程序,实际上无法重写。(尽管它可以通过API包装在另一个java类中。)我看到的实际方法是调用系统进程,这似乎使Spark/Hadoop不适合。。。也许?明白了。是的,您可以将它包装到另一个Java类中并运行它。这将是快速和分布式的,但可能不优雅。对于CloudDataProc,一旦您创建集群,它将为您进行管理,因此总体管理级别将较低。您还可以根据需要动态调整集群大小,这可能很好。如果你很好奇,LMK(但我不想回避这个问题。)我似乎需要指定一个编码员。是否有一个适用于
GcsPath
,或者我需要实现自己的?或者我应该转换为
String
s并在处理器中创建新的
GcsPath
s吗?转换为String可能是最简单的。或者您可以使用SerializableCoder.of()。谢谢。完整的最小示例。很酷,看起来很合理!
class ImageProcessor {
    public static void process(GcsPath path) {
        // Open the image, do the processing you want, write
        // the output to where you want.
        // You can use GcsUtil.open() and GcsUtil.create() for
        // reading and writing paths on GCS.
    }
}

// This will work fine until a few tens of thousands of files.
// If you have more, let me know.
List<GcsPath> filesToProcess = GcsUtil.expand(GcsPath.fromUri("..."));
p.apply(Create.of(filesToProcess))
 .apply(MapElements.via(ImageProcessor::process)
                   .withOutputType(new TypeDescriptor<Void>() {}));
p.run();