<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>資料管道 - 東東 GCP 教學 - GCP 實戰講師 - 雲上星辰有限公司</title>
	<atom:link href="https://dongdonggcp.com/tag/%E8%B3%87%E6%96%99%E7%AE%A1%E9%81%93/feed/" rel="self" type="application/rss+xml" />
	<link>https://dongdonggcp.com</link>
	<description>助你考取證照，轉職成功</description>
	<lastBuildDate>Sat, 23 Nov 2024 07:29:12 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://dongdonggcp.com/wp-content/uploads/2025/04/cropped-340838097_121391010914395_5443948698124160121_n-32x32.jpg</url>
	<title>資料管道 - 東東 GCP 教學 - GCP 實戰講師 - 雲上星辰有限公司</title>
	<link>https://dongdonggcp.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">243235092</site>	<item>
		<title>[Dataflow 教學] Dataflow 是什麼？跟 Apache Beam 有什麼關係？</title>
		<link>https://dongdonggcp.com/2024/11/23/what-is-dataflow-vs-apache-beam/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=what-is-dataflow-vs-apache-beam</link>
					<comments>https://dongdonggcp.com/2024/11/23/what-is-dataflow-vs-apache-beam/#respond</comments>
		
		<dc:creator><![CDATA[東東]]></dc:creator>
		<pubDate>Sat, 23 Nov 2024 07:29:12 +0000</pubDate>
				<category><![CDATA[Google Cloud Platform]]></category>
		<category><![CDATA[Apache Beam]]></category>
		<category><![CDATA[Data Pipeline]]></category>
		<category><![CDATA[Dataflow]]></category>
		<category><![CDATA[GCP]]></category>
		<category><![CDATA[大數據]]></category>
		<category><![CDATA[資料管道]]></category>
		<category><![CDATA[資料處理]]></category>
		<guid isPermaLink="false">https://dongdonggcp.com/?p=7975</guid>

					<description><![CDATA[<p>Dataflow 是 GCP 資料三兄弟 [&#8230;]</p>
<p>The post <a href="https://dongdonggcp.com/2024/11/23/what-is-dataflow-vs-apache-beam/">[Dataflow 教學] Dataflow 是什麼？跟 Apache Beam 有什麼關係？</a> first appeared on <a href="https://dongdonggcp.com">東東 GCP 教學 - GCP 實戰講師 - 雲上星辰有限公司</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph"><a href="https://cloud.google.com/dataflow/docs/overview">Dataflow</a> 是 GCP 資料三兄弟的老二 (依知名度排行)，你的資料要放進 <a href="https://cloud.google.com/bigquery?hl=zh-TW">BigQuery</a> 分析之前，要先整理好資料的格式，所以 GCP 強力推薦使用 Dataflow。</p>



<p class="wp-block-paragraph">為什麼不用 VM 就好？你可以直接跳到最後一段！</p>



<h2 class="wp-block-heading">一、Dataflow 是什麼？</h2>



<p class="wp-block-paragraph">想像你是一間工廠的管理者，每天都要處理大量的原物料（資料）。這些原物料需要經過各種加工程序，最後變成成品。</p>



<p class="wp-block-paragraph">GCP 的 Dataflow 就像是一個全自動的生產線系統，你只要設定好要怎麼處理這些原物料，它就會自動幫你完成所有工序，而且還會自動調整工人（運算資源）的數量。</p>



<h2 class="wp-block-heading">二、Dataflow 舉例說明</h2>



<p class="wp-block-paragraph">當然這樣子講還是有點模糊，舉個實際的例子來說：假設你需要處理每天的銷售資料，Dataflow 可以自動幫你：</p>



<ol class="wp-block-list">
<li>收集各個分店的銷售資料</li>



<li>清理不正確的資料</li>



<li>計算各種統計數字</li>



<li>把結果存到資料庫</li>
</ol>



<h2 class="wp-block-heading">三、Dataflow 跟 Apache Beam 有什麼關係？</h2>



<p class="wp-block-paragraph"><a href="https://beam.apache.org/about/">Apache Beam</a> 是 Dataflow 的原型，GCP 只是把跟 Apache Beam 做一些加值的優化，放在 GCP 上，這樣你就不用自己在地端安裝和設定 Apache Beam，節省很多準備環境 (尤其是機器的安裝設定) 的時間。</p>



<p class="wp-block-paragraph">Apache Beam 就像是一套標準的工廠作業規範。它定義了一些基本的處理方式，讓你可以用同一種方式來描述你想要的資料處理流程，不管最後是要在哪裡執行。</p>



<h2 class="wp-block-heading">四、Apache Beam 的組成元件</h2>



<p class="wp-block-paragraph">讓我們來看看它的主要組成元件：</p>



<p class="wp-block-paragraph">1. Pipeline（管線）： 這就像是整個工廠的生產線規劃圖，定義了資料要如何從原料變成成品，經過哪些步驟。</p>



<p class="wp-block-paragraph">2. PCollection（資料集合）： 把它想像成工廠裡的輸送帶，上面放著要處理的原料或半成品。每次資料經過一道處理程序，就會形成新的一條輸送帶。</p>



<p class="wp-block-paragraph">3. Transform（轉換）： 這就是工廠裡的各種加工設備，例如：</p>



<ul class="wp-block-list">
<li>ParDo：像是一個工作站，可以對每件原料進行客製化處理</li>



<li>GroupByKey：就像是分類站，把相同種類的產品集中在一起</li>



<li>Combine：類似於組裝線，把多個零件組合成一個成品</li>
</ul>



<p class="wp-block-paragraph">4. I/O Transforms（輸入輸出轉換）： 就像工廠的原料進貨口和成品出貨口，決定資料要從哪裡讀入，最後要存到哪裡去。</p>



<p class="wp-block-paragraph">5. Window（時間窗口）： 假設你想要每小時統計一次生產數量，Window 就是幫你把資料按照時間切分的工具。</p>



<p class="wp-block-paragraph">6. Trigger（觸發器）： 就像是工廠的警報系統，當某些條件達成時（比如收集到足夠的數據），就會觸發特定的處理程序。</p>



<p class="wp-block-paragraph">最重要的是，這整套系統的特色是：</p>



<ul class="wp-block-list">
<li>全自動化：設定好後就會自動運作</li>



<li>可擴展性：需要處理更多資料時，會自動增加處理能力</li>



<li>容錯能力：即使某部分出問題，系統也能自動恢復</li>



<li>即時處理：能夠處理即時流入的資料，也能處理已存在的資料</li>
</ul>



<p class="wp-block-paragraph">關於 Apache Beam 詳細說明可以參考<a href="https://beam.apache.org/about/">這份文件</a>。</p>



<h2 class="wp-block-heading">五、從具體的角度再解釋一次 Apache Beam 的組成元件</h2>



<h3 class="wp-block-heading">1. Pipeline（管線）</h3>



<p class="wp-block-paragraph">從技術角度來看，Pipeline 是整個數據處理的骨幹，它包含了所有的處理步驟和邏輯。</p>



<pre class="wp-block-code"><code># Pipeline 的基本架構
pipeline = beam.Pipeline()
result = (pipeline 
    | "讀取資料" &gt;&gt; ReadFromText('input.csv')
    | "處理資料" &gt;&gt; Process()
    | "寫入結果" &gt;&gt; WriteToText('output.txt'))</code></pre>



<p class="wp-block-paragraph">例子：處理網站日誌文件，從讀取原始日誌、解析內容、到產生報表的整個流程。</p>



<h3 class="wp-block-heading">2. PCollection（資料集合）</h3>



<p class="wp-block-paragraph">這是 Beam 中最基本的資料結構，可以存放任何型別的資料，而且是不可變的（immutable）。每次轉換都會產生新的 PCollection。</p>



<pre class="wp-block-code"><code># 一個包含用戶訪問記錄的 PCollection
visits = pipeline | beam.Create(&#091;
    {'user': 'A', 'page': '/home', 'time': '2024-01-01 10:00'},
    {'user': 'B', 'page': '/products', 'time': '2024-01-01 10:05'}
])</code></pre>



<p class="wp-block-paragraph">例子：存放使用者的點擊記錄，每筆記錄包含用戶ID、訪問頁面、時間戳等資訊。</p>



<h3 class="wp-block-heading">3. Transform（轉換） </h3>



<p class="wp-block-paragraph">轉換是對 PCollection 進行操作的處理單元。主要類型包括：</p>



<p class="wp-block-paragraph">(1) ParDo（並行處理）：</p>



<pre class="wp-block-code"><code># 解析每一行日誌並提取重要資訊
class ParseLog(beam.DoFn):
    def process(self, element):
        user, action, timestamp = element.split(',')
        return &#091;{
            'user': user,
            'action': action,
            'timestamp': timestamp
        }]

