🐘 Amazon EMR
When data outgrows one server, the work spreads across a cluster of servers.
EMR (Elastic MapReduce) is AWS's managed big data service — not a database. It makes it easy to create and manage Hadoop clusters that process massive datasets with popular open-source big data frameworks.
🎯 Exam Tip
✅ EMR = Elastic MapReduce
✅ Not a database
✅ Creates and manages Hadoop clusters
✅ Built for big data processing/analytics
✅ Question mentions a Hadoop cluster → answer is usually EMR
🧠 Core Idea
<meta charset="utf-8">
<div class="infographic-emr2">
<style>
.infographic-emr2 {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f6f4ef;
--line: #e2ddd0;
--storage: #4a6fa5;
--storage-soft: #e6ecf6;
--compute: #d9791f;
--compute-soft: #fbead3;
--display-font: 'Fraunces', Georgia, serif;
--body-font: 'Inter', system-ui, -apple-system, sans-serif;
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-emr2[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1c1c22;
--line: #2c313d;
--storage: #7fa3d9;
--storage-soft: #1c2740;
--compute: #e8a15c;
--compute-soft: #3a2a15;
}
.infographic-emr2 * { box-sizing: border-box; }
.infographic-emr2 .wrap { padding: 0 clamp(1.25rem, 5vw, 3rem); }
.infographic-emr2 h1 {
text-align: center; font-family: var(--display-font); font-weight: 600;
font-size: clamp(1.3rem, 3.4vw, 1.7rem); margin: 1.75rem 0 2.25rem;
}
.infographic-emr2 h1 .compute-word { color: var(--compute); }
.infographic-emr2 h1 .storage-word { color: var(--storage); }
.infographic-emr2 .flow-row {
display: grid; grid-template-columns: 1fr auto 1.5fr auto 1fr;
align-items: center; gap: 0.5rem; margin-bottom: 1.5rem;
}
.infographic-emr2 .block { text-align: center; }
.infographic-emr2 .block-icon {
width: 84px; height: 84px; border-radius: 18px; display: flex; align-items: center; justify-content: center;
margin: 0 auto 0.7rem;
}
.infographic-emr2 .block-icon svg { width: 40px; height: 40px; stroke: var(--paper); }
.infographic-emr2 .block.storage .block-icon { background: var(--storage); }
.infographic-emr2 .block.output .block-icon { background: var(--storage); }
.infographic-emr2 .block-title { font-family: var(--display-font); font-weight: 700; font-size: 1.05rem; }
.infographic-emr2 .block.storage .block-title, .infographic-emr2 .block.output .block-title { color: var(--storage); }
.infographic-emr2 .block-sub { font-size: 0.72rem; color: var(--ink-soft); margin-top: 0.15rem; letter-spacing: 0.02em; }
.infographic-emr2 .arrow-col { display: flex; align-items: center; justify-content: center; }
.infographic-emr2 .arrow-col svg { width: 30px; height: 30px; stroke: var(--ink-soft); }
.infographic-emr2 .cluster {
position: relative;
border: 2px dashed var(--compute); border-radius: 16px; padding: 1.3rem 1rem 1rem;
background: var(--compute-soft);
}
.infographic-emr2 .cluster-label {
font-family: var(--display-font); font-weight: 700; font-size: 1.15rem; color: var(--compute);
text-align: center; margin-bottom: 0.85rem;
}
.infographic-emr2 .node-team { display: flex; align-items: flex-end; justify-content: center; gap: 0.55rem; margin-bottom: 0.6rem; }
.infographic-emr2 .node {
border-radius: 9px; background: var(--compute); display: flex; align-items: center; justify-content: center;
}
.infographic-emr2 .node svg { stroke: var(--paper); }
.infographic-emr2 .node.leader { width: 46px; height: 54px; }
.infographic-emr2 .node.leader svg { width: 24px; height: 24px; }
.infographic-emr2 .node.worker { width: 34px; height: 40px; }
.infographic-emr2 .node.worker svg { width: 17px; height: 17px; }
.infographic-emr2 .temp-badge {
display: flex; align-items: center; justify-content: center; gap: 0.3rem;
font-size: 0.7rem; font-weight: 600; color: var(--compute); text-transform: uppercase; letter-spacing: 0.04em;
}
.infographic-emr2 .temp-badge svg { width: 13px; height: 13px; stroke: var(--compute); }
.infographic-emr2 .no-storage-badge {
position: absolute; top: -14px; right: -14px;
width: 34px; height: 34px; border-radius: 999px; background: var(--paper);
border: 1.5px solid var(--line); display: flex; align-items: center; justify-content: center;
}
.infographic-emr2 .no-storage-badge svg { width: 18px; height: 18px; stroke: var(--ink-soft); }
.infographic-emr2 .legend { display: flex; justify-content: center; gap: 1.5rem; margin: 0 0 2rem; }
.infographic-emr2 .legend-item { display: flex; align-items: center; gap: 0.4rem; font-size: 0.8rem; font-weight: 600; color: var(--ink-soft); }
.infographic-emr2 .legend-item .dot { width: 10px; height: 10px; border-radius: 999px; }
.infographic-emr2 .legend-item.storage .dot { background: var(--storage); }
.infographic-emr2 .legend-item.compute .dot { background: var(--compute); }
.infographic-emr2 footer.note {
color: var(--ink-soft); font-size: 0.78rem; margin: 0 0 1.75rem; text-align: center;
}
@media (max-width: 680px) {
.infographic-emr2 .flow-row { grid-template-columns: 1fr; }
.infographic-emr2 .arrow-col svg { transform: rotate(90deg); }
}
</style>
<div class="wrap">
<h1><span class="compute-word">Compute</span>, not <span class="storage-word">storage</span></h1>
<div class="flow-row">
<div class="block storage">
<div class="block-icon">
<svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M3 5V19A9 3 0 0 0 21 19V5"/><path d="M3 12A9 3 0 0 0 21 12"/></svg>
</div>
<div class="block-title">Your Data</div>
<div class="block-sub">S3 / HDFS</div>
</div>
<div class="arrow-col">
<svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="m13 5 7 7-7 7"/></svg>
</div>
<div class="cluster">
<div class="no-storage-badge">
<svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M3 5V19A9 3 0 0 0 21 19V5"/><path d="M3 12A9 3 0 0 0 21 12"/><line x1="3" y1="3" x2="21" y2="21"/></svg>
</div>
<div class="cluster-label">EMR Cluster</div>
<div class="node-team">
<div class="node worker"><svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="16" rx="2"/><line x1="6" y1="8" x2="6" y2="8"/><line x1="10" y1="8" x2="18" y2="8"/><line x1="6" y1="12" x2="6" y2="12"/><line x1="10" y1="12" x2="18" y2="12"/></svg></div>
<div class="node leader"><svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="16" rx="2"/><line x1="6" y1="8" x2="6" y2="8"/><line x1="10" y1="8" x2="18" y2="8"/><line x1="6" y1="12" x2="6" y2="12"/><line x1="10" y1="12" x2="18" y2="12"/></svg></div>
<div class="node worker"><svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="16" rx="2"/><line x1="6" y1="8" x2="6" y2="8"/><line x1="10" y1="8" x2="18" y2="8"/><line x1="6" y1="12" x2="6" y2="12"/><line x1="10" y1="12" x2="18" y2="12"/></svg></div>
<div class="node worker"><svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="16" rx="2"/><line x1="6" y1="8" x2="6" y2="8"/><line x1="10" y1="8" x2="18" y2="8"/><line x1="6" y1="12" x2="6" y2="12"/><line x1="10" y1="12" x2="18" y2="12"/></svg></div>
</div>
<div class="temp-badge">
<svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>
temporary
</div>
</div>
<div class="arrow-col">
<svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="m13 5 7 7-7 7"/></svg>
</div>
<div class="block output">
<div class="block-icon">
<svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3v18h18"/><rect x="7" y="13" width="3" height="5"/><rect x="12" y="9" width="3" height="9"/><rect x="17" y="6" width="3" height="12"/></svg>
</div>
<div class="block-title">Results</div>
<div class="block-sub">back to storage</div>
</div>
</div>
<div class="legend">
<div class="legend-item storage"><span class="dot"></span>storage</div>
<div class="legend-item compute"><span class="dot"></span>compute</div>
</div>
</div>
</div>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-emr2')
|| document.querySelector('.infographic-emr2');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
</script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Fraunces:wght@500;600;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">Unlike RDS or Redshift, EMR doesn't store your application's data. It provides the compute infrastructure to process and analyze large datasets — think of it as a service that builds and runs a team of computers on one big data job.
🏗️ What is a Hadoop Cluster?
<meta charset="utf-8">
<!-- Hadoop cluster: a big dataset splits across many EC2 nodes, each processes its piece in parallel, results merge back. -->
<div class="infographic-hadoop">
<header class="hc-head">
<div class="hc-controls">
<button class="hc-btn hc-play" type="button" aria-label="Play">
<svg class="icon-play" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="6 3 20 12 6 21 6 3"/></svg>
<svg class="icon-pause" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/></svg>
<span class="hc-btn-label">Play</span>
</button>
<button class="hc-btn hc-restart" type="button" aria-label="Restart">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12a9 9 0 1 0 3-6.7"/><path d="M3 4v5h5"/></svg>
</button>
</div>
<p class="hc-status" aria-live="polite"> </p>
</header>
<div class="hc-canvas">
<svg viewBox="0 0 900 460" xmlns="http://www.w3.org/2000/svg" class="hc-svg">
<!-- dataset -->
<rect x="418" y="24" width="64" height="64" rx="14" class="tile tile--data"/>
<g id="hc-dataset-icon" transform="translate(450,56)">
<g stroke="var(--paper)" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" fill="none">
<rect x="-16" y="-16" width="32" height="32" rx="3"/>
<line x1="-16" y1="-5" x2="16" y2="-5"/>
<line x1="-16" y1="5" x2="16" y2="5"/>
</g>
</g>
<text x="450" y="112" text-anchor="middle" class="node-label">Large Dataset</text>
<!-- cluster frame -->
<rect x="90" y="128" width="720" height="188" rx="16" class="cluster-frame"/>
<text x="118" y="154" class="cluster-title">Hadoop Cluster</text>
<text x="782" y="154" text-anchor="end" class="cluster-caption">dozens — hundreds of EC2 instances</text>
<!-- connectors: dataset -> nodes -->
<line id="hc-in-0" x1="450" y1="90" x2="230" y2="176" class="connector"/>
<line id="hc-in-1" x1="450" y1="90" x2="340" y2="238" class="connector"/>
<line id="hc-in-2" x1="450" y1="90" x2="450" y2="176" class="connector"/>
<line id="hc-in-3" x1="450" y1="90" x2="560" y2="238" class="connector"/>
<line id="hc-in-4" x1="450" y1="90" x2="670" y2="176" class="connector"/>
<!-- connectors: nodes -> result -->
<line id="hc-out-0" x1="230" y1="204" x2="450" y2="354" class="connector"/>
<line id="hc-out-1" x1="340" y1="266" x2="450" y2="354" class="connector"/>
<line id="hc-out-2" x1="450" y1="204" x2="450" y2="354" class="connector"/>
<line id="hc-out-3" x1="560" y1="266" x2="450" y2="354" class="connector"/>
<line id="hc-out-4" x1="670" y1="204" x2="450" y2="354" class="connector"/>
<!-- motion paths -->
<path id="hc-path-in-0" d="M450,92 L232,178" fill="none" stroke="none"/>
<path id="hc-path-in-1" d="M450,92 L342,236" fill="none" stroke="none"/>
<path id="hc-path-in-2" d="M450,92 L450,178" fill="none" stroke="none"/>
<path id="hc-path-in-3" d="M450,92 L558,236" fill="none" stroke="none"/>
<path id="hc-path-in-4" d="M450,92 L668,178" fill="none" stroke="none"/>
<path id="hc-path-out-0" d="M230,202 L448,352" fill="none" stroke="none"/>
<path id="hc-path-out-1" d="M340,264 L448,352" fill="none" stroke="none"/>
<path id="hc-path-out-2" d="M450,202 L450,352" fill="none" stroke="none"/>
<path id="hc-path-out-3" d="M560,264 L452,352" fill="none" stroke="none"/>
<path id="hc-path-out-4" d="M670,202 L452,352" fill="none" stroke="none"/>
<!-- pulses -->
<circle r="5.5" class="pulse pulse--in" id="hc-pulse-in-0" opacity="0"><animateMotion id="hc-motion-in-0" dur="0.5s" begin="indefinite" fill="freeze" calcMode="linear"><mpath href="#hc-path-in-0"/></animateMotion></circle>
<circle r="5.5" class="pulse pulse--in" id="hc-pulse-in-1" opacity="0"><animateMotion id="hc-motion-in-1" dur="0.5s" begin="indefinite" fill="freeze" calcMode="linear"><mpath href="#hc-path-in-1"/></animateMotion></circle>
<circle r="5.5" class="pulse pulse--in" id="hc-pulse-in-2" opacity="0"><animateMotion id="hc-motion-in-2" dur="0.5s" begin="indefinite" fill="freeze" calcMode="linear"><mpath href="#hc-path-in-2"/></animateMotion></circle>
<circle r="5.5" class="pulse pulse--in" id="hc-pulse-in-3" opacity="0"><animateMotion id="hc-motion-in-3" dur="0.5s" begin="indefinite" fill="freeze" calcMode="linear"><mpath href="#hc-path-in-3"/></animateMotion></circle>
<circle r="5.5" class="pulse pulse--in" id="hc-pulse-in-4" opacity="0"><animateMotion id="hc-motion-in-4" dur="0.5s" begin="indefinite" fill="freeze" calcMode="linear"><mpath href="#hc-path-in-4"/></animateMotion></circle>
<circle r="5.5" class="pulse pulse--out" id="hc-pulse-out-0" opacity="0"><animateMotion id="hc-motion-out-0" dur="0.5s" begin="indefinite" fill="freeze" calcMode="linear"><mpath href="#hc-path-out-0"/></animateMotion></circle>
<circle r="5.5" class="pulse pulse--out" id="hc-pulse-out-1" opacity="0"><animateMotion id="hc-motion-out-1" dur="0.5s" begin="indefinite" fill="freeze" calcMode="linear"><mpath href="#hc-path-out-1"/></animateMotion></circle>
<circle r="5.5" class="pulse pulse--out" id="hc-pulse-out-2" opacity="0"><animateMotion id="hc-motion-out-2" dur="0.5s" begin="indefinite" fill="freeze" calcMode="linear"><mpath href="#hc-path-out-2"/></animateMotion></circle>
<circle r="5.5" class="pulse pulse--out" id="hc-pulse-out-3" opacity="0"><animateMotion id="hc-motion-out-3" dur="0.5s" begin="indefinite" fill="freeze" calcMode="linear"><mpath href="#hc-path-out-3"/></animateMotion></circle>
<circle r="5.5" class="pulse pulse--out" id="hc-pulse-out-4" opacity="0"><animateMotion id="hc-motion-out-4" dur="0.5s" begin="indefinite" fill="freeze" calcMode="linear"><mpath href="#hc-path-out-4"/></animateMotion></circle>
<!-- EC2 nodes -->
<g class="ec2-node" id="hc-node-0" transform="translate(230,190)">
<circle r="38" class="hit-ring"/>
<rect x="-25" y="-25" width="50" height="50" rx="10" class="tile tile--compute"/>
<g stroke="var(--paper)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none"><rect x="-14" y="-14" width="28" height="28" rx="3"/><line x1="-8" y1="-6" x2="8" y2="-6"/><line x1="-8" y1="2" x2="8" y2="2"/></g>
</g>
<g class="ec2-node" id="hc-node-1" transform="translate(340,252)">
<circle r="38" class="hit-ring"/>
<rect x="-25" y="-25" width="50" height="50" rx="10" class="tile tile--compute"/>
<g stroke="var(--paper)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none"><rect x="-14" y="-14" width="28" height="28" rx="3"/><line x1="-8" y1="-6" x2="8" y2="-6"/><line x1="-8" y1="2" x2="8" y2="2"/></g>
</g>
<g class="ec2-node" id="hc-node-2" transform="translate(450,190)">
<circle r="38" class="hit-ring"/>
<rect x="-25" y="-25" width="50" height="50" rx="10" class="tile tile--compute"/>
<g stroke="var(--paper)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none"><rect x="-14" y="-14" width="28" height="28" rx="3"/><line x1="-8" y1="-6" x2="8" y2="-6"/><line x1="-8" y1="2" x2="8" y2="2"/></g>
</g>
<g class="ec2-node" id="hc-node-3" transform="translate(560,252)">
<circle r="38" class="hit-ring"/>
<rect x="-25" y="-25" width="50" height="50" rx="10" class="tile tile--compute"/>
<g stroke="var(--paper)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none"><rect x="-14" y="-14" width="28" height="28" rx="3"/><line x1="-8" y1="-6" x2="8" y2="-6"/><line x1="-8" y1="2" x2="8" y2="2"/></g>
</g>
<g class="ec2-node" id="hc-node-4" transform="translate(670,190)">
<circle r="38" class="hit-ring"/>
<rect x="-25" y="-25" width="50" height="50" rx="10" class="tile tile--compute"/>
<g stroke="var(--paper)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none"><rect x="-14" y="-14" width="28" height="28" rx="3"/><line x1="-8" y1="-6" x2="8" y2="-6"/><line x1="-8" y1="2" x2="8" y2="2"/></g>
</g>
<!-- result -->
<rect x="418" y="354" width="64" height="64" rx="14" class="tile tile--data"/>
<g transform="translate(450,386)">
<g stroke="var(--paper)" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" fill="none">
<path d="M-13,0 -4,9 13,-9"/>
</g>
</g>
<text x="450" y="436" text-anchor="middle" class="node-label">Processed Together</text>
</svg>
</div>
</div>
<style>
.infographic-hadoop {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f6f4ef;
--line: #e2ddd0;
--data: #4a6fa5;
--compute: #d9791f;
--compute-soft: #fbead3;
--success: #1e8e5a;
--accent: #2563eb;
--display-font: 'Fraunces', Georgia, serif;
--body-font: 'Inter', system-ui, -apple-system, sans-serif;
box-sizing: border-box;
max-width: 900px;
margin: 0 auto;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-hadoop[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1c1c22;
--line: #2c313d;
--data: #7fa3d9;
--compute: #e8a15c;
--compute-soft: #3a2a15;
--success: #4caf7d;
--accent: #5b8def;
}
.infographic-hadoop * { box-sizing: border-box; }
.infographic-hadoop .hc-head { text-align: center; padding: 0.5rem clamp(1rem, 4vw, 2rem) 0.25rem; }
.infographic-hadoop .hc-controls { display: inline-flex; align-items: center; gap: 0.6rem; }
.infographic-hadoop .hc-btn {
display: inline-flex; align-items: center; gap: 0.45rem;
background: var(--accent); color: var(--paper); border: none; border-radius: 999px;
padding: 0.55rem 1.1rem; font-family: inherit; font-size: 0.88rem; font-weight: 600;
cursor: pointer; transition: opacity 0.15s;
}
.infographic-hadoop .hc-btn:hover { opacity: 0.88; }
.infographic-hadoop .hc-restart { background: var(--paper-alt); color: var(--ink); border: 1px solid var(--line); padding: 0.55rem 0.7rem; }
.infographic-hadoop .hc-btn svg { width: 15px; height: 15px; }
.infographic-hadoop .icon-pause { display: none; }
.infographic-hadoop .hc-play.is-playing .icon-play { display: none; }
.infographic-hadoop .hc-play.is-playing .icon-pause { display: inline-block; }
.infographic-hadoop .hc-status { margin: 0.6rem 0 0; font-size: 0.88rem; font-weight: 600; color: var(--ink-soft); min-height: 1.2em; }
.infographic-hadoop .hc-canvas { padding: 0 clamp(0.75rem, 3vw, 2rem) 1rem; }
.infographic-hadoop .hc-svg { width: 100%; height: auto; display: block; overflow: visible; }
.infographic-hadoop .tile--data { fill: var(--data); }
.infographic-hadoop .tile--compute { fill: var(--compute); }
.infographic-hadoop .node-label { font-family: var(--display-font); font-weight: 600; font-size: 15px; fill: var(--ink); }
.infographic-hadoop .cluster-frame { fill: var(--compute-soft); stroke: var(--compute); stroke-width: 1.75; stroke-dasharray: 4 4; opacity: 0.55; }
.infographic-hadoop .cluster-title { font-family: var(--display-font); font-weight: 700; font-size: 16px; fill: var(--compute); }
.infographic-hadoop .cluster-caption { font-size: 11.5px; fill: var(--ink-soft); font-style: italic; font-family: var(--body-font); }
.infographic-hadoop .connector { stroke: var(--line); stroke-width: 1.25; opacity: 0.8; }
.infographic-hadoop .connector.is-flowing-in { stroke: var(--data); stroke-width: 2; }
.infographic-hadoop .connector.is-flowing-out { stroke: var(--success); stroke-width: 2; }
.infographic-hadoop .pulse--in { fill: var(--data); }
.infographic-hadoop .pulse--out { fill: var(--success); }
.infographic-hadoop .hit-ring { fill: none; stroke: var(--compute); stroke-width: 3; stroke-dasharray: 7 6; opacity: 0; transform-box: fill-box; transform-origin: center; }
.infographic-hadoop .ec2-node.is-processing .hit-ring { opacity: 0.75; animation: hc-spin-pulse 0.9s ease-in-out infinite; }
@keyframes hc-spin-pulse { 0%, 100% { opacity: 0.35; transform: scale(1); } 50% { opacity: 0.8; transform: scale(1.08); } }
.infographic-hadoop .ec2-node.is-processing .tile--compute { filter: brightness(1.12); }
@media (prefers-reduced-motion: reduce) {
.infographic-hadoop * { transition-duration: 0.001ms !important; animation-duration: 0.001ms !important; }
}
</style>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-hadoop')
|| document.querySelector('.infographic-hadoop');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
var reducedMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
var playBtn = wrapper.querySelector('.hc-play');
var playLabel = wrapper.querySelector('.hc-btn-label');
var restartBtn = wrapper.querySelector('.hc-restart');
var statusEl = wrapper.querySelector('.hc-status');
var N = 5;
var nodes = [], inLines = [], outLines = [], inPulses = [], outPulses = [], inMotions = [], outMotions = [];
for (var i = 0; i < N; i++) {
nodes.push(wrapper.querySelector('#hc-node-' + i));
inLines.push(wrapper.querySelector('#hc-in-' + i));
outLines.push(wrapper.querySelector('#hc-out-' + i));
inPulses.push(wrapper.querySelector('#hc-pulse-in-' + i));
outPulses.push(wrapper.querySelector('#hc-pulse-out-' + i));
inMotions.push(wrapper.querySelector('#hc-motion-in-' + i));
outMotions.push(wrapper.querySelector('#hc-motion-out-' + i));
}
function setStatus(text) { statusEl.textContent = text; }
function fireIn(dur) {
for (var i = 0; i < N; i++) {
inLines[i].classList.add('is-flowing-in');
inMotions[i].setAttribute('dur', (dur / 1000) + 's');
inPulses[i].setAttribute('opacity', reducedMotion ? '0' : '1');
try { inMotions[i].beginElement(); } catch (e) {}
}
}
function hideIn() {
for (var i = 0; i < N; i++) { inLines[i].classList.remove('is-flowing-in'); inPulses[i].setAttribute('opacity', '0'); }
}
function fireOut(dur) {
for (var i = 0; i < N; i++) {
outLines[i].classList.add('is-flowing-out');
outMotions[i].setAttribute('dur', (dur / 1000) + 's');
outPulses[i].setAttribute('opacity', reducedMotion ? '0' : '1');
try { outMotions[i].beginElement(); } catch (e) {}
}
}
function hideOut() {
for (var i = 0; i < N; i++) { outLines[i].classList.remove('is-flowing-out'); outPulses[i].setAttribute('opacity', '0'); }
}
function setProcessing(on) {
for (var i = 0; i < N; i++) { nodes[i].classList.toggle('is-processing', on); }
}
var timers = [];
var playing = false;
function after(ms, fn) { timers.push(setTimeout(fn, ms)); }
function clearTimers() { timers.forEach(clearTimeout); timers = []; }
function resetVisuals() {
hideIn(); hideOut(); setProcessing(false);
}
var speed = reducedMotion ? 0.4 : 1;
var splitDur = 550 * speed;
var processDur = 1600 * speed;
var mergeDur = 550 * speed;
var doneHold = 1000 * speed;
var loopGap = 500 * speed;
function runCycle() {
if (!playing) return;
var t = 0;
after(t, function () {
setStatus('A large dataset arrives');
});
t += 400 * speed;
after(t, function () {
setStatus('Split across the cluster \u2014 each node gets a piece');
fireIn(splitDur);
});
t += splitDur;
after(t, function () { hideIn(); });
after(t, function () {
setStatus('Every node processes its piece \u2014 all at once, in parallel');
setProcessing(true);
});
t += processDur;
after(t, function () {
setProcessing(false);
setStatus('Results merge back together');
fireOut(mergeDur);
});
t += mergeDur;
after(t, function () { hideOut(); });
after(t, function () {
setStatus('Processed as one \u2014 instead of a single machine doing it all');
});
t += doneHold + loopGap;
after(t, function () { if (playing) runCycle(); });
}
function play() {
if (playing) return;
playing = true;
playBtn.classList.add('is-playing');
playLabel.textContent = 'Pause';
runCycle();
}
function pause() {
playing = false;
clearTimers();
playBtn.classList.remove('is-playing');
playLabel.textContent = 'Play';
}
function restart() {
clearTimers();
resetVisuals();
setStatus('\u00A0');
if (playing) { runCycle(); }
}
playBtn.addEventListener('click', function () {
if (playing) { pause(); } else { play(); }
});
restartBtn.addEventListener('click', restart);
})();
</script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Fraunces:wght@500;600;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">A group of computers that split up a large dataset and process it together, instead of one machine doing it all. A cluster can span dozens or hundreds of EC2 instances.
⚙️ What Does EMR Do?
Building this by hand means launching instances, installing Hadoop, configuring networking, connecting servers, and scaling manually.
EMR automates it all:
Provisions the EC2 instances
Installs and configures the Hadoop ecosystem
Connects everything into a working cluster
Manages scaling as workload changes
You focus on analyzing data, not managing infrastructure.
🧩 Supported Frameworks
Apache Hadoop
Apache Spark
Apache HBase
Presto
Apache Flink
For the exam, you just need to recognize EMR supports these — no need to know how each works.
📊 Auto Scaling — EMR adds/removes EC2 instances based on workload, no manual resizing
💰 Spot Instances — big data jobs often tolerate interruptions, making Spot a cost-effective fit for EMR
Big data processing, large-scale analytics, machine learning, web indexing, and any job requiring massive datasets to be processed efficiently.
📝 Summary
🐘 EMR = Elastic MapReduce
🚫 Not a database
🏗️ Creates/manages Hadoop clusters — multiple EC2 instances working together
⚙️ Auto-provisions, configures, and manages the cluster
🧩 Supports Hadoop, Spark, HBase, Presto, Flink
📈 Includes Auto Scaling and Spot Instance integration for efficiency/cost
🎯 Exam takeaway: "Hadoop cluster" or "big data processing" → Amazon EMR