<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sanjeev Kumar</title>
    <description>The latest articles on DEV Community by Sanjeev Kumar (@sanjeev_kumar_g03).</description>
    <link>https://dev.to/sanjeev_kumar_g03</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3869181%2F061e1095-8551-4131-a7e2-2d04ecf4af48.png</url>
      <title>DEV Community: Sanjeev Kumar</title>
      <link>https://dev.to/sanjeev_kumar_g03</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sanjeev_kumar_g03"/>
    <language>en</language>
    <item>
      <title>Apache Spark for Beginners #1: Why Does Spark Exist?</title>
      <dc:creator>Sanjeev Kumar</dc:creator>
      <pubDate>Mon, 10 Aug 2026 14:54:25 +0000</pubDate>
      <link>https://dev.to/sanjeev_kumar_g03/apache-spark-for-beginners-1-why-does-spark-exist-1461</link>
      <guid>https://dev.to/sanjeev_kumar_g03/apache-spark-for-beginners-1-why-does-spark-exist-1461</guid>
      <description>&lt;p&gt;I'm starting a new learning journey: &lt;strong&gt;Apache Spark&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Rather than simply watching tutorials and memorizing Spark APIs, I want to understand what Spark is actually solving, how it works internally, and why it has become such an important tool in data engineering.&lt;/p&gt;

&lt;p&gt;So this series will be my attempt to learn Spark &lt;strong&gt;in public&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I'm approaching each topic from a simple perspective:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Understand the problem first. Then understand the technology that solves it.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And before writing my first Spark program, I think there's one important question to answer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does Apache Spark exist in the first place?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is "Big Data"?
&lt;/h2&gt;

&lt;p&gt;You've probably heard the term &lt;em&gt;Big Data&lt;/em&gt; countless times.&lt;/p&gt;

&lt;p&gt;A simple definition is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Data becomes "big" when its volume, velocity, variety, or processing requirements exceed what traditional systems can handle efficiently and economically.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notice that this doesn't necessarily mean:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The data is larger than RAM."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's only one possible limitation.&lt;/p&gt;

&lt;p&gt;For example, a 2 TB dataset could theoretically be processed by a machine with enough memory. But buying and maintaining a machine with enormous amounts of RAM may not be practical or economical.&lt;/p&gt;

&lt;p&gt;The real question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;When does processing data on a single machine stop being practical?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's where distributed computing becomes interesting.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 5 Vs of Big Data
&lt;/h2&gt;

&lt;p&gt;A common way of describing Big Data is through the &lt;strong&gt;5 Vs&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;V&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Volume&lt;/td&gt;
&lt;td&gt;Amount of data&lt;/td&gt;
&lt;td&gt;Terabytes of logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Velocity&lt;/td&gt;
&lt;td&gt;Speed at which data is generated&lt;/td&gt;
&lt;td&gt;Millions of events per minute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variety&lt;/td&gt;
&lt;td&gt;Different types and formats&lt;/td&gt;
&lt;td&gt;JSON, CSV, logs, images&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Veracity&lt;/td&gt;
&lt;td&gt;Data quality and reliability&lt;/td&gt;
&lt;td&gt;Missing or inconsistent data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Value&lt;/td&gt;
&lt;td&gt;Useful information extracted from data&lt;/td&gt;
&lt;td&gt;Customer insights&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Not every data problem involves all five.&lt;/p&gt;

&lt;p&gt;But these dimensions help explain why traditional approaches can eventually become difficult to scale.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why Can't We Just Use Pandas?
&lt;/h1&gt;

&lt;p&gt;Let's start with something familiar.&lt;/p&gt;

&lt;p&gt;Suppose we have a sales dataset:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sales.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a reasonably sized dataset, this is perfectly fine.&lt;/p&gt;

&lt;p&gt;Pandas is an excellent tool for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data analysis&lt;/li&gt;
&lt;li&gt;Data cleaning&lt;/li&gt;
&lt;li&gt;Exploratory data analysis&lt;/li&gt;
&lt;li&gt;Prototyping&lt;/li&gt;
&lt;li&gt;Working with small and medium-sized datasets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But now imagine that the dataset is &lt;strong&gt;500 GB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your laptop might have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPU: 8 cores
RAM: 16 GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trying to load hundreds of gigabytes into memory on that machine isn't practical.&lt;/p&gt;

