%% WARNING: DO NOT EDIT, AUTO-GENERATED CODE! %% See https://github.com/jkakar/aws-codegen for more details. %% @doc Amazon Elastic MapReduce (Amazon EMR) is a web service that makes it %% easy to process large amounts of data efficiently. Amazon EMR uses Hadoop %% processing combined with several AWS products to do tasks such as web %% indexing, data mining, log file analysis, machine learning, scientific %% simulation, and data warehousing. -module(aws_emr). -export([add_instance_groups/2, add_instance_groups/3, add_job_flow_steps/2, add_job_flow_steps/3, add_tags/2, add_tags/3, describe_cluster/2, describe_cluster/3, describe_job_flows/2, describe_job_flows/3, describe_step/2, describe_step/3, list_bootstrap_actions/2, list_bootstrap_actions/3, list_clusters/2, list_clusters/3, list_instance_groups/2, list_instance_groups/3, list_instances/2, list_instances/3, list_steps/2, list_steps/3, modify_instance_groups/2, modify_instance_groups/3, remove_tags/2, remove_tags/3, run_job_flow/2, run_job_flow/3, set_termination_protection/2, set_termination_protection/3, set_visible_to_all_users/2, set_visible_to_all_users/3, terminate_job_flows/2, terminate_job_flows/3]). -include_lib("hackney/include/hackney_lib.hrl"). %%==================================================================== %% API %%==================================================================== %% @doc AddInstanceGroups adds an instance group to a running cluster. add_instance_groups(Client, Input) when is_map(Client), is_map(Input) -> add_instance_groups(Client, Input, []). add_instance_groups(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"AddInstanceGroups">>, Input, Options). %% @doc AddJobFlowSteps adds new steps to a running job flow. 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 Add %% More than 256 Steps to a Job Flow in the Amazon Elastic MapReduce %% Developer's Guide. %% %% A step specifies the location of a JAR file stored either on the master %% node of the job flow or in Amazon S3. Each step is performed by the main %% function of the main class of the JAR file. The main class can be %% specified either in the manifest of the JAR or by using the MainFunction %% parameter of the step. %% %% Elastic MapReduce executes each step in the order listed. For a step to be %% considered complete, the main function must exit with a zero exit code and %% all Hadoop jobs started while the step was running must have completed and %% run successfully. %% %% You can only add steps to a job flow that is in one of the following %% states: STARTING, BOOTSTRAPPING, RUNNING, or WAITING. add_job_flow_steps(Client, Input) when is_map(Client), is_map(Input) -> add_job_flow_steps(Client, Input, []). add_job_flow_steps(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"AddJobFlowSteps">>, Input, Options). %% @doc Adds tags to an Amazon EMR resource. Tags make it easier to associate %% clusters in various ways, such as grouping clusters to track your Amazon %% EMR resource allocation costs. For more information, see Tagging %% Amazon EMR Resources. add_tags(Client, Input) when is_map(Client), is_map(Input) -> add_tags(Client, Input, []). add_tags(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"AddTags">>, Input, Options). %% @doc Provides cluster-level details including status, hardware and %% software configuration, VPC settings, and so on. For information about the %% cluster steps, see ListSteps. describe_cluster(Client, Input) when is_map(Client), is_map(Input) -> describe_cluster(Client, Input, []). describe_cluster(Client, Input, Options) when is_map(Client), is_map(Input), is_list(Options) -> request(Client, <<"DescribeCluster">>, Input, Options). %% @doc This API is deprecated and will eventually be removed. We recommend %% you use ListClusters, DescribeCluster, ListSteps, %% ListInstanceGroups and ListBootstrapActions instead. %% %% DescribeJobFlows returns a list of job flows that match all of the %% supplied parameters. The parameters can include a list of job flow IDs, %% job flow states, and restrictions on job flow creation date and time. %% %% Regardless of supplied parameters, only job flows created within the last %% two months are returned. %% %% If no parameters are supplied, then job flows matching either of the %% following criteria are returned: %% %%
RUNNING, WAITING,
%% SHUTTING_DOWN, STARTING 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 Add
%% More than 256 Steps to a Job Flow in the Amazon Elastic MapReduce
%% Developer's Guide.
%%
%% For long running job flows, we recommend that you periodically store your
%% results.
run_job_flow(Client, Input)
when is_map(Client), is_map(Input) ->
run_job_flow(Client, Input, []).
run_job_flow(Client, Input, Options)
when is_map(Client), is_map(Input), is_list(Options) ->
request(Client, <<"RunJobFlow">>, Input, Options).
%% @doc SetTerminationProtection locks a job flow so the Amazon EC2 instances
%% in the cluster cannot be terminated by user intervention, an API call, or
%% in the event of a job-flow error. The cluster still terminates upon
%% successful completion of the job flow. Calling SetTerminationProtection on
%% a job flow is analogous to calling the Amazon EC2 DisableAPITermination
%% API on all of the EC2 instances in a cluster.
%%
%% SetTerminationProtection is used to prevent accidental termination of a
%% job flow and to ensure that in the event of an error, the instances will
%% persist so you can recover any data stored in their ephemeral instance
%% storage.
%%
%% To terminate a job flow that has been locked by setting
%% SetTerminationProtection to true, you must first unlock the
%% job flow by a subsequent call to SetTerminationProtection in which you set
%% the value to false.
%%
%% For more information, go to Protecting
%% a Job Flow from Termination in the Amazon Elastic MapReduce
%% Developer's Guide.
set_termination_protection(Client, Input)
when is_map(Client), is_map(Input) ->
set_termination_protection(Client, Input, []).
set_termination_protection(Client, Input, Options)
when is_map(Client), is_map(Input), is_list(Options) ->
request(Client, <<"SetTerminationProtection">>, Input, Options).
%% @doc Sets whether all AWS Identity and Access Management (IAM) users under
%% your account can access the specified job flows. This action works on
%% running job flows. You can also set the visibility of a job flow when you
%% launch it using the VisibleToAllUsers parameter of
%% RunJobFlow. The SetVisibleToAllUsers action can be called only by
%% an IAM user who created the job flow or the AWS account that owns the job
%% flow.
set_visible_to_all_users(Client, Input)
when is_map(Client), is_map(Input) ->
set_visible_to_all_users(Client, Input, []).
set_visible_to_all_users(Client, Input, Options)
when is_map(Client), is_map(Input), is_list(Options) ->
request(Client, <<"SetVisibleToAllUsers">>, Input, Options).
%% @doc TerminateJobFlows shuts a list of job flows down. When a job flow is
%% shut down, any step not yet completed is canceled and the EC2 instances on
%% which the job flow is running are stopped. Any log files not already saved
%% are uploaded to Amazon S3 if a LogUri was specified when the job flow was
%% created.
%%
%% The maximum number of JobFlows allowed is 10. The call to
%% TerminateJobFlows is asynchronous. Depending on the configuration of the
%% job flow, it may take up to 5-20 minutes for the job flow to completely
%% terminate and release allocated resources, such as Amazon EC2 instances.
terminate_job_flows(Client, Input)
when is_map(Client), is_map(Input) ->
terminate_job_flows(Client, Input, []).
terminate_job_flows(Client, Input, Options)
when is_map(Client), is_map(Input), is_list(Options) ->
request(Client, <<"TerminateJobFlows">>, Input, Options).
%%====================================================================
%% Internal functions
%%====================================================================
-spec request(aws_client:aws_client(), binary(), map(), list()) ->
{ok, Result, {integer(), list(), hackney:client()}} |
{error, Error, {integer(), list(), hackney:client()}} |
{error, term()} when
Result :: map() | undefined,
Error :: {binary(), binary()}.
request(Client, Action, Input, Options) ->
Client1 = Client#{service => <<"elasticmapreduce">>},
Host = get_host(<<"elasticmapreduce">>, Client1),
URL = get_url(Host, Client1),
Headers = [{<<"Host">>, Host},
{<<"Content-Type">>, <<"application/x-amz-json-1.1">>},
{<<"X-Amz-Target">>, << <<"ElasticMapReduce.">>/binary, Action/binary>>}],
Payload = jsx:encode(Input),
Headers1 = aws_request:sign_request(Client1, <<"POST">>, URL, Headers, Payload),
Response = hackney:request(post, URL, Headers1, Payload, Options),
handle_response(Response).
handle_response({ok, 200, ResponseHeaders, Client}) ->
case hackney:body(Client) of
{ok, <<>>} ->
{ok, undefined, {200, ResponseHeaders, Client}};
{ok, Body} ->
Result = jsx:decode(Body, [return_maps]),
{ok, Result, {200, ResponseHeaders, Client}}
end;
handle_response({ok, StatusCode, ResponseHeaders, Client}) ->
{ok, Body} = hackney:body(Client),
Error = jsx:decode(Body, [return_maps]),
Exception = maps:get(<<"__type">>, Error, undefined),
Reason = maps:get(<<"message">>, Error, undefined),
{error, {Exception, Reason}, {StatusCode, ResponseHeaders, Client}};
handle_response({error, Reason}) ->
{error, Reason}.
get_host(_EndpointPrefix, #{region := <<"local">>}) ->
<<"localhost">>;
get_host(EndpointPrefix, #{region := Region, endpoint := Endpoint}) ->
aws_util:binary_join([EndpointPrefix,
<<".">>,
Region,
<<".">>,
Endpoint],
<<"">>).
get_url(Host, Client) ->
Proto = maps:get(proto, Client),
Port = maps:get(port, Client),
aws_util:binary_join([Proto, <<"://">>, Host, <<":">>, Port, <<"/">>],
<<"">>).