返回文章列表

為 Sqoop 數據遷移建構 MySQL 與 CDH Docker 環境

本文闡述如何利用 Docker 容器化技術,快速部署與配置支援 Apache Sqoop 數據遷移的環境。內容涵蓋從下載 MySQL 與 CDH 映像檔,到啟動具備數據持久化能力的 MySQL 容器,並將其與 CDH 容器連結的完整流程。此外,文章詳細說明如何在 MySQL

數據工程 大數據

在現代數據工程實務中,環境的一致性與可複製性是確保數據管道穩定運行的關鍵。本文將聚焦於如何透過 Docker 容器化技術,建構一個標準化且隔離的數據處理環境,專門用於 Apache Sqoop 的數據遷移任務。此方法不僅簡化了傳統 Hadoop 生態系與關聯式資料庫(如 MySQL)的複雜部署流程,更透過容器連結與數據卷等核心機制,實現了服務間的無縫通訊與數據的持久化儲存。整個過程展示了一個從基礎設施即程式碼(Infrastructure as Code)理念出發的實踐,為開發、測試到生產環境的部署提供了一個高效且可靠的藍圖,突顯容器技術在大數據架構中的戰略價值。

部署與配置 MySQL 及 CDH Docker 環境以支援 Sqoop

本節將詳細說明如何設定和啟動 MySQL 和 CDH 的 Docker 容器,為後續使用 Apache Sqoop 進行數據傳輸做好準備。這包含下載映像檔、配置容器、建立數據持久化目錄以及啟動互動式終端。

映像檔下載與驗證

  1. 下載 MySQL 映像檔: 首先,確保您已下載 MySQL 的 Docker 映像檔。

    sudo docker pull mysql
    
  2. 下載 CDH 映像檔: 接著,下載包含 Sqoop 和其他 Hadoop 組件的 CDH 映像檔。

    sudo docker pull svds/cdh
    
  3. 驗證映像檔: 執行以下命令,確認 mysqlsvds/cdh 映像檔都已成功下載到本地 Docker 倉庫。

    sudo docker images
    

    您應該能在列表中看到這兩個映像檔。

啟動 Docker 容器與數據持久化

為了讓 MySQL 數據在容器重啟後仍能保留,我們需要為 MySQL 容器配置數據持久化。

  1. 創建 MySQL 數據目錄: 在宿主機上創建一個目錄,用於儲存 MySQL 的數據。

    sudo mkdir -p /mysql/data
    sudo chmod -R 777 /mysql/data
    

    這確保了 Docker 容器可以寫入此目錄。

  2. 啟動 MySQL 容器: 使用 docker run 命令啟動 MySQL 容器,並進行必要的環境變數設定。這些變數定義了資料庫名稱、用戶名、密碼等。

    • --name mysqldb:為容器命名為 mysqldb
    • -v /mysql/data:/var/lib/mysql:將宿主機的 /mysql/data 目錄掛載到容器內的 MySQL 數據儲存路徑 /var/lib/mysql,實現數據持久化。
    • -p 3306:3306:將 MySQL 的默認端口 3306 映射到主機的 3306 端口,方便外部訪問。
    • -e ...:設置一系列環境變數,用於配置 MySQL 實例,包括創建一個名為 mysqldb 的資料庫,設置用戶名 mysql 和密碼 mysql,以及 root 用戶的密碼 mysql
    • -d:以分離模式(後台運行)啟動容器。
    • mysql:指定使用的 Docker 映像檔。
    sudo docker run -v /mysql/data:/var/lib/mysql --name mysqldb -p 3306:3306 \
      -e MYSQL_DATABASE='mysqldb' \
      -e MYSQL_USER='mysql' \
      -e MYSQL_PASSWORD='mysql' \
      -e MYSQL_ALLOW_EMPTY_PASSWORD='no' \
      -e MYSQL_ROOT_PASSWORD='mysql' \
      -d mysql
    
  3. 啟動 CDH 容器並連結 MySQL 容器: 啟動 CDH 容器,並使用 --link 選項將其連結到正在運行的 mysqldb 容器。這樣,CDH 容器內的 Sqoop 就可以通過容器名稱 mysqldb 來訪問 MySQL 資料庫。

    • --name cdh:為 CDH 容器命名為 cdh
    • --link mysqldb:將當前容器連結到名為 mysqldb 的容器。
    • -d:以分離模式啟動。
    • svds/cdh:指定使用的 Docker 映像檔。
    sudo docker run -d --name cdh --link mysqldb svds/cdh
    
  4. 驗證容器運行狀態: 執行 sudo docker ps 命令,確認 cdhmysqldb 這兩個容器都已成功啟動並正在運行。