&lt;p&gt;And there's another important detail.&lt;/p&gt;

&lt;p&gt;A CSV file's size on disk isn't necessarily the same as the memory required by the resulting DataFrame.&lt;/p&gt;

&lt;p&gt;Pandas needs memory for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data values&lt;/li&gt;
&lt;li&gt;Column structures&lt;/li&gt;
&lt;li&gt;Indexes&lt;/li&gt;
&lt;li&gt;Strings&lt;/li&gt;
&lt;li&gt;Internal data structures&lt;/li&gt;
&lt;li&gt;Other memory overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So a 10 GB CSV can require significantly more than 10 GB of RAM when loaded into memory.&lt;/p&gt;

&lt;p&gt;Eventually, the single-machine approach reaches a limit.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Single-Machine Problem
&lt;/h1&gt;

&lt;p&gt;Imagine we have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10 TB of data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but our server has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;64 GB RAM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can't simply load the entire dataset into memory.&lt;/p&gt;

&lt;p&gt;One option would be to buy a much larger machine.&lt;/p&gt;

&lt;p&gt;That brings us to &lt;strong&gt;vertical scaling&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Vertical Scaling
&lt;/h1&gt;

&lt;p&gt;Vertical scaling means making one machine more powerful.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before

┌───────────────────┐
│      Server       │
│                   │
│   8 CPU cores     │
│   32 GB RAM       │
└───────────────────┘

          ↓

After

┌───────────────────┐
│      Server       │
│                   │
│   64 CPU cores    │
│   256 GB RAM      │
└───────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can work very well for many workloads.&lt;/p&gt;

&lt;p&gt;But it has limitations.&lt;/p&gt;

&lt;p&gt;Hardware becomes increasingly expensive, and eventually there are physical and economic limits to how large a single machine can become.&lt;/p&gt;

&lt;p&gt;So we have another option.&lt;/p&gt;




&lt;h1&gt;
  
  
  Horizontal Scaling
&lt;/h1&gt;

&lt;p&gt;Instead of buying one enormous machine, we can use multiple machines.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;              10 TB Dataset
                    │
       ┌────────────┼────────────┐
       ↓            ↓            ↓
   Server 1     Server 2     Server 3
    3.3 TB        3.3 TB        3.4 TB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each machine can process part of the dataset.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;horizontal scaling&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;One extremely powerful machine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Many machines working together
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This leads us to an important concept named distributed computing.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Is Distributed Computing?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Distributed computing&lt;/strong&gt; is an approach where multiple computers work together over a network to solve a problem by dividing the workload among them.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 Dataset
                    │
          ┌─────────┼─────────┐
          ↓         ↓         ↓
       Worker 1  Worker 2  Worker 3
          │         │         │
       Part A    Part B    Part C
          │         │         │
          └─────────┼─────────┘
                    ↓
             Combined Result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of one machine processing everything, different machines process different portions of the workload.&lt;/p&gt;

&lt;p&gt;And because they can work &lt;strong&gt;in parallel&lt;/strong&gt;, the total processing time can potentially be reduced significantly.&lt;/p&gt;




&lt;h1&gt;
  
  
  But Distributed Computing Isn't Free
&lt;/h1&gt;

&lt;p&gt;At first, distributed computing sounds simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Just add more machines."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unfortunately, it isn't that easy.&lt;/p&gt;

&lt;p&gt;Imagine a cluster containing hundreds of machines.&lt;/p&gt;

&lt;p&gt;Now we have new problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  What if a machine fails?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Worker 1 ✓
Worker 2 ✓
Worker 3 ✗
Worker 4 ✓
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What happens to the work assigned to Worker 3?&lt;/p&gt;




&lt;h3&gt;
  
  
  How do we divide the data?
&lt;/h3&gt;

&lt;p&gt;We need to decide which machine processes which portion of the dataset.&lt;/p&gt;




&lt;h3&gt;
  
  
  How do machines communicate?
&lt;/h3&gt;

