在雲中為雲開發:在 AWS 中使用 Docker 進行大數據開發
已發表: 2022-03-11為什麼你可能需要它?
我是一名開發人員,每天都在集成開發環境 (IDE) 中工作,例如 Intellij IDEA 或 Eclipse。 這些 IDE 是桌面應用程序。 自從 Google Documents 出現以來,我看到越來越多的人使用相當於文字處理器或電子表格應用程序的在線版本將他們的工作從桌面版本的 Word 或 Excel 轉移到雲端。
使用雲來保存您的工作有明顯的原因。 如今,與傳統的桌面業務應用程序相比,一些 Web 應用程序在功能上並沒有明顯的劣勢。 只要有網絡瀏覽器,內容就可以使用,而如今,幾乎無處不在。 協作和共享更容易,丟失文件的可能性更小。
不幸的是,這些雲優勢在軟件開發領域並不像商業應用程序那樣普遍。 有一些嘗試提供在線 IDE,但它們與傳統 IDE 相去甚遠。
這是一個悖論; 雖然我們仍然綁定到我們的桌面進行日常編碼,但該軟件現在已在多台服務器上生成。 開發人員需要處理他們無法在計算機上保存的東西。 事實上,筆記本電腦不再增加其處理能力。 在筆記本電腦上擁有超過 16GB 的 RAM 是罕見且昂貴的,而更新的設備,例如平板電腦,甚至更少。
但是,即使目前還無法替代經典的桌面應用程序進行軟件開發,也可以將您的整個開發桌面遷移到雲端。 在我意識到不再需要將所有軟件都放在筆記本電腦上的那一天,並註意到網絡版終端和 VNC 的可用性,我將所有東西都移到了雲端。 最終,我開發了一個構建工具包,用於以自動化方式創建該環境。
在本文中,我介紹了一組腳本,用於為 Scala 和大數據應用程序構建基於雲的開發環境,在 Amazon AWS 中使用 Docker 運行,並包含一個可訪問 Web 的桌面,並以 IntelliJ IDE、Spark、Hadoop 和 Zeppelin 作為服務,以及命令行工具,例如基於 Web 的 SSH、SBT 和 Ammonite。 該工具包在 GitHub 上免費提供,我在這裡描述了使用它來構建您的實例的過程。 您可以構建您的環境並根據您的特定需求對其進行自定義。 啟動並運行它不應該花費您超過 10 分鐘的時間。
“BigDataDevKit”中有什麼?
我開發該工具包的主要目標是我的開發環境應該是我可以簡單啟動的東西,包含我使用的所有服務和服務器,然後在不再需要它們時銷毀它們。 當您處理不同的項目時,這一點尤其重要,其中一些涉及大量服務器和服務,就像您處理大數據項目時一樣。
我理想的基於雲的環境應該:
- 包括所有常用的開發工具,最重要的是圖形 IDE。
- 讓我需要的服務器和服務觸手可及。
- 從頭開始輕鬆快速地創建,並且可以擴展以添加更多服務。
- 僅使用 Web 瀏覽器即可完全訪問。
- (可選)允許使用專用客戶端(VNC 客戶端和 SSH 客戶端)進行訪問。
利用現代云基礎架構和軟件、現代瀏覽器的強大功能、寬帶的廣泛可用性以及無價的 Docker,我為 Scala 和大數據開發創建了一個開發環境,更好地取代了我的開發筆記本電腦。
目前,我可以隨時使用 MacBook Pro、Surface 平板電腦甚至 iPad(帶鍵盤)工作,儘管不可否認,最後一個選項並不理想。 所有這些設備都只是客戶端; 桌面和所有服務器都在雲中。
我當前的環境是使用以下在線服務構建的:
- 用於服務器的 Amazon Web Services。
- GitHub 用於存儲代碼。
- Dropbox 來保存文件。
我還使用了一些免費服務,例如動態 IP 地址的 DuckDns 和 Let's encrypt 以獲得免費的 SSL 證書。
在這種環境下,我目前有:
- 帶有 Intellij idea 的圖形桌面,可通過 Web 瀏覽器訪問。
- Web 可訪問的命令行工具,例如 SBT 和 Ammonite。
- Hadoop 用於存儲文件和運行 MapReduce 作業。
- 用於計劃作業的 Spark 作業服務器。
- Zeppelin 用於基於 Web 的筆記本。
最重要的是,對於基於 Web 的 VNC 和 SSH,Web 訪問使用 HTTPS 完全加密,並且有多種保護措施可以避免丟失數據,當然,當您不“擁有”網站上的內容時,這一點很重要你的物理硬盤。 請注意,在您的計算機上獲取所有工作的副本是自動的,而且速度非常快。 如果您因為有人竊取了您的密碼而丟失了所有內容,那麼只要您正確配置了所有內容,您的計算機上仍然有一份副本。
將基於 Web 的開發環境與 AWS 和 Docker 結合使用
現在,讓我們開始描述環境是如何工作的。 當我早上開始工作時,第一件事是登錄 Amazon Web Services 控制台,在那裡我可以看到我的所有實例。 通常,我為不同的項目配置了許多開發實例,並關閉未使用的實例以節省費用。 畢竟,我一次只能做一個項目。 (嗯,有時我會做兩個。)
所以,我選擇我想要的實例,啟動它,我稍等片刻或者去喝杯咖啡。 與打開計算機沒有太大區別。 啟動並運行實例通常需要幾秒鐘。 看到綠色圖標後,我打開瀏覽器,然後轉到一個眾所周知的 URL: https://msciab.duckdns.org/vnc.html ://msciab.duckdns.org/vnc.html。 注意,這是我的網址; 創建套件時,您將創建唯一的 URL。
由於 AWS 在您啟動時為每台機器分配一個新 IP,因此我配置了動態 DNS 服務,因此您始終可以使用相同的 URL 訪問您的服務器,即使您停止並重新啟動它。 您甚至可以在瀏覽器中添加書籤。 此外,我使用帶有有效密鑰的 HTTPS 來全面保護我的工作免受嗅探器的攻擊,以防我需要管理密碼和其他敏感數據。
加載後,系統將使用 Web VNC Web 客戶端 NoVNC 來歡迎您。 只需登錄,就會出現一個桌面。 我故意使用最小的桌面,只是一個帶有應用程序的菜單,而我唯一的奢侈品是虛擬桌面(因為我在開發時打開了很多窗口)。 對於郵件,我仍然依賴其他應用程序,現在主要是其他瀏覽器選項卡。
在虛擬機中,我擁有開發大數據應用程序所需的一切。 首先,有一個 IDE。 在構建中,我使用 IntelliJ Idea 社區版。 此外,還有 SBT 構建工具和 Scala REPL,Ammonite。
但是,此環境的主要功能是將服務部署為同一虛擬機中的容器。 特別是,我有:
- Zeppelin,用於動態使用 Scala 代碼並進行數據分析的網絡筆記本 (
http://zeppelin:8080) - Spark 作業服務器,用於使用 Rest 接口 (
http://sparkjobserver:8080) 執行和部署 Spark 作業。 - 一個 Hadoop 實例,用於從 HDFS (
http://hadoop:50070) 存儲和檢索數據。
請注意,這些 URL 是固定的,但可以在虛擬環境中訪問。 您可以在以下屏幕截圖中看到他們的 Web 界面。
每個服務都在一個單獨的 Docker 容器中運行。 無需太技術化,您可以將其視為虛擬機內的三個獨立服務器。 使用 Docker 的美妙之處在於您可以添加服務,甚至可以添加兩三個虛擬機。 使用 Amazon 容器,您可以輕鬆擴展您的環境。
最後但同樣重要的是,您有一個可用的網絡終端。 只需使用 HTTPS 訪問您的 URL,您就會受到網頁中終端的歡迎。
在上面的屏幕截圖中,您可以看到我列出了容器,即三台服務器加上桌面。 此命令行 shell 使您可以訪問包含容器的虛擬機,從而允許您管理它們。 就好像您的服務器在“矩陣中”(在容器中虛擬化),但是這個 shell 讓您可以在“矩陣”之外管理服務器和桌面。 從這裡,您可以重新啟動容器、訪問它們的文件系統並執行 Docker 允許的其他操作。 我不會在這裡詳細討論 Docker,但是 Docker 網站上有大量的文檔。
如何設置您的實例
到目前為止你喜歡這個,並且你想要你的實例嗎? 它既簡單又便宜。 您只需支付 Amazon Web Services 上虛擬機的成本以及存儲空間即可獲得它。 當前配置中的套件需要 4GB 的 RAM 才能運行所有服務。 如果您只在需要時才小心使用虛擬機,並且您每月工作 160 小時,那麼按當前費率計算的虛擬機將花費 160 x 0.052 美元,即每月 8 美元。 您必須增加存儲成本。 我使用大約 30GB,但所有東西都可以保持在 10 美元以下。
但是,如果您要備份超過 2GB 的代碼,這確實包括(最終)Dropbox(Pro)帳戶的成本。 這每月花費 15 美元,但它為您的數據提供了重要的安全性。 此外,您將需要一個私有存儲庫,可以是付費的 GitHub 或其他服務,例如提供免費私有存儲庫的 Bitbucket。
我想強調的是,如果你只在需要時使用它,它比專用服務器便宜。 是的,這裡提到的所有東西都可以在物理服務器上設置,但由於我使用大數據,我需要很多其他 AWS 服務,所以我認為將所有東西放在同一個地方是合乎邏輯的。
讓我們看看如何進行整個設置。
先決條件
在開始構建虛擬機之前,您需要註冊以下四個服務:
- 亞馬遜網絡服務。
- 鴨DNS。
- 保管箱。
- 讓我們加密。
您唯一需要信用卡的是亞馬遜網絡服務。 DuckDns 完全免費,而 DropBox 為您提供 2GB 的免費存儲空間,足以完成許多任務。 Let's Encrypt 也是免費的,它在您構建映像以簽署證書時在內部使用。 除了這些,我還推荐一個存儲庫託管服務,如 GitHub 或 Bitbucket,如果你想存儲你的代碼,但是,它不是設置所必需的。
首先,導航到 GitHub BigDataDevKit 存儲庫。

滾動頁面並在您選擇的文本編輯器中復製圖像中顯示的腳本:
需要此腳本來引導映像。 您必須更改它並為參數提供一些值。 小心地更改引號內的文本。 請注意,您不能在密碼中使用引號本身、反斜杠或美元符號等字符,除非您引用它們。 此問題僅與密碼有關。 如果您想安全起見,請避免使用引號、美元符號或反斜杠。
PASSWORD參數是您選擇通過 Web 界面訪問虛擬機的密碼。 EMAIL參數是您的電子郵件,將在您註冊 SSL 證書時使用。 您將需要提供您的電子郵件,這是從 Let's Encrypt 獲得免費 SSL 證書的唯一要求。
要獲取TOKEN和HOST的值,請轉到 DuckDNS 站點並登錄。您需要選擇一個未使用的主機名。
查看圖像以查看必須在何處複製令牌以及必須在何處添加主機名。 您必須單擊“添加域”按鈕來保留主機名。
配置您的實例
假設您擁有所有參數並編輯了腳本,您就可以啟動您的實例了。 登錄 Amazon Web Services 管理界面,進入 EC2 Instances 面板,點擊“Launch Instance”。
在第一個屏幕中,您將選擇一個圖像。 該腳本圍繞 Amazon Linux 構建,沒有其他可用選項。 選擇 Amazon Linux,這是 QuickStart 列表中的第一個選項。
在第二個屏幕上,選擇實例類型。 考慮到運行軟件的大小,有多個服務,你至少需要 4GB 內存,所以我建議你選擇t2.medium實例。 如果您關閉某些服務,您可以使用t2.small來修剪它,如果您只想要桌面,甚至可以使用micro 。
在第三個屏幕上,單擊“高級詳細信息”並粘貼您在上一步中配置的腳本。 我還建議您啟用終止保護,以便在意外終止時您不會丟失所有工作。
下一步是配置存儲。 實例的默認值為 8GB,這不足以包含我們將構建的所有映像。 我建議將其增加到 20GB。 此外,雖然不需要,但我建議使用另一個至少 10GB 的塊設備。 該腳本會將第二個塊設備作為數據文件夾掛載。您可以對其內容進行快照,終止實例,然後使用快照重新創建它並恢復所有工作。 此外,當您終止實例時,自定義塊儲存設備不會丟失,因此具有雙重保護,可防止數據意外丟失。 為了進一步提高您的安全性,您可以使用 Dropbox 自動備份您的數據。
第五步是命名實例。 選擇你自己的。 第六步提供了一種配置防火牆的方法。 默認情況下只有 SSH 可用,但我們也需要 HTTPS,所以不要忘記添加打開 HTTPS 的規則。 您可以向全世界開放 HTTPS,但最好只向您的 IP 開放,以防止其他人訪問您的桌面和外殼,即使仍然受密碼保護。
完成最後一個配置後,您可以啟動實例。 您會注意到,自初始化腳本運行以來,第一次初始化可能需要幾分鐘時間,並且它還會執行一些冗長的任務,例如使用 Let's Encrypt 生成 HTTPS 證書。
當您最終看到管理控制台“正在運行”並確認並不再“初始化”時,您就可以開始了。
假設所有參數都正確,您可以導航到https://YOURHOST.duckdns.org 。
將YOURHOST替換為您選擇的主機名,但不要忘記它是 HTTPS 站點,而不是 HTTP,因此您與服務器的連接是加密的,因此您必須在 URL 中寫入https// 。 該站點還將提供 Let's Encrypt 的有效證書。 如果獲取證書有問題,初始化腳本會生成一個自簽名證書。 您仍然可以使用加密連接進行連接,但瀏覽器會警告您這是一個未知站點,並且連接不安全。 它不應該發生,但你永遠不知道。
假設一切正常,然後您訪問 Web 終端 Butterfly。 您可以使用用戶app和您在設置腳本中輸入的密碼登錄。
登錄後,您將擁有一個引導式虛擬機,其中還包括 Docker 和其他好東西,例如 Nginx 前端、Git 和蝴蝶 Web 終端。 現在,您可以通過為您的開發環境構建 Docker 映像來完成設置。
接下來,鍵入以下命令:
git clone https://github.com/sciabarra/BigDataDevKit cd BigDataDevKit sh build.sh最後一個命令還會要求您輸入桌面訪問密碼。 完成後,它將開始構建圖像。 請注意,構建大約需要 10 分鐘,但您可以看到正在發生的事情,因為所有內容都顯示在屏幕上。
構建完成後,您還可以使用以下命令安裝 Dropbox:
/app/.dropbox-dist/dropboxd系統將顯示一個您必須單擊才能啟用 Dropbox 的鏈接。 您需要登錄 Dropbox,然後您就完成了。 您放入 Dropbox 文件夾中的任何內容都會在您的所有 Dropbox 實例之間自動同步。
完成後,您可以重新啟動虛擬機,並通過https://YOURHOST.dyndns.org/vnc.html URL 訪問您的環境。
您可以在恢復工作時停止機器並重新啟動它。 訪問 URL 保持不變。 這樣,您只需為使用它的時間付費,外加已用存儲的每月額外費用。
保存您的數據
以下討論需要了解 Docker 和 Amazon 的工作原理。 如果您不想了解細節,請記住以下簡單規則:在虛擬機中,有一個可用的/app/Dropbox文件夾,您放在/app/Dropbox中的任何內容都會保留,其他所有內容都是一次性的,並且可以走開。 為了進一步提高安全性,還將您寶貴的代碼存儲在版本控制系統中。
現在,如果您確實想了解這一點,請繼續閱讀。 如果您在創建虛擬機時按照我的指示進行操作,則可以保護虛擬機免於終止,因此您不會意外破壞它。 如果您明確決定終止它,主卷將被銷毀。 所有 Docker 鏡像都將丟失,包括您所做的所有更改。
但是,由於文件夾/app/Dropbox被掛載為容器的 Docker 卷,因此它不是 Docker 映像的一部分。 在虛擬機中,文件夾/app掛載在您創建的 Amazon 卷中,即使您明確終止虛擬機,該卷也不會被破壞。 要刪除該卷,您必須明確刪除它。
不要將作為 Docker 邏輯實體的 Docker 卷與作為某種物理實體的 Amazon 卷混淆。 發生的情況是/app/Dropbox Docker 卷放置在/app Amazon 卷中。
當您終止虛擬機時,Amazon 卷不會自動銷毀,因此放置在其中的任何內容都將被保留,直到您也明確銷毀該卷。 此外,您放入 Docker 卷中的任何內容都存儲在容器之外,因此在容器被銷毀時它不會被銷毀。 如果您按照建議啟用了 Dropbox,則您的所有內容都會復製到 Dropbox 服務器,如果您將 Dropbox 與您的計算機同步,則會復製到您的硬盤。 此外,建議將源代碼存儲在版本控制系統中。
所以,如果你把你的東西放在 Dropbox 文件夾下的版本控制系統中,丟失你的數據所有這一切都必鬚髮生:
- 您明確終止您的虛擬機。
- 您明確從虛擬機中刪除數據卷。
- 您明確從 Dropbox 中刪除數據,包括歷史記錄。
- 您明確從版本控制系統中刪除數據。
我希望您的數據足夠安全。
我為每個項目保留一個虛擬機,當我完成時,我會關閉未使用的虛擬機。 當然,我所有的代碼都在 GitHub 上,並在 Dropbox 中備份。 此外,當我停止一個項目時,我會在完全刪除虛擬機之前拍攝 Amazon Web Services 塊的快照。 這樣,每當項目恢復時,例如為了維護,我需要做的就是使用快照啟動一個新的虛擬機。 我所有的數據都恢復原狀,我可以繼續工作。
優化訪問
首先,如果您可以直接訪問 Internet,而不是通過代理進行中介,則可以使用本機 SSH 和 VNC 客戶端。 如果您需要將文件複製進和復制出虛擬機,則直接 SSH 訪問非常重要。 但是,對於文件共享,您應該將 Dropbox 視為更簡單的替代方案。
VNC Web 訪問非常寶貴,但有時它可能比本地客戶端慢。 您可以使用端口 5900 訪問虛擬機上的 VNC 服務器。您必須明確打開它,因為默認情況下它是關閉的。 我建議你只對你的 IP 地址打開它,因為互聯網上到處都是“機器人”,它們會掃描互聯網尋找要連接的服務,而 VNC 是這些機器人的常見目標。
結論
本文介紹瞭如何利用現代云技術來實現有效的開發環境。 雖然雲中的機器不能完全替代您的工作計算機或筆記本電腦,但當訪問 IDE 很重要時,它足以進行開發工作。 根據我的經驗,使用當前的互聯網連接,它的速度足夠快。
在雲中,服務器訪問和操作比在本地擁有它們更快。 您可以快速增加(或減少)內存、啟動另一個環境、創建圖像等等。 您擁有觸手可及的數據中心,當您處理大數據項目時,您需要強大的服務和大量空間。 這就是雲提供的。