啟動互動式終端

為了執行後續的命令,我們需要分別進入這兩個容器的互動式終端。

  1. 進入 MySQL 容器終端

    sudo docker exec -it mysqldb bash
    
  2. 進入 CDH 容器終端

    sudo docker exec -it cdh bash
    

在 MySQL 中創建表格

在進入 MySQL 容器的終端後,我們需要登錄到 MySQL CLI,並創建一個用於後續 Sqoop 導入練習的資料庫和表格。

  1. 登錄 MySQL CLI: 使用之前設定的用戶名和密碼登錄。

    mysql -u mysql -p
    

    系統會提示您輸入密碼,輸入 mysql

  2. 選擇資料庫: 登錄成功後,使用 use 命令選擇之前通過環境變數創建的 mysqldb 資料庫。

    use mysqldb;
    
看圖說話:

此圖示詳細闡述了設置和啟動 MySQL 和 CDH Docker 環境的過程,為後續的 Sqoop 操作奠定基礎。圖的開頭展示了使用者如何通過 SSH 連接到 EC2 實例,並執行 docker pull 命令來獲取 MySQL 和 CDH 的 Docker 映像檔,隨後通過 docker images 命令進行驗證。接著,圖示重點描繪了啟動兩個關鍵容器的步驟:首先是 MySQL 容器,其中強調了數據持久化(通過 -v 選項將宿主機目錄掛載到容器內)和網絡配置(-p 端口映射),以及通過 -e 選項設定各種環境變數來初始化 MySQL 實例。然後是 CDH 容器的啟動,特別是使用了 --link mysqldb 選項,這使得 CDH 容器內的 Sqoop 能夠通過 mysqldb 這個名稱直接訪問 MySQL 服務。圖示的後半部分展示了如何通過 docker exec 命令分別進入這兩個容器的互動式終端,並在 MySQL 容器內登錄 MySQL CLI,然後選擇 mysqldb 資料庫,為後續的表格創建和數據導入做準備。整體流程清晰地展示了容器的創建、連結以及基礎的數據庫配置。

MySQL 資料庫設定與 Sqoop 數據準備

本節將詳細說明如何在 MySQL 資料庫中進行必要的設定,以準備接收來自 Sqoop 的數據導入和導出操作。這包含授權、創建表格以及填充樣本數據。

資料庫授權與權限設定

在 MySQL CLI 中,我們需要確保用於連接的用戶(在此範例中為 mysql 用戶)擁有足夠的權限來操作 mysqldb 資料庫。

  1. 授予權限: 執行以下 SQL 命令,授予 mysql 用戶對 mysqldb 資料庫的所有權限,並允許其使用 mysql 作為密碼。WITH GRANT OPTION 允許該用戶進一步授予權限給其他用戶(儘管在本範例中不會用到)。
    GRANT ALL PRIVILEGES ON mysqldb.* TO 'mysql'@'%' IDENTIFIED BY 'mysql' WITH GRANT OPTION;
    
    此命令確保 mysql 用戶可以執行創建、修改、刪除表格以及插入和查詢數據等操作。@'%' 表示該用戶可以從任何主機連接。

創建用於數據導入的表格 (wlslog)