&lt;p&gt;The machines need to exchange information over a network.&lt;/p&gt;

&lt;p&gt;Network communication isn't free.&lt;/p&gt;




&lt;h3&gt;
  
  
  How do we combine the results?
&lt;/h3&gt;

&lt;p&gt;Each machine produces partial results.&lt;/p&gt;

&lt;p&gt;We eventually need to combine them into the final result.&lt;/p&gt;




&lt;h3&gt;
  
  
  What if one machine is much slower?
&lt;/h3&gt;

&lt;p&gt;Suppose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Worker 1 → 10 seconds
Worker 2 → 12 seconds
Worker 3 → 11 seconds
Worker 4 → 3 minutes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The entire operation may have to wait for the slow worker.&lt;/p&gt;

&lt;p&gt;This is one of the challenges of distributed systems.&lt;/p&gt;




&lt;h1&gt;
  
  
  So We Have a New Problem
&lt;/h1&gt;

&lt;p&gt;We've gone from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Single Machine
      │
      ↓
Data becomes too large
      │
      ↓
Add more machines
      │
      ↓
Distributed Computing
      │
      ↓
Now we need to coordinate
      │
      ↓
Distributed Processing Frameworks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And this is where technologies such as &lt;strong&gt;Hadoop&lt;/strong&gt; and later &lt;strong&gt;Apache Spark&lt;/strong&gt; come into the picture.&lt;/p&gt;




&lt;h1&gt;
  
  
  Where Does Apache Spark Fit?
&lt;/h1&gt;

&lt;p&gt;At a very high level:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             Large Dataset
                   │
                   ↓
        ┌─────────────────────┐
        │ Distributed         │
        │ Processing          │
        └──────────┬──────────┘
                   │
          ┌────────┴────────┐
          ↓                 ↓
       Hadoop             Spark
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hadoop introduced a widely used ecosystem for distributed storage and processing.&lt;/p&gt;

&lt;p&gt;Spark later became popular as a powerful distributed computing engine capable of handling a wide variety of workloads.&lt;/p&gt;

&lt;p&gt;We'll explore the history and differences in the next article.&lt;/p&gt;




&lt;h1&gt;
  
  
  An Important Clarification
&lt;/h1&gt;

&lt;p&gt;It's easy to misunderstand this topic and conclude:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Pandas is bad and Spark is good."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's not the right way to think about it.&lt;/p&gt;

&lt;p&gt;Pandas and Spark solve different problems.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pandas
  ↓
Single-machine data analysis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Spark
  ↓
Distributed data processing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And Spark isn't automatically better just because the dataset is large.&lt;/p&gt;

&lt;p&gt;If you're processing a small dataset on your laptop, using Spark could introduce unnecessary complexity.&lt;/p&gt;

&lt;p&gt;The right question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What processing architecture is appropriate for this workload?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's an important mindset for a data engineer.&lt;/p&gt;




&lt;h1&gt;
  
  
  My First Hands-On Experiment
&lt;/h1&gt;

&lt;p&gt;To understand this problem instead of simply reading about it, I created a CSV file containing &lt;strong&gt;1 million rows&lt;/strong&gt; and measured how long Pandas took to load it.&lt;/p&gt;

&lt;p&gt;The experiment was simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Generate CSV
      ↓
Measure file size
      ↓
Check system RAM
      ↓
Load with Pandas
      ↓
Measure loading time
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code looked roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;

&lt;span class="n"&gt;file_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;millions_of_rows.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;total_rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;

&lt;span class="n"&gt;start_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;perf_counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total_rows&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Person_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
        &lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;creation_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;perf_counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start_time&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CSV created in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;creation_time&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; seconds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;file_size_bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getsize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;file_size_mb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;file_size_bytes&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;ram&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;virtual_memory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;total_ram_gb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;available_ram_gb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;available&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;File size: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;file_size_mb&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; MB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Total RAM: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total_ram_gb&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; GB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Available RAM: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;available_ram_gb&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; GB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reading CSV using Pandas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;start_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;perf_counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;loading_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;perf_counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start_time&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rows loaded: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Columns loaded: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Loading time: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;loading_time&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; seconds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The purpose wasn't to prove that Pandas is slow.&lt;/p&gt;

