我们如何从AWS SDK for PHP传递Hadoop流的参数


How can we pass arguments for Hadoop Streaming from AWS SDK for PHP?

我正试图通过AWS SDK for PHP添加一些作业。我可以通过API成功地启动集群并启动新的作业流,但我在尝试创建Hadoop流步骤时遇到了一个错误。

这是我的代码:

// add some jobflow steps
$response = $emr->add_job_flow_steps($JobFlowId, array(
    new CFStepConfig(array(
        'Name' => 'MapReduce Step 1. Test',
        'ActionOnFailure' => 'TERMINATE_JOB_FLOW',
        'HadoopJarStep' => array(
    'Jar' => '/home/hadoop/contrib/streaming/hadoop-streaming.jar',
            // ERROR IS HERE!!!! How can we pas the parameters?
    'Args' => array(
                '-input s3://logs-input/appserver1 -output s3://logs-input/job123/ -mapper s3://myscripts/mapper-apache.php -reducer s3://myscripts/reducer.php',
              ),
        )
   )),
));

我得到的错误如下:无效的流参数‘-输入s3://-输出s3://-映射器s3:///mapper.php-reductor s3:///reductor.php"

所以还不清楚如何将参数传递给Hadoop Streaming JAR?

官方的AWS SDK for PHP文档没有提供任何示例或文档。

可能相关的未应答线程:

使用aws-php-sdk 将参数传递到配置单元脚本

这对我有效:

'Args' => array( '-input','s3://mybucket/in/','-output','s3://mybucket/oo/',
                '-mapper','s3://mybucket/c/mapperT1.php',
                    '-reducer','s3://mybucket/c/reducerT1.php')

我还没有用AWS SDK for PHP执行这些步骤,但从其他环境来看,我认为指定Amazon S3位置的方式可能不正确-我认为输入和输出参数需要如下所示:

  • s3n://logs input/appserver1
  • s3n://logs input/job123/

请注意s3n:vs.s3:URI方案的使用,根据各自的常见问题解答,这可能是亚马逊电子病历的要求。亚马逊弹性MapReduce如何使用亚马逊EC2和亚马逊s3?:

客户上传他们的输入数据和数据处理应用程序进入亚马逊S3。Amazon Elastic MapReduce随后推出了客户指定的Amazon EC2实例。服务开始从Amazon S3提取输入数据时的作业流执行使用S3N协议到已启动的AmazonEC2实例中。一旦作业流完成,Amazon Elastic MapReduce传输输出数据到AmazonS3,然后客户可以在那里检索或用作在另一个作业流中输入[强调矿]


附录

HadoopWiki中解释了这两种URI方案之间的区别,请参见AmazonS3:

Hadoop提供了两个使用S3的文件系统。

  • S3本机文件系统(URI方案:s3n)用于读取的本机文件系统以及在S3上写入常规文件。此文件系统的优点是您可以访问S3上使用其他工具编写的文件。相反,其他工具可以访问使用Hadoop编写的文件。这个缺点是S3对文件大小的5GB限制。为此原因是它不适合作为HDFS的替代品(支持对于非常大的文件)
  • S3块文件系统(URI方案:S3)由S3支持的基于块的文件系统。文件存储为块,只是就像它们在HDFS中一样。这使得重命名。这个文件系统要求您为文件系统-您不应该使用包含文件的现有bucket,或者将其他文件写入同一存储桶。此存储的文件文件系统可以大于5GB,但不能与其他S3工具