我正试图通过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工具