Sqoop 在導入數據到 HDFS 時,通常需要一個主鍵(PRIMARY KEY)來唯一標識每一行數據。我們將創建一個名為 wlslog 的表格,並將 time_stamp 列設為主鍵。

  1. 創建 wlslog 表格: 在 MySQL CLI 中執行以下 SQL 命令來創建表格結構:

    CREATE TABLE wlslog(
        time_stamp VARCHAR(255) PRIMARY KEY,
        category VARCHAR(255),
        type VARCHAR(255),
        servername VARCHAR(255),
        code VARCHAR(255),
        msg VARCHAR(255)
    );
    

    這個命令定義了表格的列名、數據類型以及 time_stamp 列作為主鍵。

  2. wlslog 表格添加數據: 使用 INSERT 語句向表格中填充樣本數據。這些數據將用於後續的 Sqoop 導入演示。

    INSERT INTO wlslog(time_stamp,category,type,servername,code,msg) VALUES('Apr-8-2014-7:06:16-PM-PDT','Notice','WebLogicServer','AdminServer','BEA-000365','Server state changed to STANDBY');
    INSERT INTO wlslog(time_stamp,category,type,servername,code,msg) VALUES('Apr-8-2014-7:06:17-PM-PDT','Notice','WebLogicServer','AdminServer','BEA-000365','Server state changed to STARTING');
    INSERT INTO wlslog(time_stamp,category,type,servername,code,msg) VALUES('Apr-8-2014-7:06:18-PM-PDT','Notice','WebLogicServer','AdminServer','BEA-000365','Server state changed to ADMIN');
    INSERT INTO wlslog(time_stamp,category,type,servername,code,msg) VALUES('Apr-8-2014-7:06:19-PM-PDT','Notice','WebLogicServer','AdminServer','BEA-000365','Server state changed to RESUMING');
    INSERT INTO wlslog(time_stamp,category,type,servername,code,msg) VALUES('Apr-8-2014-7:06:20-PM-PDT','Notice','WebLogicServer','AdminServer','BEA-000361','Started WebLogic AdminServer');
    INSERT INTO wlslog(time_stamp,category,type,servername,code,msg) VALUES('Apr-8-2014-7:06:21-PM-PDT','Notice','WebLogicServer','AdminServer','BEA-000365','Server state changed to RUNNING');
    
  3. 驗證數據: 執行 SELECT * FROM wlslog; 命令,確認數據已成功插入。

創建用於數據導出的表格 (WLSLOG_COPY)

對於 Sqoop 的數據導出功能,我們需要一個目標表格來接收來自 HDFS 的數據。為了避免與已導入的數據發生衝突,我們將創建一個結構相同的副本表格。

  1. 創建 WLSLOG_COPY 表格: 此表格的結構與 wlslog 表格相同,用於接收導出的數據。
    CREATE TABLE WLSLOG_COPY(
        time_stamp VARCHAR(255) PRIMARY KEY,
        category VARCHAR(255),
        type VARCHAR(255),
        servername VARCHAR(255),
        code VARCHAR(255),
        msg VARCHAR(255)
    );
    
看圖說話:

此圖示清晰地展示了在 MySQL 資料庫中為 Apache Sqoop 操作進行準備的關鍵步驟。圖的頂部描繪了使用者與 MySQL CLI 的互動,通過執行 GRANT 命令來設定 mysql 用戶對 mysqldb 資料庫的權限,確保其具備操作數據庫所需的權力。接著,圖示詳細展示了如何創建兩個重要的表格:首先是 wlslog 表格,它包含了 Sqoop 導入所需的 PRIMARY KEYtime_stamp),並且通過一系列 INSERT 語句填充了樣本數據,隨後通過 SELECT 命令進行了數據驗證。隨後,圖示展示了如何創建第二個表格 WLSLOG_COPY,其結構與 wlslog 相同,用於接收 Sqoop 的數據導出。整個流程從權限設定到表格創建與數據填充,為後續的 Sqoop 數據傳輸任務打下了堅實的數據基礎。

結論

縱觀現代管理者的多元挑戰,這套從 MySQL 到 CDH 的數據環境部署,不僅是技術操作的展演,更深刻隱喻了高階經理人整合既有資源與新興機會的策略藍圖。MySQL 容器的數據持久化與精確授權,象徵著對核心業務(遺留系統)穩定性的尊重與治理;而 CDH 容器的引入與連結,則代表著向大數據、新分析領域探索的決心。

此過程的精髓,在於透過 Sqoop 這座橋樑,建立起傳統結構化資產與未來非結構化洞察之間的價值通道。其中,對主鍵(Primary Key)的強制要求,更揭示了在任何創新整合中,都必須先確立一個不可動搖的核心價值或識別基準,方能確保轉移與擴展的有效性與可追溯性。這項看似微小的技術細節,實則是成功跨界整合的關鍵瓶頸。

未來三至五年,領導者的核心競爭力將不再是單一領域的專精,而是如同這套架構般,具備串連、轉譯並活化不同領域知識與資源的「系統整合」能力。

玄貓認為,高階經理人應著重於在團隊與組織內,扮演好「架構師」與「連結者」的角色。不僅要穩固核心基礎,更要勇於搭建通往未來的橋樑,才能在這波數據與智慧驅動的浪潮中,釋放完整的組織潛力。