[英]in aws emr job flow, does each step receive the output from the previous step?
我正在 Java 中制作一個 map reduce 程序,它有 4 個步驟。 每一步都是對上一步的output進行操作。
到目前為止,我在本地手動運行了這些步驟,我想開始使用作業流程在 AWS EMR 上運行。
我的教授給了我們一些代碼來配置作業流程的步驟,但現在我們面臨一個問題:
我的每個步驟都期望輸入和 output 路徑作為其主要 function 的參數。JobFlow 允許我將參數傳輸到每個步驟,但據我了解,作業流程中的每個步驟都應該自動接收上一步的 output
有沒有人知道這是不是真的? 步驟中的 map-reduce 應用程序如何實現其輸入位置? 從 JobFlow 隱式傳遞給它的路徑是 arguments 嗎?
我將 AWS SDK 2 用於 Java。
我的代碼:
public static void main(String args[]) throws IOException, ClassNotFoundException, InterruptedException {
// AwsCredentialsProvider credentialsProvider = StaticCredentialsProvider
// .create(ProfileCredentialsProvider.create().resolveCredentials());
EmrClient mapReduce = EmrClient.builder().credentialsProvider(ProfileCredentialsProvider.create())
.build();
List<StepConfig> steps = new LinkedList<StepConfig>();
HadoopJarStepConfig hadoopJarStepConfig = HadoopJarStepConfig.builder()
.jar("s3n://" + myBucketName + "/" + NCount + jarPostfix)
.mainClass(packageName + NCount)
.args(??????????????????????)
.build();
steps.add(StepConfig.builder().name(NCount).hadoopJarStep(hadoopJarStepConfig)
.actionOnFailure("TERMINATE_JOB_FLOW").build());
HadoopJarStepConfig hadoopJarStepConfig2 = HadoopJarStepConfig.builder()
.jar("s3n://" + myBucketName + "/" + CountNrTr + jarPostfix)
.mainClass(packageName + CountNrTr)
.args(??????????????????????)
.build();
steps.add(StepConfig.builder().name(CountNrTr).hadoopJarStep(hadoopJarStepConfig2)
.actionOnFailure("TERMINATE_JOB_FLOW").build());
HadoopJarStepConfig hadoopJarStepConfig3 = HadoopJarStepConfig.builder()
.jar("s3n://" + myBucketName + "/" + JoinAndCalculate + jarPostfix)
.mainClass(packageName + JoinAndCalculate)
.args(??????????????????????)
.build();
steps.add(StepConfig.builder().name(JoinAndCalculate).hadoopJarStep(hadoopJarStepConfig3)
.actionOnFailure("TERMINATE_JOB_FLOW").build());
HadoopJarStepConfig hadoopJarStepConfig4 = HadoopJarStepConfig.builder()
.jar("s3n://" + myBucketName + "/" + ValueToKeySort + jarPostfix)
.mainClass(packageName + ValueToKeySort)
.args(??????????????????????)
.build();
steps.add(StepConfig.builder().name(ValueToKeySort).hadoopJarStep(hadoopJarStepConfig4)
.actionOnFailure("TERMINATE_JOB_FLOW").build());
JobFlowInstancesConfig instances = JobFlowInstancesConfig.builder()
.instanceCount(2)
.masterInstanceType("m4.large")
.slaveInstanceType("m4.large")
.hadoopVersion("3.3.4")
.ec2KeyName(myKeyPair)
.keepJobFlowAliveWhenNoSteps(false)
.placement(PlacementType.builder().availabilityZone("us-east-1a").build()).build();
EMR 與問題無關。 不,它不是自動的。
我們需要查看您執行的 JAR 的代碼,但我只假設它是您使用 FileInputFormat 的傳統 mapreduce 代碼,如果是這樣,可能有類似Path(args[0])
的代碼,這可能是您的輸入。 然后Path(args[1])
可能是 output。
因此,您只需在每個步驟中將這些 arguments 鏈接在一起......
step1 = ...
.args(new String[] {"/in", "/stage1" })
...
final = ...
.args(new String[] {"/stageN", "/out" })
或者,將您的代碼轉換為 Spark/Flink 或 Hive 查詢,其中自動處理多個 mapreduce 階段
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.