logs | beam.ParDo(ParseLog())</code></pre>



<p class="wp-block-paragraph">例子：將原始的日誌文字轉換成結構化的資料格式。</p>



<p class="wp-block-paragraph">(2) GroupByKey（分組）：</p>



<pre class="wp-block-code"><code># 依照用戶ID分組，統計每個用戶的訪問次數
user_visits = (visits 
    | beam.Map(lambda x: (x&#091;'user'], 1))
    | beam.GroupByKey()
    | beam.Map(lambda x: {x&#091;0]: sum(x&#091;1])})
)</code></pre>



<p class="wp-block-paragraph">例子：統計每個用戶在不同頁面的停留時間。</p>



<p class="wp-block-paragraph">(3) Combine（合併）：</p>



<pre class="wp-block-code"><code># 計算每個頁面的總訪問次數
page_visits = (visits
    | beam.Map(lambda x: (x&#091;'page'], 1))
    | beam.CombinePerKey(sum)
)</code></pre>



<p class="wp-block-paragraph">例子：計算網站每個頁面的總瀏覽量。</p>



<h3 class="wp-block-heading">4. I/O Transforms（輸入輸出轉換）</h3>



<pre class="wp-block-code"><code># 從多個來源讀取資料
logs = pipeline | beam.io.ReadFromText('logs/*.txt')
# 寫入到資料庫
results | beam.io.WriteToMongoDB(uri='mongodb://localhost:27017')</code></pre>



<p class="wp-block-paragraph">例子：從 S3 讀取日誌檔案，處理後寫入到 BigQuery。</p>



<h3 class="wp-block-heading">5. Window（時間窗口）</h3>



<pre class="wp-block-code"><code># 每5分鐘統計一次訪問量
windowed_counts = (visits
    | beam.WindowInto(window.FixedWindows(300))  # 5分鐘
    | beam.GroupByKey()
    | beam.Map(count_visits)
)</code></pre>



<p class="wp-block-paragraph">例子：統計每小時的活躍用戶數，或計算每分鐘的交易金額。</p>



<h3 class="wp-block-heading">6. Trigger（觸發器）</h3>



<pre class="wp-block-code"><code># 當收集到100筆資料或等待時間超過1分鐘時觸發處理
early_results = (data
    | beam.WindowInto(
        window.GlobalWindows(),
        trigger=trigger.Repeatedly(
            trigger.AfterCount(100) | 
            trigger.AfterProcessingTime(60)
        ),
        accumulation_mode=trigger.AccumulationMode.DISCARDING
    )
)</code></pre>



<p class="wp-block-paragraph">例子：即時監控系統，當檢測到異常訪問模式時立即觸發警報。</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">六、Apache Beam 實際應用整合範例</h2>



<pre class="wp-block-code"><code># 完整的網站訪問分析pipeline
def analyze_website_logs():
    with beam.Pipeline() as pipeline:
        results = (pipeline
            | "讀取日誌" &gt;&gt; beam.io.ReadFromText('logs/*.txt')
            | "解析日誌" &gt;&gt; beam.ParDo(ParseLog())
            | "加上時間窗口" &gt;&gt; beam.WindowInto(window.FixedWindows(3600))
            | "依頁面分組" &gt;&gt; beam.Map(lambda x: (x&#091;'page'], 1))
            | "計算訪問量" &gt;&gt; beam.CombinePerKey(sum)
            | "格式化輸出" &gt;&gt; beam.Map(format_output)
            | "寫入結果" &gt;&gt; beam.io.WriteToText('results.txt')
        )</code></pre>



<p class="wp-block-paragraph">這個例子展示了如何使用這些組件來建立一個完整的數據處理流程：</p>



<ol class="wp-block-list">
<li>讀取多個日誌文件</li>



<li>解析每條日誌記錄</li>



<li>設定每小時的分析窗口</li>



<li>按頁面分組並計算訪問量</li>



<li>格式化輸出結果</li>



<li>將結果寫入文件</li>
</ol>



<p class="wp-block-paragraph">這樣的資料處理管道可以處理任意大小的資料集，而且能夠自動擴展和容錯。</p>



<p class="wp-block-paragraph">需要注意的是，這些程式碼都是在本地端執行，如果要在 GCP Dataflow 上運行，只需要修改 Pipeline 的執行器設定即可，程式碼邏輯不需要改變。</p>



<h2 class="wp-block-heading">七、為什麼不自己在 VM 上寫 Python 來處理資料就好？為何要用 Dataflow？到底差在哪裡？</h2>



<p class="wp-block-paragraph">讓我用實際的例子來說明在 VM 上自己寫 Python 處理資料，與使用 Dataflow 的差異。</p>



<p class="wp-block-paragraph">情境：處理每日 100GB 的使用者點擊日誌 Log</p>



<h3 class="wp-block-heading">(一) 在 VM 上自己寫 Python 的程式碼大概長這樣子：</h3>



<pre class="wp-block-code"><code># 在單一 VM 上運行的 Python 程式碼
def process_logs():
    with open('huge_logs.txt', 'r') as file:
        for line in file:
            user_data = parse_log(line)
            # 處理記憶體不足的問題
            if memory_usage &gt; threshold:
                save_temporary_results()
                clear_memory()
            
            # 處理單機運算慢的問題
            processed_data = complex_calculation(user_data)  # 可能要跑很久
            
            # 處理機器當機的問題
            try:
                save_to_database(processed_data)
            except ConnectionError:
                retry_save(processed_data)  # 需要自己寫重試機制 (retry)</code></pre>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">可能會遇到的問題：</p>



<ol class="wp-block-list">
<li><strong>記憶體限制</strong>
<ul class="wp-block-list">
<li>VM 記憶體用完就崩潰</li>



<li>需要自己寫程式分批處理</li>



<li>要自己管理暫存資料</li>
</ul>
</li>



<li><strong>運算效能</strong>
<ul class="wp-block-list">
<li>單機處理 100GB 可能要跑一整天，花錢</li>



<li>CPU 滿載可能影響其他程式</li>



<li>擴充需要自己開更多 VM、寫分散式程式，管機器太累了</li>
</ul>
</li>



<li><strong>錯誤處理</strong>
<ul class="wp-block-list">
<li>程式崩潰要從頭重跑</li>



<li>網路斷線要自己處理</li>



<li>VM 當機就前功盡棄</li>
</ul>
</li>



<li><strong>監控和維護</strong>
<ul class="wp-block-list">
<li>要自己寫 Log</li>



<li>要自己監控 CPU/記憶體</li>



<li>要自己處理備份</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading">(二) 使用 Dataflow 的情況</h2>



<pre class="wp-block-code"><code># Dataflow 程式碼
with beam.Pipeline(options=PipelineOptions()) as pipeline:
    results = (pipeline 
        | 'ReadLogs' &gt;&gt; ReadFromText('gs://bucket/huge_logs.txt')
        | 'ParseLogs' &gt;&gt; beam.ParDo(ParseLogFn())
        | 'CalculateResults' &gt;&gt; beam.ParDo(ComplexCalculationFn())
        | 'WriteToDB' &gt;&gt; WriteToDatabase()
    )</code></pre>



<p class="wp-block-paragraph">不覺得看起來簡單很多嗎？接下來看一下 Dataflow 自動處理的部分：</p>



<ol class="wp-block-list">
<li><strong>自動擴展（Auto-scaling）</strong>
<ul class="wp-block-list">
<li>自動偵測資料量</li>



<li>自動增加/減少運算資源</li>



<li>不用擔心記憶體爆掉</li>
</ul>
</li>



<li><strong>平行處理（Parallel Processing）</strong>
<ul class="wp-block-list">
<li>自動分散工作到多台機器</li>



<li>100GB 資料可能 1 小時就處理完</li>



<li>有效利用 Google 的運算資源</li>
</ul>
</li>



<li><strong>錯誤恢復（Fault Tolerance）</strong>
<ul class="wp-block-list">
<li>某台機器掛掉會自動重試</li>



<li>網路問題自動處理</li>



<li>不會從頭重跑，從上次中斷點繼續</li>
</ul>
</li>



<li><strong>監控和維護</strong>
<ul class="wp-block-list">
<li>完整的監控儀表板</li>



<li>即時查看處理進度</li>



<li>系統層級的 Log</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading">(三) 何時用 Dataflow 或 VM？</h2>



<h3 class="wp-block-heading">什麼時候選擇 Dataflow：</h3>



<ol class="wp-block-list">
<li>資料量大（&gt;10GB）</li>



<li>需要即時處理（Streaming）</li>



<li>處理邏輯複雜</li>



<li>需要可靠的錯誤處理</li>



<li>需要自動擴展</li>



<li>預算允許（雖然比 VM 貴，但省下很多人力跟時間）</li>
</ol>



<h3 class="wp-block-heading">什麼時候用 VM 就夠：</h3>



<ol class="wp-block-list">
<li>資料量小（&lt;1GB）</li>



<li>單次處理就好</li>



<li>處理邏輯簡單</li>



<li>不急著要結果 (你可以使用 Spot VM 享受 60%~90% Off 的折扣)</li>



<li>預算有限</li>
</ol>



<p class="wp-block-paragraph">重點是：Dataflow 不只是一個執行環境，而是一個完整的資料處理平台。雖然前期學習成本較高，但在處理大量資料時，會省下更多開發和維護的時間。</p>



<p class="wp-block-paragraph">這就像是比較「自己蓋房子」和「請建商蓋房子」的差異 &#8211; 雖然請建商比較貴，但他們有完整的團隊、標準流程和品質保證，最終反而更有效率。</p>



<p class="wp-block-paragraph">以上先簡單介紹一下，之後再深入介紹技術細節和實際操作。</p>



<p class="wp-block-paragraph"></p><p>The post <a href="https://dongdonggcp.com/2024/11/23/what-is-dataflow-vs-apache-beam/">[Dataflow 教學] Dataflow 是什麼？跟 Apache Beam 有什麼關係？</a> first appeared on <a href="https://dongdonggcp.com">東東 GCP 教學 - GCP 實戰講師 - 雲上星辰有限公司</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://dongdonggcp.com/2024/11/23/what-is-dataflow-vs-apache-beam/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7975</post-id>	</item>
	</channel>
</rss>
