{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TypeFamilies #-} {-# OPTIONS_GHC -fno-warn-unused-imports #-} -- Module : Network.AWS.EMR.RunJobFlow -- Copyright : (c) 2013-2014 Brendan Hay -- License : This Source Code Form is subject to the terms of -- the Mozilla Public License, v. 2.0. -- A copy of the MPL can be found in the LICENSE file or -- you can obtain it at http://mozilla.org/MPL/2.0/. -- Maintainer : Brendan Hay -- Stability : experimental -- Portability : non-portable (GHC extensions) -- -- Derived from AWS service descriptions, licensed under Apache 2.0. -- | RunJobFlow creates and starts running a new job flow. The job flow will run -- the steps specified. Once the job flow completes, the cluster is stopped and -- the HDFS partition is lost. To prevent loss of data, configure the last step -- of the job flow to store results in Amazon S3. If the 'JobFlowInstancesConfig' 'KeepJobFlowAliveWhenNoSteps' parameter is set to 'TRUE', the job flow will transition to the WAITING state -- rather than shutting down once the steps have completed. -- -- For additional protection, you can set the 'JobFlowInstancesConfig' 'TerminationProtected' parameter to 'TRUE' to lock the job flow and prevent it from being terminated -- by API call, user intervention, or in the event of a job flow error. -- -- A maximum of 256 steps are allowed in each job flow. -- -- If your job flow is long-running (such as a Hive data warehouse) or complex, -- you may require more than 256 steps to process your data. You can bypass the -- 256-step limitation in various ways, including using the SSH shell to connect -- to the master node and submitting queries directly to the software running on -- the master node, such as Hive and Hadoop. For more information on how to do -- this, go to in the /Amazon ElasticMapReduce Developer's Guide/. -- -- For long running job flows, we recommend that you periodically store your -- results. -- -- module Network.AWS.EMR.RunJobFlow ( -- * Request RunJobFlow -- ** Request constructor , runJobFlow -- ** Request lenses , rjfAdditionalInfo , rjfAmiVersion , rjfBootstrapActions , rjfInstances , rjfJobFlowRole , rjfLogUri , rjfName , rjfNewSupportedProducts , rjfServiceRole , rjfSteps , rjfSupportedProducts , rjfTags , rjfVisibleToAllUsers -- * Response , RunJobFlowResponse -- ** Response constructor , runJobFlowResponse -- ** Response lenses , rjfrJobFlowId ) where import Network.AWS.Data (Object) import Network.AWS.Prelude import Network.AWS.Request.JSON import Network.AWS.EMR.Types import qualified GHC.Exts data RunJobFlow = RunJobFlow { _rjfAdditionalInfo :: Maybe Text , _rjfAmiVersion :: Maybe Text , _rjfBootstrapActions :: List "BootstrapActions" BootstrapActionConfig , _rjfInstances :: JobFlowInstancesConfig , _rjfJobFlowRole :: Maybe Text , _rjfLogUri :: Maybe Text , _rjfName :: Text , _rjfNewSupportedProducts :: List "NewSupportedProducts" SupportedProductConfig , _rjfServiceRole :: Maybe Text , _rjfSteps :: List "Steps" StepConfig , _rjfSupportedProducts :: List "SupportedProducts" Text , _rjfTags :: List "Tags" Tag , _rjfVisibleToAllUsers :: Maybe Bool } deriving (Eq, Read, Show) -- | 'RunJobFlow' constructor. -- -- The fields accessible through corresponding lenses are: -- -- * 'rjfAdditionalInfo' @::@ 'Maybe' 'Text' -- -- * 'rjfAmiVersion' @::@ 'Maybe' 'Text' -- -- * 'rjfBootstrapActions' @::@ ['BootstrapActionConfig'] -- -- * 'rjfInstances' @::@ 'JobFlowInstancesConfig' -- -- * 'rjfJobFlowRole' @::@ 'Maybe' 'Text' -- -- * 'rjfLogUri' @::@ 'Maybe' 'Text' -- -- * 'rjfName' @::@ 'Text' -- -- * 'rjfNewSupportedProducts' @::@ ['SupportedProductConfig'] -- -- * 'rjfServiceRole' @::@ 'Maybe' 'Text' -- -- * 'rjfSteps' @::@ ['StepConfig'] -- -- * 'rjfSupportedProducts' @::@ ['Text'] -- -- * 'rjfTags' @::@ ['Tag'] -- -- * 'rjfVisibleToAllUsers' @::@ 'Maybe' 'Bool' -- runJobFlow :: Text -- ^ 'rjfName' -> JobFlowInstancesConfig -- ^ 'rjfInstances' -> RunJobFlow runJobFlow p1 p2 = RunJobFlow { _rjfName = p1 , _rjfInstances = p2 , _rjfLogUri = Nothing , _rjfAdditionalInfo = Nothing , _rjfAmiVersion = Nothing , _rjfSteps = mempty , _rjfBootstrapActions = mempty , _rjfSupportedProducts = mempty , _rjfNewSupportedProducts = mempty , _rjfVisibleToAllUsers = Nothing , _rjfJobFlowRole = Nothing , _rjfServiceRole = Nothing , _rjfTags = mempty } -- | A JSON string for selecting additional features. rjfAdditionalInfo :: Lens' RunJobFlow (Maybe Text) rjfAdditionalInfo = lens _rjfAdditionalInfo (\s a -> s { _rjfAdditionalInfo = a }) -- | The version of the Amazon Machine Image (AMI) to use when launching Amazon -- EC2 instances in the job flow. The following values are valid: -- -- "latest" (uses the latest AMI) The version number of the AMI to use, for -- example, "2.0" If the AMI supports multiple versions of Hadoop (for example, -- AMI 1.0 supports both Hadoop 0.18 and 0.20) you can use the 'JobFlowInstancesConfig' 'HadoopVersion' parameter to modify the version of Hadoop from the defaults -- shown above. -- -- For details about the AMI versions currently supported by Amazon Elastic -- MapReduce, go to in the /AmazonElastic MapReduce Developer's Guide./ rjfAmiVersion :: Lens' RunJobFlow (Maybe Text) rjfAmiVersion = lens _rjfAmiVersion (\s a -> s { _rjfAmiVersion = a }) -- | A list of bootstrap actions that will be run before Hadoop is started on the -- cluster nodes. rjfBootstrapActions :: Lens' RunJobFlow [BootstrapActionConfig] rjfBootstrapActions = lens _rjfBootstrapActions (\s a -> s { _rjfBootstrapActions = a }) . _List -- | A specification of the number and type of Amazon EC2 instances on which to -- run the job flow. rjfInstances :: Lens' RunJobFlow JobFlowInstancesConfig rjfInstances = lens _rjfInstances (\s a -> s { _rjfInstances = a }) -- | An IAM role for the job flow. The EC2 instances of the job flow assume this -- role. The default role is 'EMRJobflowDefault'. In order to use the default -- role, you must have already created it using the CLI. rjfJobFlowRole :: Lens' RunJobFlow (Maybe Text) rjfJobFlowRole = lens _rjfJobFlowRole (\s a -> s { _rjfJobFlowRole = a }) -- | The location in Amazon S3 to write the log files of the job flow. If a value -- is not provided, logs are not created. rjfLogUri :: Lens' RunJobFlow (Maybe Text) rjfLogUri = lens _rjfLogUri (\s a -> s { _rjfLogUri = a }) -- | The name of the job flow. rjfName :: Lens' RunJobFlow Text rjfName = lens _rjfName (\s a -> s { _rjfName = a }) -- | A list of strings that indicates third-party software to use with the job -- flow that accepts a user argument list. EMR accepts and forwards the argument -- list to the corresponding installation script as bootstrap action arguments. -- For more information, see . Currently supported values are: -- -- "mapr-m3" - launch the job flow using MapR M3 Edition. "mapr-m5" - launch -- the job flow using MapR M5 Edition. "mapr" with the user arguments specifying -- "--edition,m3" or "--edition,m5" - launch the job flow using MapR M3 or M5 -- Edition respectively. rjfNewSupportedProducts :: Lens' RunJobFlow [SupportedProductConfig] rjfNewSupportedProducts = lens _rjfNewSupportedProducts (\s a -> s { _rjfNewSupportedProducts = a }) . _List -- | The IAM role that will be assumed by the Amazon EMR service to access AWS -- resources on your behalf. rjfServiceRole :: Lens' RunJobFlow (Maybe Text) rjfServiceRole = lens _rjfServiceRole (\s a -> s { _rjfServiceRole = a }) -- | A list of steps to be executed by the job flow. rjfSteps :: Lens' RunJobFlow [StepConfig] rjfSteps = lens _rjfSteps (\s a -> s { _rjfSteps = a }) . _List -- | A list of strings that indicates third-party software to use with the job -- flow. For more information, go to -- . Currently supported values are: -- -- "mapr-m3" - launch the job flow using MapR M3 Edition. "mapr-m5" - launch -- the job flow using MapR M5 Edition. rjfSupportedProducts :: Lens' RunJobFlow [Text] rjfSupportedProducts = lens _rjfSupportedProducts (\s a -> s { _rjfSupportedProducts = a }) . _List -- | A list of tags to associate with a cluster and propagate to Amazon EC2 -- instances. rjfTags :: Lens' RunJobFlow [Tag] rjfTags = lens _rjfTags (\s a -> s { _rjfTags = a }) . _List -- | Whether the job flow is visible to all IAM users of the AWS account -- associated with the job flow. If this value is set to 'true', all IAM users of -- that AWS account can view and (if they have the proper policy permissions -- set) manage the job flow. If it is set to 'false', only the IAM user that -- created the job flow can view and manage it. rjfVisibleToAllUsers :: Lens' RunJobFlow (Maybe Bool) rjfVisibleToAllUsers = lens _rjfVisibleToAllUsers (\s a -> s { _rjfVisibleToAllUsers = a }) newtype RunJobFlowResponse = RunJobFlowResponse { _rjfrJobFlowId :: Maybe Text } deriving (Eq, Ord, Read, Show, Monoid) -- | 'RunJobFlowResponse' constructor. -- -- The fields accessible through corresponding lenses are: -- -- * 'rjfrJobFlowId' @::@ 'Maybe' 'Text' -- runJobFlowResponse :: RunJobFlowResponse runJobFlowResponse = RunJobFlowResponse { _rjfrJobFlowId = Nothing } -- | An unique identifier for the job flow. rjfrJobFlowId :: Lens' RunJobFlowResponse (Maybe Text) rjfrJobFlowId = lens _rjfrJobFlowId (\s a -> s { _rjfrJobFlowId = a }) instance ToPath RunJobFlow where toPath = const "/" instance ToQuery RunJobFlow where toQuery = const mempty instance ToHeaders RunJobFlow instance ToJSON RunJobFlow where toJSON RunJobFlow{..} = object [ "Name" .= _rjfName , "LogUri" .= _rjfLogUri , "AdditionalInfo" .= _rjfAdditionalInfo , "AmiVersion" .= _rjfAmiVersion , "Instances" .= _rjfInstances , "Steps" .= _rjfSteps , "BootstrapActions" .= _rjfBootstrapActions , "SupportedProducts" .= _rjfSupportedProducts , "NewSupportedProducts" .= _rjfNewSupportedProducts , "VisibleToAllUsers" .= _rjfVisibleToAllUsers , "JobFlowRole" .= _rjfJobFlowRole , "ServiceRole" .= _rjfServiceRole , "Tags" .= _rjfTags ] instance AWSRequest RunJobFlow where type Sv RunJobFlow = EMR type Rs RunJobFlow = RunJobFlowResponse request = post "RunJobFlow" response = jsonResponse instance FromJSON RunJobFlowResponse where parseJSON = withObject "RunJobFlowResponse" $ \o -> RunJobFlowResponse <$> o .:? "JobFlowId"