應用Docker+Jupyter快速搭建資料科研環境
配置一個數據科研環境是一個非常痛苦的過程。比如處理各個軟體包版本的一致性問題,必須非常深入理解並解決模糊晦澀的錯誤訊息,再加上無數漫長的等待各個包的編譯過程是非常令人沮喪的。這成為了資料科研難以上手的首要因素,並且是完全的沒有規律可循。
在過去的幾年中我們能看到有多種技術產生,來幫助我們建立隔離化的環境。在此我們將主要關注一個技術:Docker。Docker的出現讓建立一個新的資料科研環境變得更快更容易,並且可以引入如Jupyter這樣的工具來幫助探索你的資料。
基於Docker,我們可以下載一個映象檔案,其中已經包含了一系列的軟體包和資料科研工具。我們可以基於這個映象在極短時間內啟動資料科研環境,不必花費漫長的時間來人工挨個安裝編譯各個軟體包。這個環境就是Docker容器。容器可以幫助我們消除配置問題,即當容器被啟動時,它就已經是一個所有軟體包都正常工作的良好狀態。
除了降低資料科研的入門門檻,Docker也可以用於快速建立虛擬環境來隔離不同的Python和其他軟體包版本,而不再需要漫長的逐個安裝過程。
在這個文章中,我們將會覆蓋基本的Docker操作,在你自己的機器上:如何安裝,如何利用Docker容器快速啟動資料科研。
虛擬機器
建立虛擬機器的軟體技術已經存在的幾十年。虛擬機器允許你在自己的機器上模擬其他機器環境。比如,你可以在虛擬機器上跑Linux,即使你的物理機上跑的是windows。這將讓你使用Linux,而不必實際在機器上安裝它,它將是完全虛擬執行的,所以你能在windows之中使用Linux。實質上,你可以點選一個程式,然後Linux的桌面就會在Windows之中彈出。虛擬機器使用映象來啟動,你必須使用所需要對應的作業系統映象來啟動虛擬機器。假如你需要使用Linux,你必須使用包含所有必須檔案的Linux映象來建立這樣的Linux環境。
容器
雖然虛擬機器執行你在Windows上進行Linux的開發,但是它們也會有一些負面影響。虛擬機器啟動的時間會更長,會佔用顯著的系統資源,而且很難基於一個虛擬機器映象之上安裝其他軟體包,並以此建立新的映象。Linux容器解決了這個問題,使得多個隔離的環境可以在同一臺機器上執行。你可以把容器想象成更快,更方便的方式去使用虛擬機器。
不幸的是,容器的使用有點棘手,並且容器的映象管理和分發並不那麼容易。我們所需要的功能是,讓我們能快速下載並啟動基於特殊的軟體包和工具配置的資料科研環境。例如,你可能希望能快速啟動一個已經包含了Jupyter,spark,pandas等軟體包的映象。
Docker
Docker容器是基於Linux容器之上的一個封裝層,使得容器更容易被管理和分發。Docker也讓我們能夠更方便的下載對應一系列特定軟體包的映象,並快速啟動。同時它也是跨平臺的,可以工作於Mac,Windows,Linux。
虛擬環境同樣具備這些優點,比如建立隔離化的Python環境。那麼Docker比虛擬機器環境更加有優勢的是哪些:
- 快速啟動。當你需要啟動專案並分析資料時,你完全不需要等待任何軟體包安裝。
- 良好配置。大多數時候,Python軟體包需要其他系統包以及配置的支援。這可能導致一些奇怪的問題。基於Docker,這些都已經被安裝和配置完畢。
- 跨平臺一致性。Python軟體包是跨平臺的,但是部分行為在Linux和Windows上是不一樣的,並且部分相關庫是無法在Windows上安裝的。Docker容器總是運行於Linux環境內,所以它們永遠一致。
- 設立檢查點並恢復。你可以在Docker映象中安裝新軟體包,然後基於這個檢查點建立新的映象。這樣就可以很方便的回滾之後所做的任何改動和配置。
每一個Docker映象執行都會建立一個Docker容器。對於我們的目的,我們可以在容器內執行Jupyter,並且使用網路瀏覽器來觀察分析我們的資料。
安裝Docker
第一步就是安裝Docker。在Windows和Mac上有很方便的圖形化介面安裝程式。下面就是具體規格作業系統下的安裝指導:
- Mac OS
- Linux
- Windows
作為安裝程式的一部分,你會需要先開啟一個命令提示符視窗,或者也被稱為終端或者命令列視窗。是一種文字介面,而不是圖形化執行的計算機命令互動介面。比如,你即可以通過在windows下雙擊“notepad”來啟動一個文字編輯器,也可以在Linux的終端下鍵入命令“nano”來實現同樣的效果。
每個作業系統都會有相應的預配置好的命令提示符來應用Docker命令。更多資訊見如下:
- Mac OS - 從啟動面板來啟動Docker快速啟動終端。更多細節在此
- Linux - 啟動任意bash終端,Docker都已經準備好
- Windows- 從桌面上點選啟動Docker快速啟動終端。更多細節在此
在接下來的操作中,你也會需要使用同樣的命令提示符來執行任意文章提及的Docker命令。
下載映象
下一步就是下載你所需要的映象。以下是我們當前已有的資料科研映象:
- dataquestio/python3-starter – 這個包含了Python 3,Jupyter notebook以及其他很多熱門的資料科研庫,比如:numpy, pandas, scipy, scikit-learn,nltk.
- dataquestio/python2-starter – 這個包含了Python 2,Jupyter notebook以及其他很多熱門的資料科研庫,比如:numpy, pandas, scrapy,scipy, scikit-learn,nltk.
你可以通過鍵入 Docker pull IMAGE_NAME來下載你所需要的映象。比如,你需要下載dataquestio/python3-starter,你需要在命令提示符裡鍵入docker pull dataquestio/python3-starter。這個的目的就是從Docker hub(比如GitHub)下載映象檔案到你的機器上,然後你就可以啟動容器並使用這些映象。
執行映象
一旦映象已經被下載,你就可以開始通過命令Docker run執行它。我們需要設定少數幾個引數來保證它正確配置和執行。
- -p :該標誌指定埠號用於我們從本地機器訪問容器內的Jupyter伺服器
- -d :該標誌指定容器派遣模式,並在後臺執行
- -v :該標誌指定Jupyter可以訪問儲存資料的本地機器目錄
這裡你應該把/home/vik/notebooks換成你實際儲存Jupyter資料的資料夾。並且把dataquestio/python3-starter換成你實際使用的Docker映象。
執行docker run即可生成Docker容器。它是從你的本地機器上隔離的,你甚至可以把它想象成一個獨立的機器。在容器內部,Jupyter將會執行,並且我們可以訪問許多其他資料科研軟體。
Docker run執行之後會列印輸出一長字串。這個字串即是你容器的唯一標識,並且它也被用於修改容器,該唯一的標識會把它和其他容器區別開來。從現在開始我們將把它作為容器的標識。
檢視Jupyter伺服器
假如你當前跑在Linux上,下一步非常簡單-直接訪問localhost:8888即可,你應該能夠看到Jupyter正在執行。如果你是跑在Windows或者OSX上,那麼你需要按照之前給出Docker的安裝文件指示,使用Docker安裝步驟中的docker-machine。假設你的本地機器名為default,那麼執行docker-machine ip default將會告訴你當前你的Docker容器的IP地址。假如你機器用的是不同名字,那麼簡單替換掉命令中的default即可。然後你可以通過CONTAINER_IP:8888來看到你當前Jupyter的執行情況(這裡需要把CONTAINER_IP替換為之前查詢到的容器IP)。
製作Jupyter筆記
在這一步,你可以生成一個新的Jupyter筆記來測試系統的工作情況。嘗試執行一段scikit程式碼,更多示例見此:
from sklearn import datasets
from sklearn.cross_validation import cross_val_predict
from sklearn import linear_model
import matplotlib.pyplot as plt
%matplotlib inline
lr = linear_model.LinearRegression()
boston = datasets.load_boston()
y = boston.target
predicted = cross_val_predict(lr, boston.data, y, cv=10)
fig, ax = plt.subplots()
ax.scatter(y, predicted)
ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)
ax.set_xlabel('Measured')
ax.set_ylabel('Predicted')
plt.show()
增加資料檔案
假如你需要往這個環境中新增資料檔案,你有三種選擇。第一個是把它們放到你之前建立的給Jupyter用的資料夾中。放在這個位置的任意檔案都自動能被Jupyter訪問到。
第二種方法是使用docker cp命令。Docker CP能夠從本地機器中拷貝檔案到容器中,反之亦然。假設你想要拷貝一個檔案/home/vik/data.csv到容器(其ID為4greg24134)中。你可以輸入命令如下docker cp /home/vik/data.csv 4greg24134:/home/ds/notebooks,這就把data.csv拷貝到了容器的notebooks目錄下。當然,你可以把檔案拷貝到任意位置,把它們拷貝到notebooks目錄只是為了讓Jupyter訪問方便。
第三種是使用Jupyter筆記主頁面右上角的上傳按鈕。你可以選擇檔案並直接上傳到容器中的notebooks目錄。
無論你使用哪種方法,你還需要使用下列命令在Jupyter內部載入這些資料檔案。
import pandas
data = pandas.read_csv("data.csv")
從容器中拷貝檔案
你可能也需要從容器中拷貝檔案到你的本地機器上。最簡單的辦法就是把這些檔案放在/home/ds/notebooks資料夾裡,這樣它們就會被自動映象到你的本地機器。
另一個選項是同樣使用Docker cp。假如你需要拷貝容器(id為4greg24134 )內檔案/home/ds/notebooks/data.csv到你本地機器的資料夾/home/vik/。你可以鍵入如下命令:docker cp 4greg24134:/home/ds/notebooks/data.csv /home/vik/data.csv。
最後一個辦法是使用Jupyter的下載。點選瀏覽器內的任意非筆記格式檔案,它就會被下載到你本地機器。假如是需要下載Jupyter筆記檔案,那麼點選該檔案並且選擇“Download as”即可下載它到你的本地機器。
安裝更多的包
如果你需要在容器內安裝你自己的軟體包,你可以進入容器並執行任何正常的bash命令。你需要首先執行docker exec來進入容器。Docker exec的執行需要輸入指定的容器id以及命令。例如,鍵入docker exec -it 4greg24134 /bin/bash就會開啟容器為id 4greg24134的命令提示符。這裡的-it標識是標明我們要保持輸入會話並且鍵入命令。
在執行Docker exec後,你會被放到一個容器內的命令提示符。Python在容器的虛擬環境中已經在執行,它被稱為ds,並且應該已經是被啟用的。
假設你需要安裝任何包,只需要鍵入pip install PACKAGE_NAME。例如你可以用如下命令安裝requests,pip install requests。
當你需要退出容器的命令提示符時,鍵入exit即可。
關閉docker容器
當工作完成後,我們應當關閉docker容器。使用命令docker rm -f CONTAINER_ID來停止容器。這裡的容器id就是之前我們所得到的id。假如你沒有,可以使用docker ps來查詢。你的Jupyter筆記會仍然存在於本地機器中,即使在容器被關閉之後,它仍會儲存在你之前建立的資料夾。
建立容器映象
容器映象由Dockerfiles來建立。Dockerfiles會標明哪些包和工具應該被安裝到具體的映象中。你可以通過修改Dockerfiles來變更映象中的任意預設包和工具。
假如你想基於這個文章中我們所討論過的映象來建立新的映象。你可以貢獻它們到Github上,這裡包含了dockerfiles。我們也歡迎任何幫助我們改善當前映象,或者是貢獻新的不僅僅是針對Python的工具映象。
關於譯者:王旭敏,Nokia開發工程師,關注雲端計算、高效能或可用等架構、容器等。