&lt;p&gt;The purpose was to observe what happens as the amount of data increases.&lt;/p&gt;

&lt;p&gt;A useful follow-up experiment would be to compare:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100K rows
500K rows
1M rows
5M rows
10M rows
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File size&lt;/li&gt;
&lt;li&gt;Loading time&lt;/li&gt;
&lt;li&gt;Memory consumption&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives a much better intuition for the single-machine limitation.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Bigger Picture
&lt;/h1&gt;

&lt;p&gt;At this point, the evolution should look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 Data
                  │
                  ↓
        Single-machine tools
        ┌─────────┴─────────┐
        │                   │
     Pandas             Databases
        │                   │
        └─────────┬─────────┘
                  │
                  ↓
           Data gets larger
                  │
                  ↓
       Single machine becomes
          less practical
                  │
                  ↓
       Horizontal Scaling
                  │
                  ↓
       Distributed Computing
                  │
                  ↓
            Hadoop / Spark
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the foundation we need before learning Spark.&lt;/p&gt;




&lt;h1&gt;
  
  
  What I Learned
&lt;/h1&gt;

&lt;p&gt;The biggest takeaway from this lesson for me was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Spark isn't the starting point of the story. Distributed computing is.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Before learning Spark APIs, it's important to understand why distributing computation across multiple machines becomes necessary in the first place.&lt;/p&gt;

&lt;p&gt;The key concepts I want to remember are:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Big Data
&lt;/h3&gt;

&lt;p&gt;Data becomes challenging when its scale or processing requirements exceed what traditional approaches can handle efficiently.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Vertical Scaling
&lt;/h3&gt;

&lt;p&gt;Make one machine more powerful.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Horizontal Scaling
&lt;/h3&gt;

&lt;p&gt;Add more machines.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Distributed Computing
&lt;/h3&gt;

&lt;p&gt;Multiple machines work together to solve a problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The Trade-off
&lt;/h3&gt;

&lt;p&gt;Distributed systems provide scalability, but introduce complexity around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Communication&lt;/li&gt;
&lt;li&gt;Network transfer&lt;/li&gt;
&lt;li&gt;Failure handling&lt;/li&gt;
&lt;li&gt;Data partitioning&lt;/li&gt;
&lt;li&gt;Coordination&lt;/li&gt;
&lt;li&gt;Combining results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And this is exactly the problem that distributed processing frameworks are designed to help solve.&lt;/p&gt;




&lt;h1&gt;
  
  
  What's Next?
&lt;/h1&gt;

&lt;p&gt;Now that we understand &lt;strong&gt;why distributed computing is necessary&lt;/strong&gt;, we can look at the technology that popularized large-scale distributed data processing:&lt;/p&gt;

&lt;h2&gt;
  
  
  Apache Hadoop &amp;amp; MapReduce
&lt;/h2&gt;

&lt;p&gt;In the next article, I'll explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What Hadoop is&lt;/li&gt;
&lt;li&gt;Why Hadoop was created&lt;/li&gt;
&lt;li&gt;What HDFS does&lt;/li&gt;
&lt;li&gt;What MapReduce is&lt;/li&gt;
&lt;li&gt;Map vs Reduce&lt;/li&gt;
&lt;li&gt;The Shuffle phase&lt;/li&gt;
&lt;li&gt;How a distributed job actually executes&lt;/li&gt;
&lt;li&gt;Why MapReduce can become slow&lt;/li&gt;
&lt;li&gt;And finally...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why Apache Spark was created as a better approach for many workloads.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Follow the Series
&lt;/h2&gt;

&lt;p&gt;This is &lt;strong&gt;Part 1 of my Apache Spark learning journey&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I'm learning Spark from the ground up and documenting what I learn along the way-not as an expert, but as a data engineer trying to understand distributed data processing properly.&lt;/p&gt;

&lt;p&gt;If you're also learning Spark, feel free to follow along.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next:&lt;/strong&gt; &lt;em&gt;Apache Spark for Beginners #2 - Hadoop, MapReduce, and the Problem Spark Solves&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>buildinpublic</category>
      <category>dataengineering</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
