tag:blogger.com,1999:blog-79247430346777203832024-03-06T17:03:23.953+08:00Alan Tsai 的學習筆記記錄軟體開發和學習到的點點滴滴
著重於微軟技術和網頁開發:C#, Asp .net, Asp .net MvcAlan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.comBlogger127125tag:blogger.com,1999:blog-7924743034677720383.post-51990458068109699802018-03-04T01:44:00.000+08:002018-03-04T01:44:07.604+08:00[開發工具小技巧]NimbleText - 資料處理產生符合特定結構的好用小工具<section><figure><a href="https://lh3.googleusercontent.com/-uHqdoNQjEiA/WprcDeVIi2I/AAAAAAAAXxE/0UvmFj5hCYwlhiuv7evX2rOa-X4U36DUACHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-nhXRIIhgDMU/WprcFBmFRRI/AAAAAAAAXxI/bLgSBHlvLQsBzkUO9_82FpH_4sAA3AtDwCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption>圖片來源:https://pixabay.com/en/confused-muddled-illogical-880735/ 和 https://blog.xebialabs.com/2016/03/21/essential-devops-terms/</figcaption></figure></section><section><p>標題可能有點看不懂,因為不太確定怎麼下比較符合這個工具的主要作用。不過給一個情境應該就能夠比較了解。</p><p> 有時候需要匯入資料的時候,可能會收到一個email清單,這個email清單需要匯入到DB裡面,如果是產生出匯入的sql語法請問會怎麼做呢? </p><p> 如果這個email清單只有10筆,手刻sql語法問題還不大,但是如果有1000筆email呢? </p><p> 在換個和程式開發比較相關的情境,假設SA開了一個清單告訴你這個class所需要的Property有什麼,請問如何快速的產生出這個property呢? </p><p> 在這篇將會介紹,如何用NimbleText這個工具快速做到上面兩個情境的需求。 </p></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1520098053494661" ;="">NimbleText介紹</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1520098053494912" ;="">NimbleText小檔案</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1520098053494278" ;="">版本的差異</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1520098053494215" ;="">使用介紹</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1520098053494197" ;="">使用情境1 - 依照清單產生出insert sql語法</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1520098053494629" ;="">使用情境2 - 產生出class的property</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1520098053494642" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a><section><h2 id="WizKMOutline_1520098053494661">NimbleText介紹</h2><div class="bs-callout bs-callout-default"><h4 id="WizKMOutline_1520098053494912">NimbleText小檔案</h4><ul><li><em>官網</em>:<a href="http://nimbletext.com/">http://nimbletext.com/</a></li>
<li><em>Live(線上版)</em>:<a href="http://nimbletext.com/Live">http://nimbletext.com/Live</a></li>
<li><em>Desktop</em>: <a href="http://nimbletext.com/Download/NimbleText.exe">直接下載</a> </li>
<li><em>版本差異</em>: <a href="http://nimbletext.com/Home/Professional">http://nimbletext.com/Home/Professional</a> </li>
</ul></div><p> NimbleText這個工具作者給他的描述是:<em>Manipulate text and data with light-weight patterns</em>。 </p><p> 簡單來說,就是把清單資料依照自己定義的範本去產生出內容。 </p><p> 聽起來還是有點抽象,不過等一下有範例的時候就會比較清楚。 </p><section><h3 id="WizKMOutline_1520098053494278">版本的差異</h3><p> NimbleText有3個版本: </p><ol><li><em>Live</em> - 線上版</li>
<li><em>Desktop</em> - 應用程式版</li>
<li><em>Desktop + License</em> - 應用程式版加買license</li>
</ol><p> 這個工具非常佛心,基本上Live和Desktop都是免費,只有進階功能才需要License。以我目前使用來說,其實Live就很夠用了。 </p><figure><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5WpYr7Z3_6sGYM5uX7CKreChLkE27kmwJn2KHoMoicNa-9i_CAKL6BO2nuG9Xf9Iq5jNmjf0y4OVE_qSVLr_B_0YUrhpi6n0WKl-qYV5tdgyFrhokjcR4aIyXj3fwFCjhLotZz6aPWh8N/s1600-h/image%255B5%255D"><img width="654" height="660" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-SyOzf8L7lgM/WprcJrw-SNI/AAAAAAAAXxQ/j-aK-n2huPw9kFQRoFRfhHYiKdSDAr5iACHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a><br />
<figcaption>功能版本差異 - 此圖沒有列出全部,詳細請看:http://nimbletext.com/Home/Professional</figcaption></figure></section><section><h3 id="WizKMOutline_1520098053494215">使用介紹</h3><p> 這邊會介紹<em>Live</em>的版本。 </p><p> 整個畫面有3個部分: </p><ol><li><em>For each row in the list</em>: 每一筆要被處理的資料</li>
<li><em>Subsitute using this pattern</em>:範本的內容</li>
<li><em>Result</em>:最後產生的結果</li>
</ol><figure><a href="https://lh3.googleusercontent.com/-3_1UKiDO5iA/WprcLokqFFI/AAAAAAAAXxU/9FeWXNEEGE0Frd4OqDr1uQ2cn9oZYh5SwCHMYCw/s1600-h/image%255B8%255D"><img width="654" height="840" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-whImwAvFCrk/WprcQYFhQlI/AAAAAAAAXxY/umuUaWFfDig6HXdYIZmwdN5Ob5Jn4XvNwCHMYCw/image_thumb%255B2%255D?imgmax=800" border="0"></a><br />
<figcaption>3個基本功能的畫面</figcaption></figure><p> 在「結果」的右邊部分,能夠設定每一筆資料的: </p><ol><li><em>column separator</em>: 切割字</li>
<li><em>row separtor</em>: 斷行字</li>
<li><em>insert</em>: 預存的範本</li>
</ol><figure><a href="https://lh3.googleusercontent.com/-XOIVFBiTYI4/WprcSKvqNqI/AAAAAAAAXxc/96OYXGrj_aMp51d-zu-IjVS57_G79IiGQCHMYCw/s1600-h/image%255B11%255D"><img width="654" height="60" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-4Ib5wngcKpU/WprcS3z3G5I/AAAAAAAAXxg/qvMMbWJcV4kjl47wrYsZy-3XFz4N9VE2gCHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a><br />
<figcaption>切割及斷行字</figcaption></figure><p> 最簡單的使用方式就是: </p><ol><li>把要處理的資料丟到<code>For each row in the list</code></li>
<li>在<code>Subsitute using this pattern</code>調整結果的範本。可以使用 <code>$0</code>代表第一個切割欄位,以此類推</li>
<li>在<code>Result</code>把最後結果複製出來</li>
</ol></section></section><section><h2 id="WizKMOutline_1520098053494197">使用情境1 - 依照清單產生出insert sql語法</h2><p> 這個情景是,有一個清單是insert的一部分值,例如要把每一個email都產生出一個insert sql語法。 </p><p> 假設,拿到的清單如下: </p><pre class="brush: plain;">test@test.com
bbb@test.com
ccc@test.com
</pre><p> 最後要匯入的sql語法是要到<code>EpaperSubscribe</code>table裡面的<code>email</code>欄位: </p><pre class="brush: plain;">INSERT INTO EpaperSubscribe (email)
VALUES ('$0');</pre><p> 最後就可以把<code>Result</code>複製出來在SSMS執行。 </p><figure><a href="https://lh3.googleusercontent.com/-LcBUIVvqQAo/WprcUiiDqNI/AAAAAAAAXxk/hXg1s8jEuMsYsHLJ00x-tiDZY9lzEYH6QCHMYCw/s1600-h/image%255B14%255D"><img width="654" height="845" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-RKauEENic-A/WprcYGLvX2I/AAAAAAAAXxo/LNNpsu-3RNcfNcSqTdHB-I790mjGIa1hACHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a><br />
<figcaption>最後結果截圖</figcaption></figure></section><section><h2 id="WizKMOutline_1520098053494629">使用情境2 - 產生出class的property</h2><p> 假設SA開好class裡面所有的property名稱及形態,怎麼快速產生這些property? </p><p> 假設得到的property類型和名稱清單如下: </p><pre class="brush: plain;">int Id
string Name
DateTime CREATEDATE</pre><p> 要產生的property為public包含get及set的版本,範本會是: </p><pre class="brush: plain;">public $0 <% $1.toPascalCase() %> { get; set;}
</pre><div class="bs-callout bs-callout-info"> 這邊注意到,最後一個欄位名稱是<em>全部大寫</em>,不過透過NimbleText的功能可以建立出符合C#命名規則的Property名稱。 </div><div class="bs-callout bs-callout-info"> 如果說要建立出包含private variable的property,可以從範本裡面選做參考。 </div><div class="bs-callout bs-callout-warning"> 上面那個範例要能夠成功,記得<em>column separator</em>要改成<em>空白</em>。 </div><p> 最後產生的結果就直接貼到C#的class裡面。 </p><figure><a href="https://lh3.googleusercontent.com/-QjNh-qr_yCk/WprcbEzLAoI/AAAAAAAAXxs/INIpSdKvmaEaO_J3HJQqy1M0ZZJx3ATFQCHMYCw/s1600-h/image%255B17%255D"><img width="654" height="450" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/--8u5ddl4YN0/WprcgZdQ-4I/AAAAAAAAXxw/rwaorHP8npgFsZjaWO0ktTEDMAyw5BAjgCHMYCw/image_thumb%255B5%255D?imgmax=800" border="0"></a><br />
<figcaption>產生的最後結果</figcaption></figure></section><section><h2 id="WizKMOutline_1520098053494642">結語</h2><p> 如果沒有NimbleText要達到上面的功能,一般會使用類似RegEx搭配產生,但是實際上並不好寫。 </p><p> 透過使用NimbleText讓整個的操作上變得非常的簡單,並且透過把這些pattern記錄下來隨時都可以讓一樣資料結構產生出需要的結果。 </p><p> 如果有更好的工具及做法也歡迎大家留言給我。 </p></section><section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:09e0d3b0-4fe8-4ff4-b457-8b19256b9978" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8c%e9%96%8b%e7%99%bc%e5%b7%a5%e5%85%b7%e5%b0%8f%e6%8a%80%e5%b7%a7%e3%80%8d" rel="tag">「開發工具小技巧」</a>,<a href="http://blog.alantsai.net/search/label/tool" rel="tag">tool</a>,<a href="http://blog.alantsai.net/search/label/C%23" rel="tag">C#</a>,<a href="http://blog.alantsai.net/search/label/sql" rel="tag">sql</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-30637848641216282772018-02-28T19:07:00.000+08:002018-02-28T19:07:01.382+08:00[開發工具小技巧]在Visual Studio 快速找到對應的程式碼,多多使用「移至」(Go To)及套件Codinion<section><figure><a href="https://lh3.googleusercontent.com/-Fe8-SfAxRm0/WpaHPOlD0dI/AAAAAAAAXvo/APKK8O4-ItcfcAQdUrIEgdrzgEZMho1zACHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-mtP8dIVwT4o/WpaHQZfuWYI/AAAAAAAAXvs/lXvyIyiFWXsOsw8A1_U4gldXFWdk_tKhQCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption>圖片來源:https://pixabay.com/en/confused-muddled-illogical-880735/ 和 https://blog.xebialabs.com/2016/03/21/essential-devops-terms/</figcaption></figure></section><section><p>在開發的時候,能夠用Visual Studio (以下簡稱VS) 快速定義到要改或者想找到的程式碼片段很重要。</p><p> 假設本來要花10秒才能夠打開要的片段,透過使用VS和套件的功能能夠在3秒內就打開,只要發生10次就能夠節省1分鐘的時間。無形之中就可以省掉很多零碎的時間。 </p><p> 這篇將會介紹如何用VS內建的<em>移至 (Go to)</em>找到某個程式碼片段,用<em>codinion</em>套件快速找到目前打開的檔案member。 </p></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1519813498159574" ;="">移至 (Go to) 功能介紹</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1519813498159946" ;="">如何啟動 移至 的功能</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1519813498160990" ;="">幾種 移至 的方式</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1519813498160739" ;="">把 移至 的篩選限定在當前打開的檔案</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1519813498160787" ;="">使用Codinion套件做移動</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1519813498160585" ;="">套件:codinion小檔案</a><br />
</li>
</ul></ul></ul></div></section> <a name='more'></a><section><h2 id="WizKMOutline_1519813498159574">移至 (Go to) 功能介紹</h2><p> 一般來說,開啟solution之後,接下來就是要打開要修改的code檔案。例如調整某個class內容。 </p><p> 如果不用任何方式的話,那麼就是用<em>Solution Explorer</em>瀏覽到code的檔案位置然後打開。換句話說需要<em>記得</em>資料夾結構。 </p><p> 如果這個Solution並不是自己從頭到尾開發或者說專案很大的話,那麼這樣開就很花時間。 </p><p> 換個角度來看,既然已經知道了要改的class名稱,那麼是否能夠用那個class名稱<em>搜索移動</em>到那個class所在的位置? </p><p> 這就是<em>移至 (Go to)</em>的功能。 </p><section><h3 id="WizKMOutline_1519813498159946">如何啟動 移至 的功能</h3><p> 可以使用: </p><ol><li>快捷鍵:預設是 <code>Ctrl + ,</code></li>
<li> Menu:<code>Edit -> Go To</code><figure><a href="https://lh3.googleusercontent.com/-64qrl1p0yWc/WpaHRaNvMfI/AAAAAAAAXvw/CDIyIJFxkGYtreSscz2e4LdajBN-92-kwCHMYCw/s1600-h/image%255B5%255D"><img width="654" height="225" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-P6bejP8MmN0/WpaHSSLKqeI/AAAAAAAAXv0/obbuy93rFiMOI62AM15W5CG8hiQeeloVQCHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a><br />
<figcaption>用Edit Toolbar開啟設定</figcaption></figure></li>
</ol><div class="bs-callout bs-callout-info"><p> 由於預設的快速鍵和注音輸入發的逗點快速鍵是一樣,因此很有可能按下之後還是不會出現。 </p><p> 因此建議調整快速鍵,以我自己為例是改成<code>Alt+,</code></p><figure><a href="https://lh3.googleusercontent.com/-DzCr46XKerA/WpaHTQeVjAI/AAAAAAAAXv4/7GsCES47tG4kXCfBBco7w6s9M4ZicdswACHMYCw/s1600-h/image%255B8%255D"><img width="654" height="442" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-K98rGblPCUE/WpaHUSLzk_I/AAAAAAAAXv8/sHMqIT9HimAwgngY7dAuvan8HuXh2PDaQCHMYCw/image_thumb%255B2%255D?imgmax=800" border="0"></a><br />
<figcaption>修改預設快捷鍵</figcaption></figure></div></section><section><h3 id="WizKMOutline_1519813498160990">幾種 移至 的方式</h3><p> 當把 移至 呼叫起來了之後,看到的畫面是: </p><figure><a href="https://lh3.googleusercontent.com/-Qjg8WVArAnA/WpaHVG3WFPI/AAAAAAAAXwA/vfb5Rhmij30VBM8pPs-VR8TMzPuyH2R8QCHMYCw/s1600-h/image%255B11%255D"><img width="654" height="198" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-MdtSdQKu4ig/WpaHWMhXVMI/AAAAAAAAXwE/oXMvlVvTl_Q_1qvKVs2fnzNezIrF4676wCHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a><br />
<figcaption>啟動 的畫面</figcaption></figure><ol><li><em>Go To Line (Ctrl+G) 字符:<code>:</code></em> - 點下這個選項之後,可以輸入要跳過去的<em>行數</em></li>
<li><em>Go To File (Ctrl+1, Ctrl+F) 字符: <code>f</code></em> - 這個選項是搜索<em>檔名</em></li>
<li><em>Go To Types (Ctrl+1, Ctrl+T) 字符: <code>t</code></em> - 這個選項是搜索<em>class、Struct、Enums、Interface和Delegate</em></li>
<li><em>Go To Member (Ctrl+1, Ctrl+M) 字符: <code>m</code></em> - 這個選項是搜索<em>variable、property、method、constant、enum item和event</em></li>
<li><em>Go To Symbol (Ctrl+1, Ctrl+S) 字符: <code>#</code></em> - 這個選項是搜索 <em> Types + Member</em></li>
</ol><div class="bs-callout bs-callout-info"> 這幾個選項如果點下去,會發現其實就是在前面加上一個特殊字符。例如,Go To Line就是 加上<code>:</code>。 所以完全可以只記得一個快速鍵,就是如何把Go To呼叫起來,然後在打特殊字符做篩選。 </div><div class="bs-callout bs-callout-danger"> 如果沒有記錯,Go To是VS 2017才有的功能,VS 2015則是只有Navigate To。兩者最大的差異是在Navigate To沒有這些篩選項目。 </div></section><section><h3 id="WizKMOutline_1519813498160739">把 移至 的篩選限定在當前打開的檔案</h3><p> 在剛剛那5個不同篩選項目之後都是和設定有關的內容。 </p><p> 這邊只提Symbol選項旁邊的那個,是<em>Current Document (Ctrl+Alit+c)</em>。這個選項的意思是,如果開啟的話,把搜索條件限制在<em>當前檔案</em>。 </p><p> 這個最長和Go To Member做搭配。一般來說想要快速跳到當前檔案的某個property或者method,就會限定在目前這個檔案。 </p><p> 不過這個方式有個缺點,因為很多時候是打搜索的文字到一半,才想起來要限制在當前檔案,這個時候如果加上這個選項,剛剛打到一半的內容<em>會清空</em>。 由於共用一個Go To搜索框,所以當要搜索全域的時候,很有可能已經把要打的字打了一半,才發現忘記不要開這個設定,造成要重新打。 </p><p> 這也是為什麼用到Codinion。因為廣域和當前檔案可以分開兩個不同快捷鍵觸發(內建的Go To沒有找到這個快捷鍵) </p></section></section><section><h2 id="WizKMOutline_1519813498160787">使用Codinion套件做移動</h2><div class="bs-callout bs-callout-info"> 題外話,在另外一篇有提到Codinion的另外一個功能,為不同類型欄位給出不同的顏色:<a style="line-height: 1.6; font-size: 15px;" href="wiz://open_document?guid=43dcab07-ddf6-42e4-9ddd-91c49d4f94e2&kbguid=&private_kbguid=b1ed89f6-16c8-11e1-8d03-00237def97cc">[開發工具小技巧]調整Visual Studio的字形及文字顏色</a></div><div class="bs-callout bs-callout-default"><h4 id="WizKMOutline_1519813498160585">套件:codinion小檔案</h4><ul><li>套件:<a href="https://marketplace.visualstudio.com/items?itemName=MartinTopfstedt.Codinion">https://marketplace.visualstudio.com/items?itemName=MartinTopfstedt.Codinion</a></li>
<li>直接下載:<a href="https://marketplace.visualstudio.com/items?itemName=MartinTopfstedt.Codinion">鏈接</a></li>
<li>官網:<a href="https://www.codinion.com/">https://www.codinion.com/</a></li>
<li>支援的VS版本:2012、2015、2017</li>
</ul></div><p> 當初會裝Codinion的套件的原因就是因為在VS 2015無法區分,File、Member及Symbol,所以才找到了這個套件。 </p><p> 基本上VS內建的Go To可以取代大部分Codinion的搜索功能,不過當要在<em>當前檔案</em>找到某個member的時候,個人還是覺得Codinion比較好用。 </p><p> 以Codinion找到目前檔案的某個member為例,快速鍵是<code>Alt+M</code>(不確定這個是我自己改的還是內建的快速鍵),會直接下拉出目前所有member 以及可以打來過濾: </p><figure><a href="https://lh3.googleusercontent.com/-QJDdx-cNnbM/WpaHZ4YFQZI/AAAAAAAAXwI/9xjVGrKFNIEw3N5-mttbZwmZACwkoPyOQCHMYCw/s1600-h/image%255B14%255D"><img width="654" height="118" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-JSLlltQwSFg/WpaHaluF_8I/AAAAAAAAXwM/ttjKNnWvQaMM7W5FzwS6_NL5c0rAWbQvwCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a><br />
<figcaption>範例畫面</figcaption></figure><p> 這個對我來說有兩個好處: </p><ol><li><em>有時候我想要看到所有的項目</em>:因為忘記關鍵字是什麼,可以用鍵盤下來快速找</li>
<li><em>搭配設定的顏色</em>: 這樣可以直覺的找到什麼是什麼。例如我的method是深紅色,那麼看到就可以直覺關聯起來</li>
</ol><div class="bs-callout bs-callout-danger"> 不過Codinion有時候啟動會比較慢,可能是因為先把清單load出來造成。因此有好有壞。 </div></section> <section> <h2>結語</h2><p> 能夠快速找到想要了解或者修改的程式碼是一個非常重要的技能,因為太常用到了,因此只要能夠提升速度就可以減少很多浪費的時間。 </p><p> 希望透過這篇能夠讓大家知道VS在這方面所提供的功能,也歡迎如果有不同的建議能夠和我做分享。 </p></section> <section> <h2>參考資料</h2><dl><dt><a href="https://blogs.msdn.microsoft.com/vcblog/2016/11/16/introducing-go-to-the-successor-to-navigate-to/">Introducing Go To, the successor to Navigate To</a></dt>
<dd> 介紹Go To的功能 </dd>
<dt> <a href="https://www.codinion.com/">Codinion官網</a> </dt>
<dd> 官網介紹Codinion的功能 </dd> </dl></section> <section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:65b270d2-73b3-406f-b181-84d14d4f0890" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8c%e9%96%8b%e7%99%bc%e5%b7%a5%e5%85%b7%e5%b0%8f%e6%8a%80%e5%b7%a7%e3%80%8d" rel="tag">「開發工具小技巧」</a>,<a href="http://blog.alantsai.net/search/label/Visual+Studio" rel="tag">Visual Studio</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-48707797861438220682018-02-25T13:06:00.000+08:002018-02-25T13:06:10.517+08:00[開發工具小技巧]調整Visual Studio的字形及文字顏色<section><figure><a href="https://lh3.googleusercontent.com/-bcZAx-tjzAU/WpJCQMVxm7I/AAAAAAAAXss/FHaXWHdjc_YNQ83pVVseQ2dG-SRdcjLVQCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjOyj8TF_pKLBtEn0nRIo32UnpyGoiTAEfTwrJR-2kAWU1dSO5aABwyE-HUC-pSn5kC9-P6TVedGFblZCzf1XkrasFOyJfAkLG7vw5p2nZeybHh-5mqLiHvWCSbkHcfTqAB9VuIoWvPP-Q/?imgmax=800" border="0"></a><br />
<figcaption>圖片來源:https://pixabay.com/en/confused-muddled-illogical-880735/ 和 https://blog.xebialabs.com/2016/03/21/essential-devops-terms/</figcaption></figure></section><section><p> Visual Studio(以下簡稱VS)是.Net開發者的最主要工具,而開發者天天面對的就是寫code。所以,讓code看起來舒服,好辨識非常的重要。 </p><p> 這篇將會對於如何讓看code的時候更加舒服,並且透過顏色的方式讓整個code更加容易辨識。 </p></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1519533906798506" ;="">字體及大小設定</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1519533906798890" ;="">code的字體及大小</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1519533906798572" ;="">IntelliSense的字體及大小</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1519533906798185" ;="">調整選取到同樣的參數呈現的顏色</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1519533906798799" ;="">套件:Word Highlight With Margin</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1519533906798595" ;="">套件Word Highlight With Margin小檔案</a><br />
</li>
</ul></ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1519533906798155" ;="">把不同的code類型給上不同的顏色</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1519533906798158" ;="">套件:codinion小檔案</a><br />
</li>
</ul></ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1519533906798797" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a> <section><h2 id="WizKMOutline_1519533906798506">字體及大小設定</h2><p> 第一個影響到看code的舒適度是找一個<em><strong>適合自己</strong></em>的字體及字體大小。 </p><p> 我自己對於字體沒有太特別的研究,不過一個適合code的字體最少要符合以下幾點: </p><ol><li>間距一致 - 也就是所謂的 Monospace Font (等寬字體)</li>
<li>l(小寫 L)、I(大寫 i) 以及 1(數字) 容易分辨</li>
<li>0(數字)、o(英文字母)以及 O (英文字母大寫) 容易分辨</li>
</ol><figure><a href="https://lh3.googleusercontent.com/-RRO9SkJjzVk/WpJCTRAhDZI/AAAAAAAAXs0/806fbqONgYACRfUmYTAcqYhpOHQHAyGnQCHMYCw/s1600-h/image%255B5%255D"><img width="531" height="201" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-eqgId9OQF_4/WpJCUrpu-EI/AAAAAAAAXs4/QWWwiXAXqJgxIZ68c6sM7PDY2VcyuZU2ACHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a><br />
<figcaption>Monospace Font和Propration font的差異 - 可以看到Monospace font每個字體的寬度都一樣,來源:https://en.wikipedia.org/wiki/Monospaced_font</figcaption></figure><p> 如果不裝任何其他字體的情況下,內建的<code>Consolas</code>就是一個很好用的字體。VS在近幾年的版本預設都是使用<code>consolas</code> 因此如果沒有自己喜歡的字體,其實不用做任何調整。 </p><p> 在VS要調整字體相關的,可以用<em>Font and Colors</em>的設定選項來改,可以直接透過右上角的<em>Quick lunch</em>直接搜索到: </p><figure><a href="https://lh3.googleusercontent.com/-sCLYn781kQc/WpJCVTG-HnI/AAAAAAAAXs8/TOvWoq9o8asL8z4L6Dv49RpEuawI_kTvACHMYCw/s1600-h/image%255B8%255D"><img width="654" height="227" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-l1C5saaIxoY/WpJCWuXLEZI/AAAAAAAAXtA/IAh2Oerj_iIMkoy2OIQ6RMmmSZa0RsaWgCHMYCw/image_thumb%255B2%255D?imgmax=800" border="0"></a><a href="https://lh3.googleusercontent.com/-BJDcgAj8vFw/WpJCX0772WI/AAAAAAAAXtE/ADJPHWG5UnU9iL4M19eCd3obTBvY_5-SgCHMYCw/s1600-h/image%255B11%255D"><img width="654" height="442" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-m_poAVaxnuU/WpJCY0F_fxI/AAAAAAAAXtI/WR9fdg1dJlAC4Yeu1fo3q-j1ix7Il_82QCHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a><br />
<figcaption>用quick lunch找到設定位置</figcaption></figure> 接下來的主要設定都在這個視窗裡面。 <p> 在VS裡面會建議調整兩個地方: </p><ol><li>code的字體及大小</li>
<li>IntelliSense的字體及大小</li>
</ol><section><h3 id="WizKMOutline_1519533906798890">code的字體及大小</h3><p><code>Text Editor > Plain Text</code>就是設定主要code的字體及大小。 </p><p> 字體的部分沒有什麼太好的建議,我習慣用<em>consolas</em>,不過字體大小建議放大一點點。以我自己電腦為例,<em>12</em>是適合的大小: </p><figure><a href="https://lh3.googleusercontent.com/-PALl7CYBmV4/WpJCaGu7zxI/AAAAAAAAXtM/NWljQgbnyjg-5EjzrV1G-iE9LmVY5-7CwCHMYCw/s1600-h/image%255B14%255D"><img width="654" height="175" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-EUW2_B7AoDM/WpJCbMaV8dI/AAAAAAAAXtQ/_mc0WFyfV20_Xeyf8oECVV4eFBrjCGKOQCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a><a href="https://lh3.googleusercontent.com/-cYsrraaIZeA/WpJCcPOmh1I/AAAAAAAAXtU/zGQMkmqztZESoS1rlm4b9ymuRdlrE0dkwCHMYCw/s1600-h/image%255B17%255D"><img width="654" height="204" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-dXT8gh7heYw/WpJCdccC-sI/AAAAAAAAXtY/_hOCA_OF3bM_o8DE3vdRtA988NvwhwEkgCHMYCw/image_thumb%255B5%255D?imgmax=800" border="0"></a><br />
<figcaption>左邊是10的截圖,右邊則是12的截圖</figcaption></figure></section><section><h3 id="WizKMOutline_1519533906798572">IntelliSense的字體及大小</h3><p> 另外一個可以調整的是寫code裡面出現的IntelliSense。 </p><p><code>Editor Tooltip -> Plain Text</code></p><p> 預設大小是9,建議大小可以調整為12,字體的部分則沒有特別的建議 </p><figure><a href="https://lh3.googleusercontent.com/-U5CtEqV1xy4/WpJCfhnSjVI/AAAAAAAAXtc/PqWrCHYFm84tXatcN03rCRuILBRibcuBwCHMYCw/s1600-h/image%255B20%255D"><img width="654" height="442" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-rEHNKo_gfQs/WpJCg5ynFII/AAAAAAAAXtg/VmojLvo3Ew0cJprJCEarWb5hbDfSYapzgCHMYCw/image_thumb%255B6%255D?imgmax=800" border="0"></a><br />
<figcaption>設定畫面</figcaption></figure><p> 從下面可以看出修改前後差異: </p><figure><a href="https://lh3.googleusercontent.com/-fmbQsDh97FA/WpJCiKO9DFI/AAAAAAAAXtk/cBWj-7T13RsQQ5qoCXqmU94grZkhFRsIACHMYCw/s1600-h/image%255B23%255D"><img width="468" height="194" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-2eNZ7g8k0o8/WpJCi4lCUpI/AAAAAAAAXto/jQl2DATrhjYlWIWsdviVk5C989SNqXh2QCHMYCw/image_thumb%255B7%255D?imgmax=800" border="0"></a><a href="https://lh3.googleusercontent.com/-93rMuheR5Hc/WpJCjmg2h7I/AAAAAAAAXts/EFVINL5ncxMjaiJdMFYP8bh-ntA8XoycgCHMYCw/s1600-h/image%255B26%255D"><img width="483" height="216" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-fK1leBFPLWU/WpJCkvuJuHI/AAAAAAAAXtw/84LIC6aR3OkJuhQUnARvRnB458VHc6f9QCHMYCw/image_thumb%255B8%255D?imgmax=800" border="0"></a><br />
<figcaption>左邊是預設的大小,右邊則是改成12大小</figcaption></figure></section></section><section><h2 id="WizKMOutline_1519533906798185">調整選取到同樣的參數呈現的顏色</h2><p> 有一個常見的動作是看目前選取的參數還有在那裡有用到。預設這個顏色是灰色,建議可以改成更顯眼的顏色。 </p><p> 修改位置在:<code>Text Editor -> Highlighted Reference</code></p><figure><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcLLK9-H9FP2ga4FgM-CxnQAo_fX6qTbM3G5CRnGybqOip9uRjhS_W7YI2pHRarBOAJjauNOMhfcomJ6gtLItDDuEj5lDO9tY0FTlsKoglRLzZM_POguZjtaSYasj_wf9bzlA0QzQt2yeZ/s1600-h/image%255B29%255D"><img width="654" height="442" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-tO1T9Is9WeM/WpJCmuOQAAI/AAAAAAAAXt4/0zIMvVCL9KQNtXPypgUiespmAinXHGN_gCHMYCw/image_thumb%255B9%255D?imgmax=800" border="0"></a><br />
<figcaption>設定位置</figcaption></figure><p> 修改前後的差異: </p><figure><a href="https://lh3.googleusercontent.com/-S5twfN5WK-c/WpJCnY04qDI/AAAAAAAAXt8/IfWV0t-2cjooOIeJY9XUl7H2s90fhMnswCHMYCw/s1600-h/image%255B32%255D"><img width="498" height="166" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-1-w5MHGYSHU/WpJCoQ3NhcI/AAAAAAAAXuA/H2yKlURn0uwWrX0pBn0_VpF4CQ03VezzgCHMYCw/image_thumb%255B10%255D?imgmax=800" border="0"></a><a href="https://lh3.googleusercontent.com/-N8XiEYgtGNQ/WpJCpjw9FnI/AAAAAAAAXuE/JOcwW4TGTxc9UeC__Q5xFRRSCt2LZ4OQwCHMYCw/s1600-h/image%255B35%255D"><img width="489" height="160" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-B5asjc_jxFg/WpJCq0xVrYI/AAAAAAAAXuI/7HMagBulkRUCSWgvz37-YlRq1-bVkmUUQCHMYCw/image_thumb%255B11%255D?imgmax=800" border="0"></a><br />
<figcaption>左邊是修改前灰色,右邊是修改後的黃色</figcaption></figure><section><h3 id="WizKMOutline_1519533906798799">套件:Word Highlight With Margin</h3><div class="bs-callout bs-callout-default"><h4 id="WizKMOutline_1519533906798595">套件Word Highlight With Margin小檔案</h4><ul><li>套件位置:<a href="https://marketplace.visualstudio.com/items?itemName=TrungKienPhan.WordHighlight-18439">https://marketplace.visualstudio.com/items?itemName=TrungKienPhan.WordHighlight-18439</a></li>
<li>直接下載:<a href="https://marketplace.visualstudio.com/items?itemName=TrungKienPhan.WordHighlight-18439">VS 2017</a></li>
<li>支援的VS版本:2012、2015和2017</li>
</ul></div><p> 上面提到的改法已經符合一般使用,不過如果還要更一步更明顯的效果,可以考慮套件<em><strong>Word Highlight With Margin</strong></em>。 </p><div class="bs-callout bs-callout-warning"> 不過要注意一下,這個套件和剛剛那個做法有點不同在於剛剛那個是 <em>同一個參數</em> 才會被highlight,這個比較像是搜索的概念,符合條件的都列出。 </div><p> 這個套件加了幾個特別的地方: </p><ol><li>右邊的scroll bar會呈現目前選取的參數位置</li>
<li>能夠設定當目前游標移動離開的時候還保留剛剛參數選取的狀況(這個模式預設不啟用)</li>
</ol><p> 同樣範例用套件呈現的話: </p><figure><a href="https://lh3.googleusercontent.com/-FaEZQTiW_XA/WpJCrlM9NMI/AAAAAAAAXuM/ikjW4geEdKMR_bUgFLeGdcCA6gIbfU2XQCHMYCw/s1600-h/image%255B38%255D"><img width="437" height="181" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-ZGAfxKNWEv8/WpJCs_jFr-I/AAAAAAAAXuQ/vtwtwMki9sgUU-LWORHnRqJaVJCCDVCVACHMYCw/image_thumb%255B12%255D?imgmax=800" border="0"></a><br />
<figcaption>使用套件的截圖</figcaption></figure></section></section><section><h2 id="WizKMOutline_1519533906798155">把不同的code類型給上不同的顏色</h2><p> 有時候在看code的時候,能夠容易識別出,那些是傳進來的參數,那些是方法的local參數,那些是方法能夠加強開發速度。 </p><p> 有個條件叫做<em>codinion</em>的其中一個功能就是這個作用。 </p><div class="bs-callout bs-callout-default"><h4 id="WizKMOutline_1519533906798158">套件:codinion小檔案</h4><ul><li>套件:<a href="https://marketplace.visualstudio.com/items?itemName=MartinTopfstedt.Codinion">https://marketplace.visualstudio.com/items?itemName=MartinTopfstedt.Codinion</a></li>
<li>直接下載:<a href="https://marketplace.visualstudio.com/items?itemName=MartinTopfstedt.Codinion">鏈接</a></li>
<li>官網:<a href="https://www.codinion.com/">https://www.codinion.com/</a></li>
<li>支援的VS版本:2012、2015、2017</li>
</ul></div><p> 設定方式從<code>Codinion (Toolbar) -> Options -> </code>,<em>options</em>裡面 <code>Highlighting -> CSharp</code>做調整 </p><figure><a href="https://lh3.googleusercontent.com/-Jw-fSDMVSe4/WpJCuBDP-zI/AAAAAAAAXuU/7n3Qed3-rvEjkWipvEIPUwJgqd5Z6gMGQCHMYCw/s1600-h/image%255B41%255D"><img width="453" height="246" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-ciNdM0fA9fk/WpJCvpsTr7I/AAAAAAAAXuY/q3r5O7_eQDErMCdgBuKQCTSoxRYLgZimQCHMYCw/image_thumb%255B13%255D?imgmax=800" border="0"></a><a href="https://lh3.googleusercontent.com/-avsdiRsapss/WpJCwqi9uJI/AAAAAAAAXuc/0RjdpwAtRi4T0bVb6OaQl6Zj-4QoForrACHMYCw/s1600-h/image%255B44%255D"><img width="654" height="439" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-R79kAfhGfCQ/WpJCx23qytI/AAAAAAAAXug/ljYy6ESViiI2meAnjTg5CTJurb4R17nNQCHMYCw/image_thumb%255B14%255D?imgmax=800" border="0"></a><br />
<figcaption>設定方式</figcaption></figure><p> 下圖左邊是原本的樣子,右邊則是有加過顏色的部分。可以看到: </p><ol><li>傳入的參數是灰色</li>
<li>方法是暗紅色</li>
</ol><figure><a href="https://lh3.googleusercontent.com/-m1B521Wkdvo/WpJCy4xBeQI/AAAAAAAAXuk/GEqYpUdN7xgiXOefEn1VyILBTVCZ8-vJwCHMYCw/s1600-h/image%255B47%255D"><img width="654" height="271" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-9kXSvKM5zps/WpJCz5vr26I/AAAAAAAAXuo/igYADyS0SKg7ismPhGKyOgjfVVMxWzJyQCHMYCw/image_thumb%255B15%255D?imgmax=800" border="0"></a><br />
<figcaption>差異圖</figcaption></figure><p>透過這種方式可以一眼看出那個code屬於哪裡</p><div class="bs-callout bs-callout-info"> 題外話,codinion這個套件當初會安裝主要是為了能夠快速找到solution裡面code的功能。code的顏色這個部分則是意料之外的功能。之後在和大家介紹。 </div></section><section><h2 id="WizKMOutline_1519533906798797">結語</h2><p> 天天面對VS最重要的當然是看起來要舒服,code要好辨識。因此調整為自己適合的字體及大小非常重要。 </p><p> 這邊的一個重點是,不管怎麼設定,適合自己的才是最好。 </p><p> 大家有沒有建議的修改或者常用的字體要推薦呢? </p></section><section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:7b0caf67-d457-4112-90cd-7531cea1a111" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8c%e9%96%8b%e7%99%bc%e5%b7%a5%e5%85%b7%e5%b0%8f%e6%8a%80%e5%b7%a7%e3%80%8d" rel="tag">「開發工具小技巧」</a>,<a href="http://blog.alantsai.net/search/label/Visual+Studio" rel="tag">Visual Studio</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-14969421471334852622018-02-12T01:09:00.000+08:002018-02-12T01:09:17.149+08:00[開發工具小技巧]應該怎麼用Visual Studio執行和進入debug比較省時間?搭配ReAttach套件快速進入Debug模式<section><figure><a href="https://lh3.googleusercontent.com/-eWdifyOIYyc/WoB231QXdOI/AAAAAAAAXqM/mUowDx7z3vI6Ww1JT45EU18od72j5Ww6QCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-jyJlFU-W9IM/WoB25YNGRqI/AAAAAAAAXqQ/q--db0c1vXohe1EIsg0eItE4vHBqtbm1ACHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption>圖片來源:https://pixabay.com/en/confused-muddled-illogical-880735/ 和 https://blog.xebialabs.com/2016/03/21/essential-devops-terms/</figcaption></figure></section><section><p> 最近在和同事聊天的時候,才發現到其實雖然我一直以來「以為」有多次強調該如何用Visual Studio run及進入debug比較節省時間, 但是其實有些同事還是不知道。 </p><p> 因此,準備一系列我個人認為大家應該都會的開發工具小技巧,這篇將會從開發每天都會做的事情,run及debug開始:在用Visual Studio開發的時候, 到底應該怎麼run和debug才是最有效率的方式,以及如何使用免費的套件ReAttach來讓debug流程更加的容易。 </p></section><section><a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518366855628634" ;="">一般的開發及debug流程</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518366855628661" ;="">如何優化run及debug的方式</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518366855628192" ;="">以 Start Without Debugging(快速鍵 Ctrl+F5)的執行方式替代 F5</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518366855628733" ;="">當需要debug的時候以Attach Process方式進入debug模式</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518366855628975" ;="">以套件ReAttach讓attach process的流程更容易</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518366855628764" ;="">ReAttach小檔案</a><br />
</li>
</ul></ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518366855628202" ;="">結語</a><br />
</li>
</ul></div></section><a name='more'></a><section><h2 id="WizKMOutline_1518366855628634">一般的開發及debug流程</h2><p> 在我以前剛學會Visual Studio開發的時候,那個時候我學習到的做法都是: </p><ol><li>改程式</li>
<li>要測試的時候按下快速鍵:<code>F5</code>也就是 <code>Start Debugging</code>的動作(綠色的按鈕)</li>
<li>開始測試功能,如果需要修改,由於在debug模式,需要先<em>停下</em>debug模式,之後才能改</li>
<li>重複第一個步奏</li>
</ol><p> 在這個流程裡面,貌似沒有問題,但是實際上: </p><ol><li><em>執行速度慢</em>:debug模式因為要能夠debug,因此會load很多其他東西,因此造成了執行起來速度變慢</li>
<li><em>需要消耗更多資源</em>:同上一條一樣,因為load的東西多因此消耗的記憶體也多</li>
<li><em>修改的流程消耗更多時間</em>:由於在debug模式是無法修改,因此需要停下來才能夠修改</li>
</ol></section><section><h2 id="WizKMOutline_1518366855628661">如何優化run及debug的方式</h2><p> 既然上面知道了一般的做法有什麼問題,那能夠怎麼優化呢?以下分幾個步奏來執行: </p><ol><li>以 Start Without Debugging(快速鍵 Ctrl+F5)的執行方式替代 F5</li>
<li>當需要debug的時候以Attach Process方式進入debug模式</li>
<li>以套件ReAttach讓attach process的流程更容易</li>
</ol><section><h3 id="WizKMOutline_1518366855628192">以 Start Without Debugging(快速鍵 Ctrl+F5)的執行方式替代 F5</h3><p> 很多時候把網站run起來的目的只是為了<em>測試功能</em>,因此其實不需要進入Debug模式。 </p><div class="bs-callout bs-callout-info"> 題外話:養成不依賴debug功能其實是一個好的習慣,有發生錯誤先<em>思考</em>一下問題發生原因, 而不是直接debug一步一步走,在整個的思維鍛煉上其實很有幫助。 </div><p> 所以養成以<code>Ctrl + F5</code><em>替代</em><code>F5</code>。 </p><figure><a href="https://lh3.googleusercontent.com/-3ga6A88kDP4/WoB29xFaPFI/AAAAAAAAXqU/tieMthumuqc1mYS1cp5lqJH9DiVVaF0PgCHMYCw/s1600-h/image%255B5%255D"><img width="513" height="364" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-YQO9fJOiC7g/WoB2_ucDAvI/AAAAAAAAXqY/Hhqx138_aDwGjHAVPi9JjEgOxd3H4tXfACHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a><br />
<figcaption>F5及Ctrl + F5在Visual Studio選項位置</figcaption></figure><p><strong>不過如果測試過程要改東西怎麼辦?</strong></p><p> 這個時候可以用 <code>Build (快速鍵 F6)</code>來編譯修改內容。 </p><p> 如果有遇到Build好像沒有很成功,這個時候可以用<code>Clean</code>,或者<code>Rebuild</code>(Rebuild本質上就是clean + build)。 </p><figure><a href="https://lh3.googleusercontent.com/-xORZ7ypRoY0/WoB3CE0grYI/AAAAAAAAXqc/9MUhRqs-u2QKwt3HwWi4IGWarL08fdwfwCHMYCw/s1600-h/image%255B8%255D"><img width="592" height="283" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-uuAIYB6DXT8/WoB3EuPrgQI/AAAAAAAAXqg/sATS_SRPAP4FGVza73BTmIYqG9kNjc8AgCHMYCw/image_thumb%255B2%255D?imgmax=800" border="0"></a><br />
<figcaption>Build、Clean及Rebuild的Visual Studio位置</figcaption></figure><div class="bs-callout bs-callout-info"> 有些修改其實不需要build,因為這些是動態build出來。一般來說這種類型都是View。例如Asp.net裡面的<em>aspx</em>或者Razor view的<em>cshtml</em>。所以如果修改這種類型,連呼叫build都不需要,只需要存檔然後刷新頁面即可。 </div><p> 透過養成<code>Ctrl + F5</code>的習慣,可以減少很多啟動debug,然後停掉debug在修改所花的時間。 </p><p> 不過下一個問題是,如果遇到問題需要debug怎麼辦? </p></section><section><h3 id="WizKMOutline_1518366855628733">當需要debug的時候以Attach Process方式進入debug模式</h3><p> 當Visual Studioa用Start Without Debugging把網站run起來之後,這個網站會被IIS Express host起來。 </p><p> 而Visual Studio可以透過<code>Attach to Process (快捷鍵: Cltr+Alt+P)</code>attach到IIS Express達到用Visual Studio啟動debug模式。 </p><dl><dt>啟動 Attach To Process 的畫面</dt>
<dd><figure><a href="https://lh3.googleusercontent.com/-if6ZxH5a3zA/WoB3GPFqsdI/AAAAAAAAXqk/UNLiqgZ_IpwTeJ7smYpyhg383YAEAlVlwCHMYCw/s1600-h/image%255B11%255D"><img width="535" height="444" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-0WSNE4h6eE8/WoB3IThDUpI/AAAAAAAAXqo/KjXp17qRQywxZUXeSXvFe1sklGFe55pQQCHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a>
<figcaption>從Debug Toolbar找到</figcaption></figure></dd>
<dt>選擇 iisexpress.exe</dt>
<dd> 從<em>Available Process</em>找到<em>iisexpress.exe</em>,如果在清單裡面沒有,可以勾選<code>Show process from all users</code><figure><a href="https://lh3.googleusercontent.com/-y9C5Fn8Zu4k/WoB3KhH9hZI/AAAAAAAAXqs/D0jFVPte33w-NbEssJAVsiMDXPzgwrKFgCHMYCw/s1600-h/image%255B14%255D"><img width="654" height="514" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-sMCnvIzq5xw/WoB3S1L4WwI/AAAAAAAAXqw/rhJt62uAEEMOg8xOOXroaKsPm6iN2lIdQCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a>
<figcaption>選擇iisexpress.exe</figcaption></figure></dd></dl><p> Attach完了之後,Visual Studio就會進入到一般的debug模式,剩下就和一般debug沒有什麼兩樣。 </p><div class="bs-callout bs-callout-info"> 如果debug完了,停下來,網站是<em>不會停</em>,這個和一般<code>F5</code>不一樣,如果是<code>F5</code>啟動的,當停下debug模式的時候, 整個網站<em>也會停下來</em>。 </div><div class="bs-callout bs-callout-info"> 如果attach上去之後,發現無法下中斷點,那麼最有可能是build沒有成功或者沒有乾淨,最好就是先<code>clean</code>,在<code>Ctrl + F5</code>。 </div><div class="bs-callout bs-callout-info"> 了解了<code>Attach To Process</code>,換個角度說其實也可以attach到一般IIS網站,甚至Remote Debug。這個完全做的到,但是這篇就不介紹了。 </div></section><section><h3 id="WizKMOutline_1518366855628975">以套件ReAttach讓attach process的流程更容易</h3><p> 了解了<code>Attach To Process</code>之後,下一個問題就是,每一次都要開那個畫面然後找到iisexpress真的很麻煩,是否有什麼方式讓找這個process更加容易呢? </p><p> 有人因此建立了一個套件,<em><strong>ReAttach</strong></em>,甚至非常佛心的Open Source以及以Free的方式發佈出來。 </p><div class="bs-callout bs-callout-default"><h4 id="WizKMOutline_1518366855628764">ReAttach小檔案</h4><ul><li><em>支援的Visual Studio版本</em>:2012+</li>
<li><em>官網</em>:<a href="https://marketplace.visualstudio.com/items?itemName=ErlandR.ReAttach">https://marketplace.visualstudio.com/items?itemName=ErlandR.ReAttach</a></li>
<li><em>直接下載</em>:<a href="https://marketplace.visualstudio.com/items?itemName=ErlandR.ReAttach">https://marketplace.visualstudio.com/items?itemName=ErlandR.ReAttach</a></li>
<li><em>最新版本:</em>2.2</li>
<li><em>Source Code</em>:<a href="https://github.com/erlandranvinge/ReAttach">https://github.com/erlandranvinge/ReAttach</a></li>
</ul></div><p> ReAttach使用非常簡單,安裝了之後,在工具列會有一個<em>紫色的播放按鈕</em>可以按: </p><figure><a href="https://lh3.googleusercontent.com/-oh1r5hytecA/WoB3Uj2RgvI/AAAAAAAAXq0/yIRMm0ix0IkUWNQTfizsn4eaRDCA8vv0wCHMYCw/s1600-h/image%255B17%255D"><img width="654" height="135" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-jhIgy2wZbjE/WoB3WZ6hHBI/AAAAAAAAXq4/TK4pwUNdDigML8nsoNNfZ0Dy2wwybxdZQCHMYCw/image_thumb%255B5%255D?imgmax=800" border="0"></a><br />
<figcaption>ReAttach的功能</figcaption></figure><p> 在這個功能裡面,可以按旁邊下三角形看到最近的<em>4筆</em>曾經有Attach過的Process。 </p><p> 最新Attach的Process會以第一筆呈現。 </p><p> 只需要選擇要Attach的Process即可。 </p><p> 如果說上面的Process都沒有目前想要Attach的,那麼可以先用<code>F5</code>,然後停下來之後剛剛那個process就會出現在第一筆。 </p></section></section><section><h2 id="WizKMOutline_1518366855628202">結語</h2><p> 如果養成了只以<code>Ctrl+F5</code>的方式在Run程式,真需要debug的時候在用<code>Attach Process</code>的方式進入debug模式, 不止能夠讓整個開發流程速度更快,也能夠鍛煉不debug情況下嘗試解決問題。 </p><p> 希望透過這篇,如果還沒養成這個習慣的可以先試試看,並且裝ReAttach讓整個流程變得更加順利。 </p><p> 如果有不同且能夠更節省開發時間的流程,也請用留言方式互相切磋切磋。 </p></section><section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:3254e0d7-b119-4861-a2ce-ea7547a93ab2" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8c%e9%96%8b%e7%99%bc%e5%b7%a5%e5%85%b7%e5%b0%8f%e6%8a%80%e5%b7%a7%e3%80%8d" rel="tag">「開發工具小技巧」</a>,<a href="http://blog.alantsai.net/search/label/Visual+Studio" rel="tag">Visual Studio</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-16537326281103664662018-02-11T15:51:00.000+08:002018-02-11T15:55:46.575+08:00[從.Net工程師的角度來看DevOps][27]如何看.Net Dll版號和如何給.Net的Dll打上版號<section><figure><a href="https://lh3.googleusercontent.com/-65kHFuAEI-k/Wn_1jMrzvkI/AAAAAAAAXpQ/-jCaMHO-AvsCpfFH2ocN_I1S685RXne-wCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-qxEzrBsMw_I/Wn_1lENjMVI/AAAAAAAAXpU/2ZHYOp5UQSU0ILs0KJY5RupfF8XwRgMQgCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption>圖片來源:https://pixabay.com/en/books-spine-colors-pastel-1099067/ 和 https://blog.xebialabs.com/2016/03/21/essential-devops-terms/</figcaption></figure></section><section><p>在上一篇(<a href="http://blog.alantsai.net/2018/02/devopsSeries-26-package-stage-intro.html">[26]Package階段介紹</a>)介紹完了Package階段主要做的兩個事情:打包的<em>格式</em>,以及用來區分差異的<em>版號 (version)</em>。</p><p>在接下來的幾篇將會介紹和版號有關的內容。 </p><p>這篇會從最基本的開始,在.Net裡面是如為某一個library產生出來的dll打上版號?如何看到這個版號的資訊呢? </p></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518334728728238" ;="">有寫過的相關文章</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518334728728213" ;="">一張表看懂dll版號的值和設定版號方式 - TL;DR</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518334728728950" ;="">如何看dll的版號?</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518334728728142" ;="">3個版號的差異是什麼?</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518334728728214" ;="">如何設定dll的版號?</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518334728728384" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a> <section><h2 id="WizKMOutline_1518334728728238">有寫過的相關文章</h2><ul><li><a href="http://blog.alantsai.net/2017/10/donet-dll-hell-problem-how-to-use-bindingredirect.html">[.Net]Dll明明有在,為什麼出現找不到DLL錯誤 - 一次搞懂如何處理Dll版本問題(Dll Hell)</a> - 這篇介紹的是如何在runtime的時候選擇想要執行的版本 - 也就是那個版號</li>
</ul></section><section><h2 id="WizKMOutline_1518334728728213">一張表看懂dll版號的值和設定版號方式 - TL;DR</h2><table class="table"><tbody>
<tr><th></th><th>Assembly Version</th><th>File Version</th><th>Product Version</th></tr>
<tr><th>作用</th><td>.Net Runtime對應<br />
dll版本的時候看這個值</td><td>區別build出來的dll和上一個版本的差異。一般build資訊會放在這邊。</td><td>從<em>產品</em>的角度這個dll的版本<br />
用nuget exe產生nuget的時候,會用這個作為nuget的版號</td></tr>
<tr><th>確認dll的版號值</th><td>使用powershell: <br />
<code>[System.Reflection<br />
.Assembly]<br />
::LoadFrom("d:\xxx.dll") <br />
.GetName().Version</code></td><td> 檔案總管<br />
右鍵<br />
Property<br />
Details 頁簽<br />
File Version </td><td> 檔案總管<br />
右鍵<br />
Property<br />
Details 頁簽<br />
Product Version </td></tr>
<tr><th>設定的Attribute名稱</th><td><code>[assembly: AssemblyVersion("1.0.0.0")]</code></td><td><code>[assembly: AssemblyFileVersion("1.0.0.0")]</code></td><td><code>[assembly: AssemblyInformationalVersion("1.0.0.0")]</code></td></tr>
</tbody></table><p>詳細說明往下看。 </p></section><section><h2 id="WizKMOutline_1518334728728950">如何看dll的版號?</h2><p>當dll build出來之後,可以直接對他點: </p><ol><li><code>右鍵</code></li>
<li><code>Property (內容)</code></li>
<li>切換到 頁簽 <code>Details</code></li>
</ol>裡面有兩個欄位有數字: <ol><li>File Version</li>
<li>Product Version</li>
</ol><figure><a href="https://lh3.googleusercontent.com/-bOInOOLYmGU/Wn_1oO9A23I/AAAAAAAAXpY/QnNdtPGLOVMzwNvYFhvVPn-xsciPfkcwwCHMYCw/s1600-h/image%255B11%255D"><img width="654" height="459" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-P7bukFWXVKU/Wn_1pSzbbYI/AAAAAAAAXpc/yniyp9TFDyopBMFmXyIMoTHhN7aezuAGACHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a><br />
<figcaption>建立出來的console版號</figcaption></figure><p>不過其實這個不是完整的版號內容,在dll裡面還有一個版號,這個版號是<em><strong>Assembly</strong></em>的版號,這個版號是<em><strong>.Net Reference dll看的版號</strong></em>。如果要看這個版號可以用powershell: </p><pre class="brush: powershell;">[System.Reflection.Assembly]::LoadFrom("d:\ConsoleApplication1.exe").GetName().Version
</pre><figure><a href="https://lh3.googleusercontent.com/-FzcS-HNDWN0/Wn_1rCyi0gI/AAAAAAAAXpg/KLRU0W3MLsQEr7cSShv_LV-DKufVYBjSwCHMYCw/s1600-h/image%255B8%255D"><img width="654" height="100" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/--QuijejgCAo/Wn_1u-ypEVI/AAAAAAAAXpk/O7VwZRWEvQ0KXzey9jxgzqm2XpegldTSACHMYCw/image_thumb%255B2%255D?imgmax=800" border="0"></a><br />
<figcaption>取得Assembly Version</figcaption></figure><p>從上面的資訊可以看出來,一個dll總共有3個版號: </p><ol><li>File Version</li>
<li>Product Version</li>
<li>Assembly Version</li>
</ol>這3個版號的作用是什麼呢? </section><section><h2 id="WizKMOutline_1518334728728142">3個版號的差異是什麼?</h2><dl><dt>Assembly Version</dt>
<dd>這個是.Net裡面內部再用的,所以當有reference某個dll,會包含一個版號的資訊。這個版號看的就是Assembly Version這個值。</dd>
<dt>File Version</dt>
<dd><p>原則上這個是用來區分build和build之間差異的版本資訊。因此,一般來說這個會包含像是<em><strong>build number</strong></em>這種資訊。 </p><p>很有可能Assembly的版號還沒更新,但是在開發的過程,每一次build可能都不一樣,那麼這個時候File Version可能就會因此提升來<em><strong>表示</strong></em>這次build和上次build不同。 </p></dd>
<dt>Product Version</dt>
<dd><p>這個主要用來表示,從一個<em><strong>產品</strong></em>的角度之間的差異。 </p><div class="bs-callout bs-callout-info">如果用nuget建立出nuget的package,那麼nuget預設使用Product Version作為版號。 </div></dd></dl></section><section><h2 id="WizKMOutline_1518334728728214">如何設定dll的版號?</h2><p>到目前為止了解了3種不同版號的用意及如何看到這些版號的值,接下來就是如何在build的時候把這些版號資訊寫進去。 </p><p>在建立任何專案的時候,都會自動建立出<code>Properties\AssemblyInfo.cs</code>這個檔案。 </p><p>這個檔案包含一些dll的meta資訊,例如assembly的名稱,assembly描述等。其中一塊就是用來定義3個版號資訊。 </p><p>這3個attribute分別為: </p><dl><dt>assembly: AssemblyVersion</dt>
<dd>對應到 Assembly Version</dd>
<dt>assembly: AssemblyFileVersion</dt>
<dd>對應到File Version</dd>
<dt>assembly: AssemblyInformationalVersion</dt>
<dd>對應到Product Version</dd></dl>其中 <code>AssemblyInformationalVersion</code>預設不存在,是需要自己手動添加。 <figure><a href="https://lh3.googleusercontent.com/-Fju6tS060-Q/Wn_1yTP_4WI/AAAAAAAAXpo/e4z2DXXDoCUjEGXS8S0eMtjDQjYQssHmwCHMYCw/s1600-h/image%255B14%255D"><img width="654" height="259" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Ciq49thWe_U/Wn_12gLlQ5I/AAAAAAAAXps/GCyBWg36pAAUki76iJ1MLwfsavHaGFMIQCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a><br />
<figcaption>設定內容的截圖</figcaption></figure></section><section><h2 id="WizKMOutline_1518334728728384">結語</h2><p>這篇介紹了在.Net裡面的3個版號值的名稱,以及怎麼查到一個dll這三個值的方式。 </p><p>再來介紹了如何在.Net專案透過設定<code>Properties\AssemblyInfo.cs</code>這個檔案來設定build出來的dll的3個值。 </p><p>在下篇將會介紹版號的組成構架應該是如何,並且使用最常見的版號模式 SemVer 2.0(又稱為Semantic Version 2.0) </p></section><section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:d5489615-e23b-48b9-a707-07a5468938ee" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8c%e5%be%9e.Net%e5%b7%a5%e7%a8%8b%e5%b8%ab%e7%9a%84%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8bDevOps%e3%80%8d" rel="tag">「從.Net工程師的角度來看DevOps」</a>,<a href="http://blog.alantsai.net/search/label/%e3%80%8ciThome+%e7%ac%ac%e5%85%ab%e5%b1%86%e9%90%b5%e4%ba%ba%e8%b3%bd%e3%80%8d" rel="tag">「iThome 第八屆鐵人賽」</a>,<a href="http://blog.alantsai.net/search/label/devops" rel="tag">devops</a>,<a href="http://blog.alantsai.net/search/label/.net" rel="tag">.net</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-19666643589528658462018-02-10T22:50:00.000+08:002018-02-10T22:51:45.916+08:00[從.Net工程師的角度來看DevOps 26]Package階段介紹<section><figure><a href="https://lh3.googleusercontent.com/-tnqvDx0S9zA/Wn8GLvEs4rI/AAAAAAAAXoo/4zR5qLPEF8EWGuXhaG1tTGJjM07XLjGzwCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-i6sEEVNvXsA/Wn8GNOlLmzI/AAAAAAAAXos/StTF7z3_JC8pQo8Vn1YkUPCyMmKxP1IWQCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption>圖片來源:https://pixabay.com/en/books-spine-colors-pastel-1099067/ 和 https://blog.xebialabs.com/2016/03/21/essential-devops-terms/</figcaption><br />
</figure></section><section><p>在上一篇(<a href="http://blog.alantsai.net/2017/12/devopsSeries-intro-to-free-ci-service-visual-studio-team-services.html">[25]在Visual Studio Team Services執行Build Script和CI Server總結</a>)介紹完了VSTS的build建制之後,基本上build階段算是告一個段落了。</p><p>到目前為止,我們的build script不管是在CI Server那一端,還是在local端都能夠執行一樣的build script來產生出能夠執行的內容。 </p><p>接下來就要進入另外一個階段,也就是怎麼把產生出的內容<em><strong>打包</strong></em>成為適合發佈用的階段,也就是:<em><strong>package</strong></em>。 </p><p>這篇將會對於package階段的內容做個基本介紹。 </p></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518273685038342" ;="">Package階段在做什麼</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518273685038258" ;="">常見的Package格式</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518273685038336" ;="">壓縮檔 - zip</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518273685038590" ;="">nuget</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518273685038179" ;="">Web - web deploy package</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518273685038706" ;="">DB - dacpac</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518273685038346" ;="">版號的重要性</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518273685038577" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a> <section><h2 id="WizKMOutline_1518273685038342">Package階段在做什麼</h2><p>還記得在一開始(<a href="http://blog.alantsai.net/2016/12/devopsSeries-whatIsDevops.html">[02]什麼是DevOps?</a>)介紹CI和CD的整個大框架的時候,有個部分叫做Package - 專門用來在Continus Delivery階段的時候執行:</p><figure><a href="https://lh3.googleusercontent.com/-MjOuYg5ORzw/Wn8GOKEWwOI/AAAAAAAAXow/DrEmHq_oiHE_FWegz2-o58Vx3o1QV6nBACHMYCw/s1600-h/image%255B5%255D"><img width="421" height="407" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-1Nh8t5tbImM/Wn8GPCmAUPI/AAAAAAAAXo0/hipTQKFPNFoD85FyH7hjmSyiea9zfs8FgCHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a><br />
<figcaption>Package階段</figcaption></figure><p>那package實際上是在做什麼事情呢?其實想一下,當我們把程式碼編譯了之後一般來說會做什麼? </p><p>是不是會把編譯過的內容更新到機器上面?那要更新過去會遇到一個問題,就是怎麼 <em><strong>打包</strong></em> 讓攜帶過去更新的時候更加的方便。 </p><p>既然提到了打包,那麼和直覺的下一個問題就是,打包成為什麼<em><strong>格式</strong></em>。 </p></section><section><h2 id="WizKMOutline_1518273685038258">常見的Package格式</h2><p>一般來說在.Net的世界裡面有幾種類型的格式: </p><ol><li>壓縮檔 - 例如 zip</li>
<li>nuget - 共用library</li>
<li>web在用 - web deploy的package</li>
<li>DB - dacpac</li>
</ol><section><h3 id="WizKMOutline_1518273685038336">壓縮檔 - zip</h3><p>一般來說會把編譯過的內容打包成為zip只有一個目的,就是copy過去的時候更<em>快速和方便</em>。由於通用性很好,因此大部分的package本質上 都是zip。 </p><p>不管什麼類型的專案和檔案,也不管目標是什麼版本的windows,基本上把zip帶過去解壓縮就可以用了。因此zip是最常見的一種package方式。 </p><p>這種類型偏向於是要把程式<em>更版</em>或者提供給他人能夠<em>直接使用</em>。</p></section><section><h3 id="WizKMOutline_1518273685038590">nuget</h3><p>如果今天開發的是一個<em>library</em>或者說是用來<em>輔助開發</em>使用的內容,那麼包成nuget是最適合的package。 </p><p>nuget本質上也是zip,不過和zip不同之處在於他有<em>一些meta資訊</em>,可以提供一些像是package內容<em>說明和版號</em>等資訊。 </p><p>如果是公開的library,那麼可以放到Microsoft提供的nuget server,或者可以自己架設內部的nuget server。 </p><p>關於如何建立nuget package,可以參考我部落格裡面和<em>nuget</em>標籤有關的內容:<a href="http://blog.alantsai.net/search/label/nuget">直接連接</a></p><p><iframe src="//www.slideshare.net/slideshow/embed_code/key/kPw3WVpnJv2frE" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"><strong> <a href="//www.slideshare.net/alantsai2007/nuget-package" title="Nuget介紹- 如何使用和建立自己的package" target="_blank">Nuget介紹- 如何使用和建立自己的package</a> </strong> from <strong><a href="https://www.slideshare.net/alantsai2007" target="_blank">Alan Tsai</a></strong> </div></section><section><h3 id="WizKMOutline_1518273685038179">Web - web deploy package</h3><p>如果今天要更新的內容是<em><strong>網站類型</strong></em>的內容(例如Asp.Net網站)要更新到<em><strong>IIS</strong></em>,那麼 web deploy package是一個很適合的格式。 </p><p>Web deploy package本質上也是zip,不過裡面有一些額外資訊可以讓IIS裡面的Web Deploy讀懂,讓更新的時候做到<em><strong>差異更新</strong></em>。 </p></section><section><h3 id="WizKMOutline_1518273685038706">DB - dacpac</h3><p>如果今天是要更新db schema的部分,那麼dacpac是很適合的格式。 </p><p>dacpac本質上也是zip,不過裡面記錄了一些資訊,然後工具執行更新的時候,知道需要<em><strong>異動</strong></em>那些schema。 </p><p>從某種程度來說,dacpac就是同等於web deploy package在IIS裡面的地位。 </p><div class="bs-callout bs-callout-info">雖然DB很重要,但是在這個系列不會介紹到dacpac的建立 </div></section></section><section><h2 id="WizKMOutline_1518273685038346">版號的重要性</h2><p>了解了不同類型的package格式了之後,下一個問題就是,在可以支援更新的那種package(也就是除了zip以外的所有package),是要怎麼知道到底有沒有更新呢?或者說怎麼知道要更新的內容和目前的內容之間的<em>差異</em>有多少呢? </p><p>這就不得提到<em><strong>版號</strong></em>了。 </p><p>舉個簡單例子,今天裝了<em>Json.Net</em> 1 版的nuget,那麼如果2版出來的時候,因為版號的差異就可以知道屬於往上升的情況。 </p><p>因此版號的機制非常重要,好的版號機制能夠讓管理的人有個基本概念知道,<em><strong>更新的內容是否會有breaking change</strong></em>。 </p></section><section><h2 id="WizKMOutline_1518273685038577">結語</h2><p>在這篇介紹了package的兩個基本概念: </p><ol><li>格式</li>
<li>版本</li>
</ol>基本上格式的部分了解差不多了,剩下只需要了解怎麼產生即可。 <p>不過版本的部分牽涉的內容更多,因此接下來的篇幅將會在更深入的介紹版本的基本概念,以及如何產生版號。 </p></section><section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:1330a604-ac89-4184-ae8d-307ae198582e" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8c%e5%be%9e.Net%e5%b7%a5%e7%a8%8b%e5%b8%ab%e7%9a%84%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8bDevOps%e3%80%8d" rel="tag">「從.Net工程師的角度來看DevOps」</a>,<a href="http://blog.alantsai.net/search/label/%e3%80%8ciThome+%e7%ac%ac%e5%85%ab%e5%b1%86%e9%90%b5%e4%ba%ba%e8%b3%bd%e3%80%8d" rel="tag">「iThome 第八屆鐵人賽」</a>,<a href="http://blog.alantsai.net/search/label/devops" rel="tag">devops</a>,<a href="http://blog.alantsai.net/search/label/.net" rel="tag">.net</a>,<a href="http://blog.alantsai.net/search/label/nuget" rel="tag">nuget</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-76354581859274693822018-02-10T20:52:00.000+08:002018-02-10T21:44:03.775+08:00[Data Science 到底是什麼從一個完全外行角度來看][18]R語言基礎 中篇 - 1維度資料結構介紹<section><figure><a href="https://lh3.googleusercontent.com/-rB6N9US9IdI/Wn7qelGQ4UI/AAAAAAAAXn8/d0bxYTVVnbojdMwx_EHJNBL96odr09QaQCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-xCja-LEaM1U/Wn7qgsTBGJI/AAAAAAAAXoA/8S4ykeYkKBkWZK2LF8YExB_DUpauI8nkQCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption>圖片來源: <a href="https://pixabay.com/en/books-spine-colors-pastel-1099067/">https://pixabay.com/en/books-spine-colors-pastel-1099067/</a> 和 <a href="https://pixabay.com/en/math-blackboard-education-classroom-1547018/">https://pixabay.com/en/math-blackboard-education-classroom-1547018/</a></figcaption></figure></section><section><p>在上一篇(<a href="http://blog.alantsai.net/2018/01/data-science-series-17-r-program-basic-language-paradigm-and-data-type.html">[17]R語言基礎 上篇 - 語言特性和資料形態</a>)提到R的Language Paradigm和R的Data Type。</p><p>裡面有提到,R其實是Vector base,換句話說一切都是vector。那vector到底有哪幾種(換句話說就是有哪些Data Structure)? </p><p>這篇將對R裡面的<em>1維度</em>Data Structure做介紹。 </p><div class="bs-callout bs-callout-default">這篇的範例程式碼在github: <a href="https://github.com/alantsai/blog-data-science-series/tree/master/src/chapter-18-r-1-dimension-data-structure">alantsai/blog-data-science-series 裡面的 src/chapter-18-r-1-dimension-data-structure</a> </div></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518266387475833" ;="">R的Data Structure</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518266387476193" ;="">vector - 1維並且所有內容要是一樣的type</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518266387476390" ;="">如何建立vector</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518266387476319" ;="">如何使用vector</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518266387476660" ;="">如何新增和刪除資料</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518266387476533" ;="">list - 1維 但是 內容形態可以不一樣</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518266387476364" ;="">如何建立list</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518266387476823" ;="">如何使用List</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518266387476522" ;="">結語</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1518266387477530" ;="">參考資料</a><br />
</li>
</ul></div></section> <a name='more'></a><section><h2 id="WizKMOutline_1518266387475833">R的Data Structure</h2><p>在R裡面的Data Structure基本上可以從兩個面向來看: </p><ol><li>幾個維度</li>
<li>是否整個資料屬於<em>同一個type</em></li>
</ol><figure><a href="https://lh3.googleusercontent.com/-Ran94uUJi-Y/Wn7qid65PNI/AAAAAAAAXoE/yQDkcyDVrCUUsBtvyUkn9IhvGvGN9V9YQCHMYCw/s1600-h/image%255B5%255D"><img width="654" height="218" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-T0-UfJpP7Dg/Wn7qkUlg9wI/AAAAAAAAXoI/hnXE_acPUrQW3PIvKxZto5wTk9Dar0oeQCHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a><br />
<figcaption>幾種data structure</figcaption></figure><p>如果上面的描述還是看不太懂,那麼往下看就會了解這兩個面向的意思。 </p><section><h2 id="WizKMOutline_1518266387476193">vector - 1維並且所有內容要是一樣的type</h2><p>vector是一切的基礎,像我們之前的<code>3+5</code>回傳的是一個vector,裡面<em>只有一個值 5</em>。 </p><section><h3 id="WizKMOutline_1518266387476390">如何建立vector</h3><p>如果要建立一個vector,使用的是<code>c</code>這個function,例如,假設有一組資料要代表成績: </p><pre class="brush: plain;">score <- c(20,10,50,60)
score</pre>結果是:<code>[1] 20 10 50 60</code><p>上面可以看到,vector只有一個維度,並且都是numeric。 </p><p>vector沒辦法混不同形態,所以假設如下面,如果最後一個分數不小心用引號包起來: </p><pre class="brush: plain;">scoreError <- c(20,10,50,"60")
scoreError
</pre>那麼最後結果會是:<code>[1] "20" "10" "50" "60"</code><div class="bs-callout bs-callout-warning">注意到了嗎,被轉換成了所有都是char - 而不是數字 </div><p>除了用<code>c</code>之外,還有一些別的方式可以建立vector,例如假設要建立1到5,可以用: </p><pre class="brush: plain;">oneToFive <- 1:5
oneToFive
</pre>執行結果:<code>[1] 1 2 3 4 5</code></section><section><h3 id="WizKMOutline_1518266387476319">如何使用vector</h3><p>如果要從vector取值,可以用中括弧(<code>[]</code>)取,不過和一般語言不一樣,它是從<em>1</em>開始算起,而不是0。 </p><p>例如上面的分數,如果要取得第三個人的分數,可以用:<code>score[3]</code></p><p>除了用取那一筆的方式取得值,也可以用logic值來說這個vector是否要取到,下面例子就是用logic vector 來取值。 </p><p>假設要找出所有分數在<em>30分以上</em>,可以用: </p><pre class="brush: plain;">score > 30
score[score > 30]
</pre><figure><a href="https://lh3.googleusercontent.com/-MGlklkWBJUE/Wn7qlSx0VfI/AAAAAAAAXoM/pFQkDAgb3t0TSCZytG4tse-gTpSctnLVACHMYCw/s1600-h/image%255B8%255D"><img width="483" height="353" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-L74WqBha1yE/Wn7qph8_7qI/AAAAAAAAXoQ/3i7ROFzii1ot5WZia8VvQcPaxfq8hs7zgCHMYCw/image_thumb%255B2%255D?imgmax=800" border="0"></a><br />
<figcaption>第一個得到是一個vector logic,然後用他來取得值</figcaption></figure><p>vector logic可以有很多其他運用,舉例來說,如果要找出分數在<em>30以上的比例</em>,可以用: </p><p><code>mean(score > 30)</code>,得到的結果是<code>0.5</code></p><p>因為30以上有2筆,總共4筆,所以是百分之50. </p><p>上面那個可以work是因為,logic的<em>FALSE</em>和<em>TRUE</em>其實就是<em>0</em>和<em>1</em>。 所以直接做平均從(<code>mean</code>)就是把0和1 <em>相加然後除去總數</em>。 </p></section><section><h3 id="WizKMOutline_1518266387476660">如何新增和刪除資料</h3><p>要新增一筆資料其實非常簡單,只需要把值assign 到對應的位置即可。 </p><p>例如假設第5個人的分數是100,那麼可以這樣做: </p><pre class="brush: plain;">score[5] <- 100
</pre><p>反過來,如果要刪掉,其實就是重新assing就可以。例如把第5筆資料刪掉就會是: </p><pre class="brush: plain;">score <- score[1:4]
</pre></section><div class="bs-callout bs-callout-info">上面提到的一些使用和增刪資料和接下來的structure操作起來概念一樣,因此不會特別在介紹。 </div></section><section><h2 id="WizKMOutline_1518266387476533">list - 1維 但是 內容形態可以不一樣</h2><p>如果說資料是1個維度但是每一個資料的形態不同,那麼可以使用list。 </p><section><h3 id="WizKMOutline_1518266387476364">如何建立list</h3><p><code>c</code>是用來建立vector,而<code>list</code>就是用來建立list用。 </p><p>舉例來說,假設最後一個不知道為什麼是字串,那麼: </p><pre class="brush: plain;">listScore <- list(20,10,50,"60")
</pre><p>那麼<code>listScore</code>的值會是: </p><pre class="brush: plain;">[[1]]
[1] 20
[[2]]
[1] 10
[[3]]
[1] 50
[[4]]
[1] "60"
</pre><p>更合理一點的例子會是,假設要把每一個分數的對應使用者名稱也加上,就可以用兩個vector在用list組合: </p><pre class="brush: plain;">name <- c("A", "B", "C", "D")
scoreWithName <- list(name,score)
</pre><p>這個時候<code>scoreWithName</code>就會是: </p><pre class="brush: plain;">[[1]]
[1] "A" "B" "C" "D"
[[2]]
[1] 20 10 50 60
</pre></section><section><h3 id="WizKMOutline_1518266387476823">如何使用List</h3><p>雖然list是1維,但是因為可以不同形態,所以很有可能裡面包的是一個vector,甚至是list,因此在取值的方式上面有些許的不同。 </p><p>要取得第一個list資料用的是兩個中括弧,因此,假設想要取得第一個人的名字,用法會是: </p><pre class="brush: plain;">scoreWithName[[1]][1]
# A
</pre><p>其他和一般vector沒有太大兩樣。 </p></section><div class="bs-callout bs-callout-info">以剛剛的例子,貌似要建立分數和名稱的對應需要用list,但是實際上不太建議,因為取值的時候不太方便並且不直覺。後面介紹的<em>dataframe</em> 反而會是比較適合的形態。 </div></section></section><section><h2 id="WizKMOutline_1518266387476522">結語</h2><p>在這篇介紹了R的兩種資料結構,分別為1維度同類型的<em>vector</em>及1維度但可以不同類型的<em>list</em>。 </p><p>在下一篇將會把整個資料結構做個總結,分別介紹2維度同類型的<em>matrix</em>,及2維度不同類型的<em>dataframe</em></p></section><section><h2 id="WizKMOutline_1518266387477530">參考資料</h2><dl><dt>Advanced R 裡面介紹 Data Structure</dt>
<dd><a href="http://adv-r.had.co.nz/Data-structures.html">http://adv-r.had.co.nz/Data-structures.html</a></dd></dl></section><section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:77246517-fc7e-4cc9-87e3-6eed50445810" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a>,<a href="http://blog.alantsai.net/search/label/R" rel="tag">R</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-67778604319824985622018-01-16T23:32:00.000+08:002018-01-16T23:40:45.968+08:00[Data Science 到底是什麼從一個完全外行角度來看][17]R語言基礎 上篇 - 語言特性和資料形態<section><figure><a href="https://lh3.googleusercontent.com/-fVvknVbrq0g/Wl4ad7HFxDI/AAAAAAAAXgc/yHo92kbZMZIfzzKQ5oN6KmzusheTMU5PACHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-FyVTplZ-3EU/Wl4agC71f3I/AAAAAAAAXgg/cMkCZm_HdsY95BcOMHxUp_tuFcNJjQC5gCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption>圖片來源: <a href="https://pixabay.com/en/books-spine-colors-pastel-1099067/">https://pixabay.com/en/books-spine-colors-pastel-1099067/</a> 和 <a href="https://pixabay.com/en/math-blackboard-education-classroom-1547018/">https://pixabay.com/en/math-blackboard-education-classroom-1547018/</a></figcaption></figure></section><section><p>在上一篇(<a href="http://blog.alantsai.net/2018/01/data-science-series-16-r-hello-world-with-stock-analysis-using-quantmod.html">[16]用R來看股票,透過quantmod了解R的強大</a>)用了<code>quantmod</code>快速了解如何使用R並且用他來做資料處理的便利性。</p><p>在這篇將會更深入一點點的介紹R的語言特色、幾種不同的資料形態。 </p><div class="bs-callout bs-callout-default">這篇的範例程式碼在github:<a href="https://github.com/alantsai/blog-data-science-series/tree/master/src/chapter-17-r-language-paradigm-data-type">alantsai/blog-data-science-series 裡面的 src/chapter-17-r-language-paradigm-data-type</a></div></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1516113008736340" ;="">R的語言特性(Language Paradigm)</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1516113008736554" ;="">Vector Base - 一切都是向量</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1516113008736291" ;="">Functional Programming</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1516113008736936" ;="">R的資料形態(data type)</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1516113008736383" ;="">這篇有用到的R function</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1516113008736696" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a> <section><h2 id="WizKMOutline_1516113008736340">R的語言特性(Language Paradigm)</h2><p>基本上現在任何程式語言都會有多個語言特性,例如C#一開始屬於<em>Object Oriented Language</em>,不過後來吸收了一些別的特性,又多出了像是<em>Functional Language</em>的特性等。知道了語言特性之後,對於整個運作模式會比較了解。那R是屬於什麼類型呢? </p><p>基本上,個人覺得R有兩個重要的特性: </p><ol><li>Vector Base</li>
<li>Functional Programing</li>
</ol><section><h3 id="WizKMOutline_1516113008736554">Vector Base - 一切都是向量</h3><p>基本上在R裡面,最基本的組成是vector,因此就算一個簡單的<code>2+3</code>,最後的結果其實是一個vector: </p><figure><a href="https://lh3.googleusercontent.com/-c3prHA6_ScI/Wl4ahEvkbBI/AAAAAAAAXgk/x05_rKVds1MafSV0Bhg5kclv3oJSd9aHQCHMYCw/s1600-h/image%255B5%255D"><img width="459" height="357" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-oqBnvtwTSSA/Wl4aiI2yn0I/AAAAAAAAXgo/zgdKC7UUPFoYDth0l1II5AskPaMgv47ZgCHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a><br />
<figcaption>可以看到最後的結果是 5,不過他的值是[1] - 換句話說就是vector的<em>第一筆</em></figcaption></figure><div class="bs-callout bs-callout-info">題外話 - 在R裡面,assign variable用的是 <code><-</code>。雖然用<code>=</code>也可以,但是因為<code>=</code>在特殊地方有特殊含義,因此還是建議用<code><-</code>。 </div><p>vector為導向有什麼特別的嗎?vector為主對於做運算非常方便: </p><dl><dt>單數運算</dt>
<dd><p>如果是對<em>單數</em>做加減乘除,會把所有的vector都加上那個值。 </p><pre class="brush: plain;">b <- c(2,3)
b * 2</pre><figure><a href="https://lh3.googleusercontent.com/-er4xFtsL8Bg/Wl4aiyXMZ3I/AAAAAAAAXgs/9TtjLK1tck4hAbPk0PBZoFj2w0YF9BUigCHMYCw/s1600-h/image%255B8%255D"><img width="444" height="522" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-gnjjkkoGfqw/Wl4amApioiI/AAAAAAAAXgw/snn-BHxL4MIjMrZHiegQgB2yXUAlccNZwCHMYCw/image_thumb%255B2%255D?imgmax=800" border="0"></a> <figcaption>可以看到,在vector裡面兩個值都被*上2</figcaption></figure></dd>
<dt>兩個vector運算</dt>
<dd><p>如果是兩個vector相加,那麼對應的位置會互加。 </p><pre class="brush: plain;">c <- c(6,7)
b+c</pre><figure><a href="https://lh3.googleusercontent.com/-vwxpJ0kBWz0/Wl4an6mE6iI/AAAAAAAAXg0/2Yj37f9Ui6cnGrqtkDmIJz4bn6FrvmjPwCHMYCw/s1600-h/image%255B14%255D"><img width="373" height="414" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-uEoGDlTZGOE/Wl4aryeB0WI/AAAAAAAAXg4/5jda_GPSGP0qDK3jt-09WdT8hZfBK16BQCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a> <figcaption>可以看到,對應位置的會互相加</figcaption></figure></dd></dl><div class="bs-callout bs-callout-info">要做到這種所有內容都要運算,一般語言都要用到loop才有辦法做到。不過vector base基本上就不需要,這也是為什麼雖然R有支援loop但是用到比較少。 </div></section><section><h3 id="WizKMOutline_1516113008736291">Functional Programming</h3><p>基本上R可以理解為functional programing language。因此如果很熟悉functional programming的開發方式,會覺得很親切。 </p><p>舉例來說,剛剛那個所有vector都+2的範例,如果改成functional寫法可以是: </p><pre class="brush: plain;">sapply(b, function(x){x + 2})</pre><p>得到的結果會是:<code>[1] 4 5</code></p><p>這邊的意思是,對於每一個<code>b</code>vairable的<em><strong>每一個值</strong></em>,會對他們執行一個<em>anonymous function (匿名函數)</em>,這個function就是把<em>值+2</em></p><div class="bs-callout bs-callout-info"><p><code>apply</code>類型的function很常見,例如:<code>lapply</code>、<code>sapply</code>、<code>vapply</code>等。 </p><p>基本上每一個用途差不多,差異在於<em>回傳的形態</em>。 </p></div><div class="bs-callout bs-callout-info">如果C#有習慣用lambada,會覺得其實很親切,這個其實就是C#從functional language學習到的特色之一。 </div></section><p>R還有一些別的特性,不過個人認為上面兩個最重要,並且因為這兩個的關係,所以雖然R支援loop,但是<em>使用比較少</em>(所以也不會特別介紹)。 </p><p>對於特性有點概念了之後,來看看R裡面的形態和其他資料結構。 </p></section><section><h2 id="WizKMOutline_1516113008736936">R的資料形態(data type)</h2><p>R和一般語言不一樣,在C#裡面如果有個variable是int,例如:<code>int a</code>,那麼a的形態就是integer。 </p><p>但是在R裡面,雖然資料形態是integer,但是他的底層是<em>vector</em>,這也是為什麼說R是vector base,因為一切都是vector。 integer只是代表<em>裡面</em>儲存的資料形態而已。 </p> <table class="table"> <tbody>
<tr>
<th>資料形態</th>
<th>範例值</th>
<th>Note</th>
</tr>
<tr>
<td>Logical</td>
<td><br />
<code>TRUE</code>,<br />
<code>FALSE</code>,<br />
<code>T</code>,<br />
<code>F</code><br />
</td>
<td>注意要全大寫</td>
</tr>
<tr>
<td>Numeric</td>
<td><br />
<code>10.5</code>,<br />
<code>2.5</code><br />
</td>
<td></td>
</tr>
<tr>
<td>Integer</td>
<td><br />
<code>1L</code>,<br />
<code>2L</code><br />
</td>
<td>注意後面要加上<br />
<code>L</code><br />
</td>
</tr>
<tr>
<td>Character</td>
<td><br />
<code>"abc"</code>,<br />
<code>'123'</code>,<br />
<code>"TRUE"</code><br />
</td>
<td>單引號<br />
<code>'</code>或者雙引號<br />
<code>"</code>都可以</td>
</tr>
<tr>
<td>Complex</td>
<td><br />
<code>3 + 2i</code><br />
</td>
<td></td>
</tr>
<tr>
<td>Raw</td>
<td><br />
<code>charToRaw("hello")</code><br />
</td>
<td></td>
</tr>
<tr>
<td>Factor</td>
<td><br />
<code>factor(c("male", "female"))</code><br />
</td>
<td><br />
<ul> <li>Factor其實就是c#的enum</li>
<li>Factor不算data type,不過歸在這邊比較好看</li>
</ul> </td>
</tr>
</tbody>
</table> <table class="table"> <tbody>
<tr>
<th>資料形態</th>
<th>範例</th>
</tr>
<tr>
<td>Logical</td>
<td><br />
<pre class="brush: plain;">l <- c(TRUE, FALSE, T, F)
class(l)
is.logical(l)
</pre> </td>
</tr>
<tr>
<td>Numeric</td>
<td><br />
<pre class="brush: plain;">n <- c(10.5, 2.5)
class(n)
is.numeric(n)
</pre> </td>
</tr>
<tr>
<td>Integer</td>
<td><br />
<pre class="brush: plain;">i <- c(1L,2L)
class(i)
is.integer(i)
</pre> </td>
</tr>
<tr>
<td>Character</td>
<td><br />
<pre class="brush: plain;">char <- c("abc", '123', 'TRUE')
class(char)
is.character(char)
</pre> </td>
</tr>
<tr>
<td>Complex</td>
<td><br />
<pre class="brush: plain;">complex <- c(3 + 2i)
class(complex)
is.complex(complex)
</pre> </td>
</tr>
<tr>
<td>Raw</td>
<td><br />
<pre class="brush: plain;">raw <- charToRaw("hello")
class(raw)
is.raw(raw)
</pre> </td>
</tr>
<tr>
<td>Factor</td>
<td><br />
<pre class="brush: plain;">gender <- factor(c("male", "female"))
class(gender)
is.factor(gender)
</pre> </td>
</tr>
</tbody>
</table><div class="bs-callout bs-callout-warning"><p>要非常注意這些Data Type非常重要,之後在分析資料的時候很有可能因為形態錯誤的關係導致使用的演算法結果錯誤。 </p><p>因此了解這些基本形態會減少掉之後很多問題。 </p></div></section><section><h2 id="WizKMOutline_1516113008736383">這篇有用到的R function介紹</h2><p>在這邊用到了三個R的方法(還有<code>c</code>不過這個下一篇介紹): </p><dl><dt>class</dt>
<dd> 這個用來看variable裡面的data type是什麼 </dd>
<dt>is.*</dt>
<dd> 用來判斷某個variable的class符不符合。 <div class="bs-callout bs-callout-info">有個function是<code>as.*</code>,用來做<em>轉型</em>用。 </div></dd>
<dt>factor()</dt>
<dd>把vector轉成factor</dd></dl></section><section><h2 id="WizKMOutline_1516113008736696">結語</h2><p>在這篇首先對R的語言特性先做了介紹,了解到兩個最重要的特性: </p><ol><li>Vector base</li>
<li>functional programming</li>
</ol><p>再來看了R裡面的每一個最小單位的不同形態。 </p><p>在下一篇將會介紹R裡面的資料結構(Data Structure),和如果有問題如何找到相關的文件。 </p></section> <section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:32e8212f-9d42-4daa-80b6-e675453f2485" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a>,<a href="http://blog.alantsai.net/search/label/R" rel="tag">R</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-65889246318787895392018-01-03T23:05:00.000+08:002018-01-16T23:33:01.172+08:00[Data Science 到底是什麼從一個完全外行角度來看][16]用R來看股票,透過quantmod了解R的強大<section><figure><a href="https://lh3.googleusercontent.com/-FkUx_u1iq7c/WkzwNVKKgOI/AAAAAAAAXdg/53UnARig8SUClzk20A6EKh8hzR05zqHPACHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-LAfLycNyz4I/WkzwOhIZstI/AAAAAAAAXdk/eP6Y16LR16IzMv0pQxLRaZLHlap9E4H8ACHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption><span>圖片來源: <a href="https://pixabay.com/en/books-spine-colors-pastel-1099067/">https://pixabay.com/en/books-spine-colors-pastel-1099067/</a> 和 <a href="https://pixabay.com/en/math-blackboard-education-classroom-1547018/">https://pixabay.com/en/math-blackboard-education-classroom-1547018/</a></span></figcaption></figure></section><section><p>在上篇(<a href="http://blog.alantsai.net/2018/01/data-science-series-15-r-history-rstudio-r-tools-for-studio-ide-setting.html">[15]R是什麼?準備開發R的環境 - RStudio介紹</a>)了解了R的歷史和準備好了接下來的開發環境之後,就可以開始用R來做分析了。</p><p>一般來說,在學新的語言都會先看看所謂的Hello World,了解整個語言的Syntax和感覺。 </p><p>不過R不是一般型的程式語言,是給統計學家用的語言。因此,個人覺得如果只是看Hello World好像看不出來R特別的地方,不過如果直接學語法又太無聊。 </p><p>因此,這邊透過安裝和使用<code>quantmod</code>這個套件,並且用它來簡單分析股票作為R的入門介紹。 </p><div class="bs-callout bs-callout-default">這篇的範例程式碼在github:<a href="https://github.com/alantsai/blog-data-science-series/tree/master/src/chapter-16-r-quantmod-intro">alantsai/blog-data-science-series 裡面的 src/chapter-16-r-quantmod-intro</a></div></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514991190931779" ;="">quantmod是什麼?</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514991190931461" ;="">用quantmod分析google股票</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514991190931154" ;="">安裝和載入quantmod套件</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514991190932435" ;="">取得google股票資訊和分析得出內容</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514991190932200" ;="">畫出走勢</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514991190932414" ;="">畫出黃金和死亡交叉線</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514991190932384" ;="">結語</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514991190932227" ;="">參考資料</a><br />
</li>
</ul></div></section> <a name='more'></a> <section><h2 id="WizKMOutline_1514991190931779">quantmod是什麼?</h2><p>quantmod是一個R的套件,全稱是<code>Quantitative Financial Modelling and Trading Framework for R </code>,它是一個套件用來做股票相關分析。 </p><p>接下來將會用quantmod來分析google的股票。 </p></section><section><h2 id="WizKMOutline_1514991190931461">用quantmod分析google股票</h2><p>接下來會分幾個階段進行: </p><ol><li>安裝和載入quantmod套件</li>
<li>取得google股票資訊和分析得出內容</li>
<li>畫出走勢</li>
<li>畫出黃金和死亡交叉線</li>
</ol><section><h3 id="WizKMOutline_1514991190931154">安裝和載入quantmod套件</h3><p>第一個指令是:<code>library("quantmod")</code></p><p>可以直接放在左上角的script裡面,或者左下角的console執行。</p><p>在之後只要看到R的script裡面有出現:<code>library</code>,或者<code>require</code>,表示要<em><strong>載入套件到目前的session</strong></em>。 </p><p>舉例來說,如果看到<code>library("quantmod")</code>表示需要套件<code>quantmod</code>,這個時候如果沒有這個套件就<em><strong>記得要安裝</strong></em>。 </p><p>安裝方式有兩種: </p><ol><li>透過指令 - <code>install.packages</code></li>
<li>透過gui</li>
</ol><div class="bs-callout bs-callout-info">嚴格來說只有一種方式,就是<em>指令</em>,因為gui其實也是呼叫指令。 </div><p>使用GUI的話,有幾種做法: </p><ol><li>選擇右下角的 <code>install</code></li>
<li>在package名稱輸入 <code>quantmod</code> - 這邊會注意到會有auto complete的效果</li>
<li>最後按下安裝</li>
</ol><figure><a href="https://lh3.googleusercontent.com/-JreV_R0ucfA/WkzwQRC0fKI/AAAAAAAAXdo/Qn9eE6LAcrQNrlxE_NBaHupDyev_EyEvwCHMYCw/s1600-h/image%255B5%255D"><img width="563" height="407" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-n5GTs26mNEM/WkzwRW4-dgI/AAAAAAAAXds/YO22QhCb3Xs3m4GFDcAo-wVxcEnsjsrXQCHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a><br />
<figcaption>用gui安裝package</figcaption></figure><p>實際上,這個動作同等於在console呼叫<code>install.packages("quantmod")</code>,這邊有件事情要注意一下,安裝的時候會出現<em>紅色的字</em>,那個不是錯誤,只是在這個theme的情形下的訊息。 </p><figure><a href="https://lh3.googleusercontent.com/-_G7BFr-RCLs/WkzwSxlnbKI/AAAAAAAAXdw/WxHMKtlY6IIc271OM5-o8XhSSccWF8HwQCHMYCw/s1600-h/image%255B8%255D"><img width="654" height="590" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-2t1h3A6L6jE/WkzwT2vlGlI/AAAAAAAAXd0/e1NgHBK0D0Is4sRvU1poXevPbgIlQ1IGQCHMYCw/image_thumb%255B2%255D?imgmax=800" border="0"></a><br />
<figcaption>安裝的畫面</figcaption></figure></section><section><h3 id="WizKMOutline_1514991190932435">取得google股票資訊和分析得出內容</h3><p>在這個部分的指令如下: </p><pre class="brush: plain;"># 取得google的股票,並且看看前6筆資料
getSymbols("GOOG")
head(GOOG)
</pre><p>這邊用了兩個指令: </p><dl><dt>getSymbols</dt>
<dd>這個是quantmod提供的方法,GOOG是google的股票代號,這個資料是從yahoo股市來。</dd>
<dt>head</dt>
<dd><p>這個是r base(核心)的方法,表示看前6筆的資料。 </p><p>這個會很常看到,當拿到Data不知道是什麼的時候,就會呼叫<code>head</code>看一下內容。 </p></dd></dl><figure><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidUlcnlel2kVXFi5shS4yHqHJ9JL_eyqnUDctpDGDv5FgCHKN2byi6NWzTor9onqWXXItDK59UufXfS181LU65DGXJqTRnZBeM0Y-mgWn5h40uUHdlAw7zJtQZF31y20IprgEHla64tfzw/s1600-h/image%255B11%255D"><img width="654" height="450" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-tDGTz6b-nko/WkzwWe9ftnI/AAAAAAAAXd8/DLdAnpJgxvYjM24rDd_ObCygs-uHZXYFQCHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a><br />
<figcaption>執行結果</figcaption></figure><p>head出來的結果看到有6個欄位: </p><ol><li>GOOG.Open - 就是開盤價</li>
<li>GOOG.High - 最高價</li>
<li>GOOG.Low - 最低價</li>
<li>GOOG.Close - 收盤價</li>
<li>GOOG.Volime - 成交量</li>
<li>GOOG.Adjusted - 還原權值</li>
</ol><p>每一列是一個日期,換句話說就是每一天。 </p><div class="bs-callout bs-callout-info">還記得之前提到Data Science的3個圈圈嗎?其中一塊就是Domain Knowledge。如果不懂股票,那麼剛剛那些數值其實沒有任何意義。 接下來也沒有辦法做分析。 </div></section><section><h3 id="WizKMOutline_1514991190932200">畫出走勢</h3><p>看股票的就知道,會看一個所謂的走勢圖,quantmod讓畫這個走勢圖非常的簡單,只需要呼叫:<code>chartSeries(GOOG)</code></p><figure><a href="https://lh3.googleusercontent.com/-xcoaS_GPiE4/WkzwXSfQlWI/AAAAAAAAXeA/BfJO4GoWVykX8pntSB1pXfcyybpnKycugCHMYCw/s1600-h/image%255B14%255D"><img width="654" height="349" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVO73Mztvw2U_Nkr7J91GQHq3nzbtKthZzuQUvGJrG-xcpx_uBhyphenhyphenTkexoebEzmQVyVnizYzZw6AO_kHQXv-3PahYNg-ToaaFfn7neMYh01kDlSorFzI-Ppm4fMLpGq3w0Bk997i0t4OIKO/?imgmax=800" border="0"></a><br />
<figcaption>畫出走勢圖,從20070103到20180102</figcaption></figure> 可以把這張圖放大(放大鏡 Zoom)或者另存(圖片Export) <p>這個的區間可能非常長,可能看不太清楚,因此可以限制變成只分析進3個月的資料: <code>chartSeries(GOOG["2017-11-03::2018-01-03",])</code></p><div class="bs-callout bs-callout-info">還記得整個資料像是一個table的樣子,那麼等於我們在限制row(列)的部分,因為每一列是日期。 </div><figure><a href="https://lh3.googleusercontent.com/-1jKWL8aJx0s/Wkzwap-JiGI/AAAAAAAAXeI/ra99BjCqM30Ta821CaAlXe9mbayWQd9hwCHMYCw/s1600-h/image%255B17%255D"><img width="654" height="344" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-sip9uUu1ruU/WkzwbkgRQYI/AAAAAAAAXeM/USP5V1aLpdkug3La70LG38O-mkPf6sCEQCHMYCw/image_thumb%255B5%255D?imgmax=800" border="0"></a><br />
<figcaption>只顯示3個月</figcaption></figure><div class="bs-callout bs-callout-info">這個是國外的軟體,所以<em>綠色代表漲</em>,<em>紅色代表跌</em>。又是另外一個Domain Knowledge。 </div></section><section><h3 id="WizKMOutline_1514991190932414">畫出黃金和死亡交叉線</h3><p>有了資料和走勢,接下來是做一些分析。 </p><p>在股票來說,有個所謂的<em>黃金交叉新</em>和<em>死亡交叉線</em>。 </p><p>基本上有個概念叫做移動平均數(Moving Average MA),例如如果計算3天均數就是把三天的價加總算出平均。那這個會隨著天數移動,因此叫做移動平均數。 </p><p>如果一個長期的MA(例如60日季線)屬於<em>下降</em>然後短期的MA(例如20日月線)屬於<em>上升</em>並且<em>交叉</em>,就稱之為<em>黃金交叉</em>,原因是整個趨勢屬於上漲。 </p><p>死亡交叉是一樣概念,只是反過來。<em>短期</em>的MA屬於<em>下降</em>,然後<em>長期</em>屬於<em>上升</em>,兩者交叉的時候就是<em>死亡交叉</em>。 </p><div class="bs-callout bs-callout-info">還是要強調,Domain Knowledge的重要,小弟我不懂股票,了解這個概念也是花了一點時間。 </div><p>有了這個概念之後,來執行以下語法: </p><pre class="brush: plain;"># 計算 20日和60日均線
ma20<-runMean(GOOG[,4],n=20)
ma60<-runMean(GOOG[,4],n=60)
head(ma20, 25)
# 畫上線
chartSeries(GOOG["2017-01-03::2018-01-03",], theme = "white")
addTA(ma20,on=1,col="blue")
addTA(ma60,on=1,col="red")</pre><p>這邊用了一個新的方法,但是大部分都是quantmod的方法,因此不介紹了,不過有三個地方做一下說明: </p><dl><dt>runMean(GOOG[,4], n=20)</dt>
<dd><p>重點在<code>GOOG[,4]</code>。 </p><p>這邊有兩個部分: </p><ol><li>還記得MA的計算是用收盤價,所以我們要用所有的資料,因此逗點前面是空白,剛好和剛剛過濾日期是顛倒</li>
<li>這邊用的是第四個欄位,也就是收盤價的欄位。R裡面的index是從<em>1</em>開始,而不是像一般從0開始</li>
</ol></dd>
<dt>指令:<code>head(ma20,25)</code></dt>
<dd> 這邊指的是看前25筆,由於是20日均線,所以前20筆是NA因為不夠計算。 </dd>
<dt>指令:<code>chartSeries(GOOG["2017-01-03::2018-01-03",], theme = "white")</code></dt>
<dd> 之前只顯示前3個月沒辦法很好的畫,所以把整個時間拉長到1年,並且改成白色比較方便畫線。 </dd></dl><figure><a href="https://lh3.googleusercontent.com/-bliu2-M0frc/WkzwcqYQ4rI/AAAAAAAAXeQ/k-QqW9Z2AbMubMsGlzG22QhPNzPQHmljACHMYCw/s1600-h/image%255B20%255D"><img width="654" height="349" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-2185BgAlw-E/WkzwfgxtTxI/AAAAAAAAXeU/DHNSZ-GUnqo6BrO_EtO9n5C5dipipVjawCHMYCw/image_thumb%255B6%255D?imgmax=800" border="0"></a><br />
<figcaption>畫上均線</figcaption></figure></section></section><section><h2 id="WizKMOutline_1514991190932384">結語</h2><p>希望透過透過這個範例可以看出R的一些特點:不管在過濾列的資料和欄的資料都可以用簡單array的感覺來做到,並且在繪圖上面和呈現非常方便。 </p><p>不過要注意的是,這邊很多指令都是和quantmod這個套件有關,因此在一般其他的Exploratory analysis比較沒辦法使用到。 </p><p>因此在接下來將會在下一篇(<a href="http://blog.alantsai.net/2018/01/data-science-series-17-r-program-basic-language-paradigm-and-data-type.html">[17]R語言基礎 上篇 - 語言特性和資料形態</a>)介紹R的特性,和其他語言差別在哪別和一些特色。 </p></section><section><h2 id="WizKMOutline_1514991190932227">參考資料</h2><dl><dt>quantmod官網</dt>
<dd><a href="http://www.quantmod.com/examples/intro/#data">官網資料使用範例</a></dd>
<dt>第一次使用R語言做回測:六分鐘,就上手! </dt>
<dd><p>這篇基本參考了這個部落格裡面內容做介紹,部落格還有延伸一些預測會賺多少的介紹。 </p><a href="http://www.bituzi.com/2014/12/Rbacktest6mins.html">http://www.bituzi.com/2014/12/Rbacktest6mins.html</a></dd></dl></section> <section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:a742b24a-9d6c-46a7-a917-fff05100874d" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a>,<a href="http://blog.alantsai.net/search/label/data+processing" rel="tag">data processing</a>,<a href="http://blog.alantsai.net/search/label/R" rel="tag">R</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com2tag:blogger.com,1999:blog-7924743034677720383.post-29874225723300901732018-01-03T00:10:00.000+08:002018-01-03T23:13:14.356+08:00[Data Science 到底是什麼從一個完全外行角度來看][15]R是什麼?準備開發R的環境 - RStudio介紹<section><figure><a href="https://lh3.googleusercontent.com/-aS71m65kscw/WkuuKwey06I/AAAAAAAAXcE/WvtU26FkHbcYfBHGfVYaLQ0T_ToIAD-YQCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-BAEY0GVoaVk/WkuuMJEjG5I/AAAAAAAAXcI/7mBP7mcuHlc5oXDyjKJN2gwumNQ2H9ZgQCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption><span>圖片來源: <a href="https://pixabay.com/en/books-spine-colors-pastel-1099067/">https://pixabay.com/en/books-spine-colors-pastel-1099067/</a> 和 <a href="https://pixabay.com/en/math-blackboard-education-classroom-1547018/">https://pixabay.com/en/math-blackboard-education-classroom-1547018/</a></span></figcaption></figure></section><section><p>在上一篇(<a href="http://blog.alantsai.net/2018/01/data-science-series-14-how-to-define-good-question.html">[14]如何問對的問題?</a>)了解到了如何定義一個問題,那麼下一個步奏就是收集然後分析Data以解決定義的問題。</p><p>收集Data有很多方式,不過一般來說收集到的Data都需要經過一些處理才有辦法使用。 </p><p>有什麼麼能處理這些Data?這篇將會對於幾種不同處理Data的方式做些介紹,並且為什麼選擇R和如何準備接下來會用到的環境,RStudio。 </p></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514908850408551" ;="">分析Data的工具/語言</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514908850408840" ;="">使用軟體</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514908850408487" ;="">使用程式語言</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514908850408751" ;="">R的歷史</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514908850408125" ;="">安裝R</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514908850408492" ;="">R小檔案</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514908850408106" ;="">RStudio介紹和安裝</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514908850408937" ;="">RStudio小檔案</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514908850408751" ;="">RStudio 快速介紹</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514908850409138" ;="">主要界面</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514908850409357" ;="">幾個設定</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514908850409458" ;="">字體和樣式</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514908850409701" ;="">預設的script儲存編碼改為utf-8</a><br />
</li>
</ul></ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514908850409705" ;="">其他R IDE - Visual Studio</a><br />
</li>
<ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514908850409406" ;="">R Tools for Visual Studio</a></li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514908850409268" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a> <section><h2 id="WizKMOutline_1514908850408551">分析Data的工具/語言</h2><p>基本上,要分析Data有兩種方式: </p><ol><li>使用軟體</li>
<li>使用程式語言</li>
</ol><section><h3 id="WizKMOutline_1514908850408840">使用軟體</h3><p>最常見的軟體就是Microsoft Office的Excel。可以把Data喂進去,然後透過裡面一些定義好的方法能夠產生出非常漂亮的圖表或者分析表。 </p><p>其他常見的還有像是tableau其實都是這種類型。 </p><p>這些軟體因為有GUI所以好上手, 不過這種類型有個比較大的問題,那就是<em>不好確保重複做會是一樣的動作</em>。 </p><p>舉例來說,如果<em>定期</em>會收到某些格式的資料,但是這些資料都需要經過<em>處理</em>才有辦法做下一步的分析,請問什麼方式才能夠<em>確保每一次</em>的處理動作都會一樣?在這種軟體類型其實並不容易,或者說如果要做到就需要寫一些比較不好維護的script,例如VBScript。 </p><div class="bs-callout bs-callout-info">其實GUI類型的工具都沒有辦法很容易做到<em>自動化或者確保重複操作會一致</em>。 </div></section><section><h3 id="WizKMOutline_1514908850408487">使用程式語言</h3><p>既然GUI在處理重複性上面比較沒辦法做到,那下一個會看的就是程式語言。 </p><p>在Data Science的領域裡面,有幾個語言比較流行(其實有很多,用什麼都可以): </p><ol><li>Python</li>
<li>Scala</li>
<li>R</li>
</ol><p>Python屬於General Purpose Language,所以本來沒有特別傾向做什麼都可以。不過因為有很大的community都用python,導致了很多package做data science非常方便。 </p><p>Scala夯起來主要是因為Spark是用Scala寫的,因此用Scala在處理<em>Big Data</em>在速度上面會比R和Python來的好,因此用的很多。 </p><p>那R的特色呢?為什麼選擇R而不是另外兩個呢?其實不管選什麼都沒關係,重點是好不好用。所以如果已經有習慣用什麼,那就用那個。 </p></section></section><section><h2 id="WizKMOutline_1514908850408751">R的歷史</h2><figure><a href="https://lh3.googleusercontent.com/-awofyTgXFwM/WkuuM7SAtqI/AAAAAAAAXcM/KolBeRmbR1sfB27dkZsXG2909vsbw6gnACHMYCw/s1600-h/image%255B8%255D"><img width="237" height="186" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-6Rr_N2xksTQ/WkuuOwzrUUI/AAAAAAAAXcQ/_zeRT_VUavoCV0WzqOWxzVpRpkM7gyYIgCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a><br />
<figcaption>R Logo</figcaption></figure><p>了解一個語言的歷史對於整個語言的定位和特色有幫助,因此先來看看R是怎麼誕生。 </p><p>R其實不是一個新的語言,它誕生至今已經有24年(從1993),而它是從S演進而來,而S當初是為了給<em>統計學家對Fortran的SCS Library</em>開發提供便利。 </p><p>因此在R的血液裡面,主要是給<em>統計學家用的Specialized Language</em>。 </p><p>R怎麼突然紅起來呢?個人認為主要是Big Data的興起,和另外兩個重要的推手: </p><dl><dt>Revolution R</dt>
<dd>在2007出現 提供commercial support的R,能夠分散運算和處理大量資料後來被Microsoft買走</dd>
<dt>RStudio</dt>
<dd>在2011出現,Open Source的R Integrated Development Environment(IDE)。讓開發R變得非常方便,並且一直持續有開發一些讓R開發更加方便的功能,像是Shiny,讓用寫R的方式建立一個互動式網站</dd></dl><figure><a href="https://lh3.googleusercontent.com/-t0omtGuIJXU/WkuuQD-1ZLI/AAAAAAAAXcU/_XUeIx708PIv77z9fRtcy2c-ftKy2GR8ACHMYCw/s1600-h/image%255B11%255D"><img width="654" height="367" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-DD3jWOdW6no/WkuuRK6wZEI/AAAAAAAAXcY/4pElI7jIvRYuGrFz5LQiRVwcONMpt_o-ACHMYCw/image_thumb%255B5%255D?imgmax=800" border="0"></a><br />
<figcaption>R的歷史</figcaption></figure><div class="bs-callout bs-callout-info">題外話,任何一個火紅的軟體/語言都需要有個重大推手,像git其實2005年就誕生了,但是整個火紅起來是因為2011誕生的Github。 </div><p>從整個歷史會發現: </p><ol><li>R歷史悠久 - 換句話說很多人在用代表很多package(第三方套件) - 而且大部分都是免費。</li>
<li>R是專門給統計學家用的語言 - 換句話說在處理資料、視覺化非常簡單</li>
</ol>因此,接下來會用R來入門。 </section><section><h2 id="WizKMOutline_1514908850408125">安裝R</h2><div class="bs-callout bs-callout-default"><h4 id="WizKMOutline_1514908850408492">R小檔案</h4><dl><dt>R官網</dt>
<dd><a href="https://www.r-project.org/">https://www.r-project.org/</a></dd>
<dt>最新版本</dt>
<dd>3.4.3</dd>
<dt>檔案大小</dt>
<dd>Windows約62MB</dd>
<dt>R Windows 3.4.3 直接下載</dt>
<dd><a href="http://cran.csie.ntu.edu.tw/bin/windows/base/R-3.4.3-win.exe">台大Mirror</a></dd>
<dt>R Mac</dt>
<dd><a href="http://cran.csie.ntu.edu.tw/bin/macosx/">台大Mirror</a></dd>
<dt>R Linux</dt>
<dd><a href="http://cran.csie.ntu.edu.tw/bin/linux/">台大Mirror</a></dd></dl></div><p>基本上,下載下來之後,一直下一步即可。 </p><p>最後裝好之後在桌面會有一個R的icon,執行了之後會是一個command line的界面。 </p><figure><a href="https://lh3.googleusercontent.com/-RGYgDOmAphM/WkuuSOPqkfI/AAAAAAAAXcc/n6qZ7j6Qo0E09iPQcmPHtKCo0T_V5VokQCHMYCw/s1600-h/image%255B14%255D"><img width="640" height="871" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-CRQmOHb5Hmw/WkuuUJmwjTI/AAAAAAAAXcg/M6OQuP5mkXMYDJDJSJ71j0LvXf-5zCWZgCHMYCw/image_thumb%255B6%255D?imgmax=800" border="0"></a><br />
<figcaption>執行起來的畫面</figcaption></figure></section><section><h2 id="WizKMOutline_1514908850408106">RStudio介紹和安裝</h2><figure><a href="https://lh3.googleusercontent.com/-loVzypjgtZI/WkuuXRsb0wI/AAAAAAAAXck/lmTnG6Fu-u4sJm9MoRYA_tp9_iyykNYQACHMYCw/s1600-h/image%255B19%255D"><img width="357" height="131" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-VW3rerdtNLQ/WkuuY7gcscI/AAAAAAAAXco/BJpRYz5nNU4d73jyE4YnWyOBJxAKiiqPgCHMYCw/image_thumb%255B9%255D?imgmax=800" border="0"></a><br />
<figcaption>RStudio logo</figcaption></figure><div class="bs-callout bs-callout-default"><h4 id="WizKMOutline_1514908850408937">RStudio小檔案</h4><dl><dt>最新版本</dt>
<dd>1.1.383</dd>
<dt>檔案大小</dt>
<dd>Windows約85.8MB</dd>
<dt>下載頁面</dt>
<dd><a href="https://www.rstudio.com/products/rstudio/download/#download">https://www.rstudio.com/products/rstudio/download/#download</a></dd>
<dt>Windows直接下載鏈接</dt>
<dd><a href="https://download1.rstudio.org/RStudio-1.1.383.exe">RStudio 1.1.383 - Windows Vista/7/8/10</a></dd></dl></div><p>command line其實就夠了,但是如果用過IDE就知道IDE開發的速度上面差異。 </p><p>因此,這邊也會裝Open Source的R IDE,RStudio。 </p><p>安裝也很簡單只需要,下一步,下一步就好了,只是要注意,RStudio <em>並不包含</em> R,所以兩個要分開安裝。 </p><p>安裝好了之後,在桌面不會出現,要從Windows的「開始」裡面找。 </p></section><section><h2 id="WizKMOutline_1514908850408751">RStudio 快速介紹</h2><section><h3 id="WizKMOutline_1514908850409138">主要界面</h3><p>執行起來會看到畫面分了四個部分: </p><ol><li>寫Script的地方 - 寫在這邊之後可以把整個script保存下來</li>
<li>Console - 同等於R的Command LIne。因此Script內容就是執行在這邊</li>
<li>環境參數 - 以我這個例子,可以看到參數x的值</li>
<li>其他畫面 - 例如安裝package,繪圖的結果,檔案總管都在這邊</li>
</ol><p>這邊還要注意一下箭頭的部分,如果需要縮起來(例如不需要console直接寫在script),可以按那個放大的icon,旁邊則是縮小。 所以如果沒有看到畫面注意是不是縮小了 </p><figure><a href="https://lh3.googleusercontent.com/-luwKfbKlAGI/WkuuajuaZ7I/AAAAAAAAXcs/1khuk3v71RwpsG9N1WxB4ik6wN7IkS3dACHMYCw/s1600-h/image%255B22%255D"><img width="654" height="270" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-ZFkwk0TJtsE/Wkuuc3uSvHI/AAAAAAAAXcw/m0A-aUBvJt4KAme7WqkF_HNoME-LmKwtQCHMYCw/image_thumb%255B10%255D?imgmax=800" border="0"></a><br />
<figcaption>R主要界面</figcaption></figure></section><section><h3 id="WizKMOutline_1514908850409357">幾個設定</h3><p>設定的地方在<code>Tools > Global Options </code></p><figure><a href="https://lh3.googleusercontent.com/-TYz_l0I5MjY/WkuufldjlUI/AAAAAAAAXc0/IdizkdkInakewDcWBafAo35byROTyo61ACHMYCw/s1600-h/image%255B25%255D"><img width="654" height="321" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Ju_TNvXXIPY/WkuumoptbcI/AAAAAAAAXc4/48Ln3f7ROrQMRKIphhXXp6ciOD35Wc0VACHMYCw/image_thumb%255B11%255D?imgmax=800" border="0"></a><br />
<figcaption>開啟設定畫面</figcaption></figure><p>這邊提一下兩個設定: </p><ol><li>字體和樣式</li>
<li>預設的script儲存編碼改為utf-8</li>
</ol><section><h4 id="WizKMOutline_1514908850409458">字體和樣式</h4><p>一般來說要先調整一下字體和樣式以符合需求: </p><ol><li>切換到 <code>Appearance</code></li>
<li>可以改font</li>
<li>可以改字體大小</li>
<li>可以改整個的theme</li>
</ol><figure><a href="https://lh3.googleusercontent.com/-tdvuNm7jokw/WkuunZXEypI/AAAAAAAAXc8/6bYUPdh2YWMlUQegwZapNM2hDo7mZu9-ACHMYCw/s1600-h/image%255B28%255D"><img width="654" height="659" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-6NYyFXNRUIA/WkuupD0IJLI/AAAAAAAAXdA/EUKu0uaf-AEJ-PJfSedqOKxU6yiXkwvgwCHMYCw/image_thumb%255B12%255D?imgmax=800" border="0"></a><br />
<figcaption>調整樣式</figcaption></figure></section><section><h4 id="WizKMOutline_1514908850409701">預設的script儲存編碼改為utf-8</h4><p>這個是避免script存檔的時候如果有中文可能會亂碼的問題。 </p><ol><li>切換到 <code>Code</code></li>
<li>切換到<code>Saving</code>頁簽</li>
<li>選擇 <code>Change...</code></li>
<li>Default Setting 改成 Utf-8</li>
<li>按下<code>OK</code></li>
</ol><figure><a href="https://lh3.googleusercontent.com/-WvYuUC0ToCk/WkuuqMmWzYI/AAAAAAAAXdE/pSCiSPVeIZEK1BHnXXfjaNZTR4Wpaoh7gCHMYCw/s1600-h/image%255B31%255D"><img width="654" height="690" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-VeJxstMGDHo/WkuurKw-miI/AAAAAAAAXdI/1B_HzP42a-A6Uw-RWEL5ye-bYp-5l8eFwCHMYCw/image_thumb%255B13%255D?imgmax=800" border="0"></a><br />
<figcaption>設定RStudio的預設字集</figcaption></figure></section></section></section><section><h2 id="WizKMOutline_1514908850409705">其他R IDE - Visual Studio</h2><div class="bs-callout bs-callout-default"><h4 id="WizKMOutline_1514908850409406">R Tools for Visual Studio</h4><dl><dt>支援的VS版本</dt>
<dd>2015和2017</dd>
<dt>首頁</dt>
<dd><a href="https://www.visualstudio.com/zh-hant/vs/rtvs/">https://www.visualstudio.com/zh-hant/vs/rtvs/</a></dd>
<dt>VS 2017直接下載</dt>
<dd><a href="https://www.visualstudio.com/zh-hant/thank-you-downloading-visual-studio/?sku=Community&rel=15">Community版本</a></dd></dl></div><p>R本身只是Script,所以任何自己喜歡的編輯器都可以,基本上所有編輯器都會支援R(這邊指的是例如syntax highlight等) </p><p>這邊舉得例子是Visual Studio。 </p><p>Visual Studio有個 R Tools for Visual Studio,可以用Visual Studio來開發R,基本上RStudio的功能都有,然後在熟悉的界面(如果你用VS的話) </p><p>基本上安裝和一般VS安裝畫面差不多,裝完了之後會多出: </p><ul><li>R Tools的選項</li>
<li>R project template</li>
</ul><p>可以直接在<code>R Tools > Windows > R Interactive</code>直接開啟Console。 </p></section><section><h2 id="WizKMOutline_1514908850409268">結語</h2><p>在這篇快速介紹了兩種不同分析Data的方式:軟體和程式語言。 </p><p>再來介紹了一些比較流行的語言和R的介紹。 </p><p>最後安裝了R、RStudio和R Tool For Visual Studio。 </p><p>準備好了之後,在下一篇(<a href="http://blog.alantsai.net/2018/01/data-science-series-16-r-hello-world-with-stock-analysis-using-quantmod.html">[16]用R來看股票,透過quantmod了解R的強大</a>)來跑個人認為R的Hello World程式,用quantmod看股票。透過這個快速demo能夠了解R在資料分析和資料視覺有多麼方便。 </p></section> <section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:ba449569-ea37-4f71-a350-0a6cd9fd597a" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a>,<a href="http://blog.alantsai.net/search/label/data+processing" rel="tag">data processing</a>,<a href="http://blog.alantsai.net/search/label/R" rel="tag">R</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com1tag:blogger.com,1999:blog-7924743034677720383.post-13084391521640483492018-01-01T21:26:00.000+08:002018-01-03T00:12:28.970+08:00[Data Science 到底是什麼從一個完全外行角度來看][14]如何問對的問題?<section><figure><a href="https://lh3.googleusercontent.com/-H3bH6C4HLZE/Wko2GNyXlSI/AAAAAAAAXbk/y9P7V-3qQF0094AY3mT-9reY4vScs3_mACHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-H1gyH19t3-0/Wko2H4fupqI/AAAAAAAAXbo/C58QWWCmUIE76gT3wV2NafJCpSkdAOYQACHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption><span>圖片來源: <a href="https://pixabay.com/en/books-spine-colors-pastel-1099067/">https://pixabay.com/en/books-spine-colors-pastel-1099067/</a> 和 <a href="https://pixabay.com/en/math-blackboard-education-classroom-1547018/">https://pixabay.com/en/math-blackboard-education-classroom-1547018/</a></span></figcaption></figure></section><section><p>在上一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-13-data-processing-workflow-introduction.html">[13]Data的運用 - 介紹篇</a>)了解了整個Data Process Workflow會經過的每個步奏,並且了解到<em><strong>越前面的越重要</strong></em></p><p>因此這篇將會從最重要的部分開始,怎麼定義一個好的問題? </p></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514812566908804" ;="">什麼是好問題?</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514812566908827" ;="">定義資料範圍</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514812566908245" ;="">定義預測結果內容</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514812566908174" ;="">定義預測準確度</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514812566908114" ;="">定義使用情境</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514812566908814" ;="">怎麼建立這個模型</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514812566908605" ;="">看看最後定義的問題</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514812566908897" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a> <section><h2 id="WizKMOutline_1514812566908804">什麼是好問題?</h2><p>這個聽起來好像不是很難,但是定義明確的問題會讓後面的一些決定變得更加簡單。 </p><p>舉例來說,假設今天我們的問題是:<em><strong>預測飛機是否會準時到達?</strong></em></p><p>感覺好像很明確了,就是要預測飛機的到達時間,但是如果深入往下想,這個其實還是他廣泛了: </p><ul><li><em>定義資料範圍</em>:資料的範圍在哪裡?那裡的飛機?那些機場的飛機?這些問題對於收集資料非常重要</li>
<li><em>定義預測的結果內容</em>:最後預測是什麼類型的預測?</li>
<li><em>定義預測的精準度(Accuracy)</em>:怎麼樣的準確度是可以接受的?</li>
<li><em>定義使用情境</em>:會怎麼樣使用這個模型?</li>
<li><em>怎麼建立出這個模型</em>:流程是什麼?</li>
</ul><p>接下來對於每個部分做一些說明,並且看看這個怎麼能夠調整原本的問題。 </p><section><h3 id="WizKMOutline_1514812566908827">定義資料範圍</h3><p>全世界飛機那麼多,到底是要看哪裡到哪裡的飛機?這個非常重要,因為這個會決定第二個步奏裡面的收集資料的<em>方式和方向</em>。 </p><p>舉例來說,如果今天預測的是<em>美國的飛機</em>,那麼就可以開始找<em>關於美國方面</em>的航班資料。 </p><p>這個時候,會找到美國Department Of Transport(DOT)有提供資料是美國<em>國內航班的實際起降時間</em></p><p>這個時候整個的問題變成: </p><p><em><strong>使用從美國DOT取得到的資料,預測美國國內飛機是否會準時到達?</strong></em></p></section><section><h3 id="WizKMOutline_1514812566908245">定義預測結果內容</h3><p>既然找到了資料來源,這個時候可以快速看一下DOT所提供的欄位有什麼。 </p><figure><a href="https://lh3.googleusercontent.com/-bZB_Jr7VnVY/Wko2JbXzbwI/AAAAAAAAXbs/s2Tsol8hCm4hSqmxBLyI21fQh37VS-tRACHMYCw/s1600-h/image%255B5%255D"><img width="654" height="315" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-kRk0bxUu4lk/Wko2LRyHaFI/AAAAAAAAXbw/eLChzRjhEoM45qqHH5JKVxL3G5oi26y1gCHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a><br />
<figcaption>飛機遲到的欄位</figcaption></figure><p>從上圖會看到,其實裡面的欄位有幾個和<em>是否延遲(delay)</em>有關係,其中指出的那個是一個<em>binary 欄位</em>,如果延遲超過15分鐘,那麼就會是1,不然就是0。 </p><p>所以,整個問題變成: </p><p><em><strong>使用從美國DOT取得到的資料,預測美國國內飛機是否會延遲?</strong></em></p><div class="bs-callout bs-callout-info">這個其實很重要,因為知道結果是0或1這種預測值,之後在Machine Learning選擇Algorithm就可以把一些例如預測數值的Algorithm剃掉。 </div></section><section><h3 id="WizKMOutline_1514812566908174">定義預測準確度</h3><p>接下來問題會變成,到底準確度到什麼程度是可以接受?也就是,多少預測失敗是可以接受? </p><p>一般來說,如果簡單一點,會從大約<em>70%</em>作為目標,因此整個的問題變成: </p><p><em><strong>使用從美國DOT取得到的資料,預測精準度在70%以上,美國國內飛機是否會延遲?</strong></em></p></section><section><h3 id="WizKMOutline_1514812566908114">定義使用情境</h3><p>到目前為止其實比一開始的問題明確,但是如果沒有跟著步奏走下來看的人其實還搞不懂這個情景是什麼。例如:<em>怎麼樣叫做延遲?</em></p><p>所以整個問題可以調整變成: </p><p><em><strong>使用從美國DOT取得到的資料,預測精準度在70%以上,美國國內飛機的降落時間是否會比預定的降落時間晚15分鐘?</strong></em></p></section><section><h3 id="WizKMOutline_1514812566908814">怎麼建立這個模型</h3><p>到目前為止對於最終目標和資料取得的地方都明確了,不過對於怎麼到達最終結果並沒有定義的很清楚。 </p><p>因此,以假設要建立Machine Learning的預測模型來做這個預測,那麼整個的問題變成: </p><p><em><strong>透過整個Data Processing Workflow的流程,對從美國DOT取得到的資料做清理並且透過Machine Learning建立出預測模型,預測精準度在70%以上,美國國內飛機的降落時間是否會比預定的降落時間晚15分鐘?</strong></em></p></section></section><section><h2 id="WizKMOutline_1514812566908605">看看最後定義的問題</h2><p>如果把原本的問題和最後得到的問題做比較: </p><ul><li>預測飛機是否會準時到達?</li>
<li>透過整個Data Processing Workflow的流程,對從美國DOT取得到的資料做清理並且透過Machine Learning建立出預測模型,預測精準度在70%以上,美國國內飛機的降落時間是否會比預定的降落時間晚15分鐘?</li>
</ul><p>最後的問題很明確: </p><ol><li>資料從哪裡來</li>
<li>最後用Machine Learning建立預測模型</li>
<li>準確度目標是70%以上</li>
<li>預測結果是飛機的降落時間是否比預定時間晚15分鐘</li>
</ol><p>可以想象,有了這些明確目標,對於接下來Workflow的每個步奏有問題的時候都可以回來看。 </p><p>例如,Exploratory Analysis階段的時候,可以盡量找可能和延遲有關的欄位,在Machine Learning的階段,會找和Supervised Learning有關的Algorithm(因為要建立的是預測模型),然後Algorithm是Binary Classification(因為結果是0或1代表延遲或沒有延遲) </p><div class="bs-callout bs-callout-info">上面有些詞目前還看不懂沒關係,因為後面都會介紹。 </div><p>因此可以發現真的是<em>越前面</em>的階段<em>越重要</em>,因為<em><strong>失之毫釐,差以千里</strong></em>,因此也很用可能會在每個階段來來回回。 </p><div class="bs-callout bs-callout-info"><p>如果想一下,其實任何事情都是這樣,專案成不成功一開始的系統分析很重要,事業成不成功,和自己定義的Visio很重要,但是實際上這塊是<em>最難做到</em>的。 </p><p>所以,真實情況是不可能一步到位,所以Agile為什麼現在這麼夯,重點是<em>fail fast</em>。 </p></div></section><section><h2 id="WizKMOutline_1514812566908897">結語</h2><p>這篇希望透過一個很簡單的例子來帶出定義一個明確的問題有多重要,並且這個幫助會有多大。 </p><p>當然,實際在run的過程可能沒辦法一次就定義這麼清楚,甚至有時候是模糊的,只是拿到一堆資料然後看看能不能找到什麼有趣的資訊。 </p><p>這個也是<em>Exploratory Analysis(探索性分析)</em>在做的事情。 </p><p>不過在實際進入Exploratory Analysis之前,要先介紹會用到的工具,R語言。 </p><p>在下一篇(<a href="http://blog.alantsai.net/2018/01/data-science-series-15-r-history-rstudio-r-tools-for-studio-ide-setting.html">[15]R是什麼?準備開發R的環境 - RStudio介紹</a>)將會快速介紹一下R語言的來源和怎麼準備好開發R。並且跑一個R的Hello World程式,用R來分析股票來看看R在分析上面的威力。 </p></section> <section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:24d9656f-0048-4259-a34a-1988d7ee3cc0" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a>,<a href="http://blog.alantsai.net/search/label/data+processing" rel="tag">data processing</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-49029556622231649802017-12-31T20:50:00.000+08:002018-01-01T21:39:54.738+08:00[Data Science 到底是什麼從一個完全外行角度來看][13]Data的運用 - 介紹篇<section><figure><a href="https://lh3.googleusercontent.com/-58fEFlD9-PM/WkjbUoa1Z2I/AAAAAAAAXas/2EHpBVdZaK8M75PWWHOQde3qLWehQYpCwCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-sp65hGWTup8/WkjbWb-biLI/AAAAAAAAXaw/Ar3Y3jBMkQ4pPsWMvzdIEGVTcuRzk1-0QCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption><span>圖片來源: <a href="https://pixabay.com/en/books-spine-colors-pastel-1099067/">https://pixabay.com/en/books-spine-colors-pastel-1099067/</a> 和 <a href="https://pixabay.com/en/math-blackboard-education-classroom-1547018/">https://pixabay.com/en/math-blackboard-education-classroom-1547018/</a></span></figcaption></figure></section><section><p>還記得之前提到過,如果<em>Data是原油</em>那麼Data Science就是<em>提煉成石油的技術</em>。 </p><p>到目前為止,解決了Data的<em>儲存和運算</em>的部分。但是就算可以處理Big Data,該<em>怎麼</em>處理?如何把處理結果變成有<em>意義</em>或者可以<em>動作的策略</em>? </p><p>如果說,<em>Big Data的儲存和運算</em>在武俠小說裡面屬於<em>內功</em>的話那麼<em>Data Process Workflow(資料處理流程)</em>就同等於<em>招式</em>一樣。 </p><p>沒有足夠的內力(Data),招式在精妙也沒有用(就像瞎子摸象,就算摸的技巧再好,也因為局限的關係摸不到全貌,一定會有偏頗)。 </p><p>反過來說,如果內力深厚,但是不會招式,那麼同等於英雄無用武之地。 </p><p>在這個系列的接下來將會著重在介紹Data Processing的部分。這篇將會是概觀介紹。 </p><section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514723918448550" ;="">Data Processing Workflow指的是什麼?</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514723918448989" ;="">中間的Big Data</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514723918448814" ;="">一切從解決問題開始</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514723918448962" ;="">Exploratory Analysis階段</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514723918448834" ;="">Machine Learning (機器學習) 階段</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514723918448515" ;="">發佈</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514723918448476" ;="">需要有什麼提前知識?</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514723918448209" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a> </section><section><h2 id="WizKMOutline_1514723918448550">Data Processing Workflow指的是什麼?</h2><p>Data Processing Workflow其實非常廣的一個詞,所以這邊會定義一下這裡指的是什麼。 </p><figure><a href="https://lh3.googleusercontent.com/-3tfrEIa2ixo/WkjbX7XKF1I/AAAAAAAAXa0/h4n-6_djwrUfl_iNJBrf5wlr18WVDmQ-gCHMYCw/s1600-h/image%255B5%255D"><img width="654" height="455" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-h23H4O_4uZY/WkjbYvi0KEI/AAAAAAAAXa4/c1bKZrzQ3mcCN_2a6A3h-HH7yhYHo85OACHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a><br />
<figcaption>Data Processing Workflow圖</figcaption></figure> 還記不記得之前的這張圖?這次有做了一些調整。 <section><h3 id="WizKMOutline_1514723918448989">中間的Big Data</h3><p>這邊變成了灰色表示已經講完了。Big Data在中間是因為整個的核心其實是Data。如果沒有Data就算有在好的“招式”也沒有用。 </p></section><section><h3 id="WizKMOutline_1514723918448814">一切從解決問題開始</h3><p>整個的Workflow從<em>想找到某個問題的解決方案</em>開始。這個<em><strong>非常重要</strong></em>。因為接下來的處理方式都是依照這個問題來延伸出來。 </p><p>這個和開發軟體一樣,如果一開始的需求分析就錯了,那麼後面做的再好客戶一定不滿意,因為這個<em>不是他想解決的問題</em>。 </p><div class="bs-callout bs-callout-info">題外話,還記得之前提到Data Scientist有提到會需要某個Domain Knowledge(領域知識) - 因為沒有這個領域知識根本問不出問題。 </div></section><section><h3 id="WizKMOutline_1514723918448962">Exploratory Analysis階段</h3><p>在這個部分,將會依照想要處理的問題去收集資料、收集完了之後需要對資料進行處理和分析,然後才會有所謂的<em>clean data(乾淨)</em>。 </p><p>反過來說,如果一開始問題定義不明確,或者對於整個Domain不熟悉,那麼收集的資料一定會有偏頗,對有偏頗的資料進行處理和分析肯定就錯了。 </p><p>這個階段會需要: </p><ul><li>資料清洗的能力 - 在不同領域有不同名稱,例如:Extract Transofrm and Load (ETL)或者Data Munging</li>
<li>統計學的概念 - 這樣才會有辦法作分析</li>
<li>Data Visualization(資料視覺化)的技能 - 這樣才更好了解資料</li>
</ul><p>這個階段也是傳統Data Analysis在做的事情。 </p><div class="bs-callout bs-callout-info">這個階段花的時間最多 - 有做過研究,大約<em>80%</em>的時間都是花在這個階段。 </div></section><section><h3 id="WizKMOutline_1514723918448834">Machine Learning (機器學習) 階段</h3><p>傳統的Data Analysis(資料分析)是不會有Machine Learning的階段,或者準確一點說,並不會像現在Machine Learning的定義方式來產生出模型。 </p><p>個人覺得Machine Learning(以下簡稱ML)這個詞有點誤導傾向,因為聽到ML第一個想到的是 AI。好像是在講<em>AI自動進化</em>的感覺。但是,實際上不是,或者說只是AI進化的<em>一小塊</em>部分而已。 </p><figure><a href="https://lh3.googleusercontent.com/-yhLX0OxenHo/WkjbZ8dKAEI/AAAAAAAAXa8/PBse_T1Gfiw8N0dviqYqefxFKTl0CoAgwCHMYCw/s1600-h/image%255B8%255D"><img width="654" height="313" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-wxl_rp_O4CA/Wkjbbh6qGkI/AAAAAAAAXbA/YmUoGtswBLAv6xs51QxEd8qVmF7ktp7OwCHMYCw/image_thumb%255B2%255D?imgmax=800" border="0"></a><br />
<figcaption>ML process</figcaption></figure><p>整個Machine Learning的目的是在建立一個<em>Prediction Model</em>。透過這個Prediction Model,只需要把資料丟進去,就會得到“準確”的預測結果。 </p><p>而Prediction Model其實就是 Clean Data + Algorithm最後產生出來。 </p><p>而Algorithm是什麼?其實就是一些Statistical Model(統計模型)定義出來。 </p><p>所以ML和一般程式開發很不一樣,一般程式開發寫的是<em>邏輯</em>,但是ML其實不是寫邏輯,而是<em>挑選最適合目前預測內容和資料的algorithm</em>。所以他在調整的是兩個東西: </p><ol><li>Training Data (也就是Clean Data)</li>
<li>Algorithm - 使用哪個演算法和演算法本身參數的調整</li>
</ol><p>所以最後的Prediction Model找到的<em>不是最終解法</em>,而是找到<em>Data之間的關聯性</em>,因此Model不會一直有效,因為假設什麼原因導致那個關聯性斷了,Model就不準確了。 </p><p>以上是一個非常快速的介紹ML,之後會到了ML階段會有更深入的一些介紹。 </p></section><section><h3 id="WizKMOutline_1514723918448515">發佈</h3><p>不管有沒有走ML,最後一定會有一些分析結果或者有走ML會有Prediction Model。 </p><p>這些資訊如何容易的呈現給他人來看?如何把Model變成簡單方式就可以讓一般人操作?這個階段其實就是把整個結果很好的呈現出來。 </p></section><div class="bs-callout bs-callout-warning"><p>這個Workflow裡面,越前面的階段越重要,換句話說,定義問題<em><strong>最重要</strong></em>。因為,每一個階段的動作會<em><strong>相依</strong></em>上一個階段的結果,所謂 <em>失之毫釐,差以千里</em>,因此很長會在 各個階段<em>往回跳來跳去</em>。 </p></div></section><section><h2 id="WizKMOutline_1514723918448476">需要有什麼提前知識?</h2><p>在接下來的內容,會需要有個前置條件,就是多多少少<em>有碰過</em>程式開發。 </p><p>不需要很深入的了解,但是要有基本知識像是什麼是variable(參數)這種很簡單的概念即可。 </p><p>因為,接下來的一些資料處理都會使用R語言,這邊<em>不會一個一個語法介紹</em>R。只會把整個的歷史和特色概念介紹一下,剩下都是邊操作邊說明,因此如果從來沒有碰過程式肯能會覺得不太懂(不過應該就算沒有碰過程式開發應該也會看的懂才對) </p><p>至於另外一個重要的概念:<em>一些簡單的統計概念</em>也會很有幫助,不過這個部分會有特定篇幅做一些簡單介紹,因為如果沒有這些背景在看一些Data Process的時候會看不太懂。 </p></section><section><h2 id="WizKMOutline_1514723918448209">結語</h2><p>這篇對於整個Data運用的整個階段做了一個簡單和快速的介紹,為接下來介紹的內容先打下一些基礎。 </p><p>下篇(<a href="http://blog.alantsai.net/2018/01/data-science-series-14-how-to-define-good-question.html">[14]如何問對的問題?</a>)將會從最終要的部分開始,怎麼定義一個問題?什麼樣的定義才是好的定義。 </p></section><section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:b9e0a758-8bd5-46ec-9d41-083ad5c5cd8a" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a>,<a href="http://blog.alantsai.net/search/label/data+processing" rel="tag">data processing</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-4155625137462957532017-12-30T23:06:00.000+08:002017-12-31T20:51:34.764+08:00[Data Science 到底是什麼從一個完全外行角度來看][12]Hadoop總結(下篇) - 一切才剛剛開始<section><figure><a href="https://lh3.googleusercontent.com/-wLUhY3IiFF4/Wkepb6h8ZBI/AAAAAAAAXZc/1BYR_z9DEtoOIR9U2mksrj9XUXokupYwQCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-XUS9NIlHYBU/Wkepd3JcLLI/AAAAAAAAXZg/UUdeCjFRVNwJ2sjf6cG-vMA5Jb6welCzwCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption><span>圖片來源: <a href="https://pixabay.com/en/books-spine-colors-pastel-1099067/">https://pixabay.com/en/books-spine-colors-pastel-1099067/</a> 和 <a href="https://pixabay.com/en/math-blackboard-education-classroom-1547018/">https://pixabay.com/en/math-blackboard-education-classroom-1547018/</a></span></figcaption></figure></section><section><p>上一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-11-hadoop-conclustion-ecosystem-intro.html">11]Hadoop總結(上篇) - 一切才剛剛開始</a>)介紹了Hadoop的Ecosystem之後,了解到有很多package建立在Hadoop上面。</p><p>不過一個問題會浮現出來,這門多package,怎麼讓他們互相溝通沒有問題?畢竟版本和版本之間很有可能會有相容性問題。 </p><p>這就是Hadoop Distribution的作用,一些整理好包成一包的Hadoop Ecosystem,有些distribution還包括一些管理界面讓整個管理變得更加簡單。 </p></section><section><a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514644395949296" ;="">Hadoop Distribution</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514644395949476" ;="">快速總結Distribution的差異</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514644395949182" ;="">Cloudera's Distribution include Apache Hadoop (CDH)</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514644395949117" ;="">Hortonworks Data Platform (HDP)</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514644395949824" ;="">Syncfusion Big Data Platform</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514644395949777" ;="">Azure HDInsight</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514644395949203" ;="">一切才剛剛開始 - Data Engineer之路</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514644395949421" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a> <section><h2 id="WizKMOutline_1514644395949296">Hadoop Distribution</h2><p>當透過這系列的介紹方式把Hadoop POC做完了之後,當真的要測試的時候肯定不是用這種方式管理,而是用Hadoop Distribution。 </p><p>基本上Hadoop Distribution可以把它想象成一個solution package - 把多個Ecosystem套件組合在一起變成一個完整的package,讓安裝和使用變得簡單。 </p><p>這邊快速介紹3+1個這種Distribution: </p><ol><li>Cloudera's Distribution include Apache Hadoop (CDH) - Linux</li>
<li>Hortonworks Data Platform (HDP) - Linux and Windows</li>
<li>Syncfusion Big Data Platform - Linux and Windows</li>
<li>Microsoft Azure HDInsight - 微軟雲端的big data solution</li>
</ol><section><h3 id="WizKMOutline_1514644395949476">快速總結Distribution的差異</h3><table class="table"><tbody>
<tr><th></th><th>CDH</th><th>HDP</th><th>SBDP</th><th>HDInsight</th></tr>
<tr><th>支援的OS</th><td>Linux</td><td>Windows、Linux</td><td>Windows、Linux</td><td>NA - 在Azure雲端</td></tr>
<tr><th>是否需要收費?</th><td>免費</td><td>免費</td><td>符合條件免費 - 收費</td><td>收費</td></tr>
<tr><th>是否有客制管理界面?</th><td>有</td><td>沒有</td><td>有</td><td>有 - Azure管理界面</td></tr>
<tr><th>建議使用情境</th><td>如果在Linux環境</td><td>如果在Windows並且需要免費</td><td><p>如果在Windows並且願意付費。 </p><p>如果剛開始在Windows學習Hadoop,建議從這個開始,因為安裝和管理界面很容易使用,並且如果符合Community License也是免費。 </p></td><td> 如果沒有機器但是又想測試Hadoop </td></tr>
</tbody></table><p>接下來會在更深入一些介紹這些Distribution。 </p></section><section><h3 id="WizKMOutline_1514644395949182">Cloudera's Distribution include Apache Hadoop (CDH)</h3><p>CDH貌似是最早做這種Distribution的機構,基本概念很簡單,整合這些Ecosystem的package在一包裡面並且提供一個管理界面方便管理cluster和這些package。 </p><p>從下圖可以看到整個CDH提供的服務和內容: </p><figure><a href="https://lh3.googleusercontent.com/-OmK1Z6XSH5M/WkepgM1D7dI/AAAAAAAAXZk/LxoWiHaZ7sQ4ZOxOSeQU8S9qx774YHobgCHMYCw/s1600-h/image%255B35%255D"><img width="654" height="542" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-NPmVL5cxdKk/WkepiCp8iKI/AAAAAAAAXZo/ldtEuXAnxHUhp-YpUCrk4H9ZafJyzFebACHMYCw/image_thumb%255B19%255D?imgmax=800" border="0"></a><br />
<figcaption>CDH的架構。來源:https://www.cloudera.com/documentation/enterprise/latest/topics/cdh_intro.html</figcaption></figure><p>CDH是免費的,不過cloudera也有提供Enterprise服務,也就是收費的服務。基本上就是CDH加上更多管理面和一些Technical Support。 </p><p>CDH <em>只支援</em> Linux,所以如果在Windows就別想了。 </p><dl><dt>參考資料</dt>
<dd><ol><li>Overview: <a href="https://www.cloudera.com/documentation/enterprise/latest/topics/cdh_intro.html">CDH Overview</a></li>
<li> 有支援的OS:<a href="https://www.cloudera.com/documentation/enterprise/release-notes/topics/rn_consolidated_pcm.html">CDH 5 and Cloudera Manager 5 Requirements and Supported Versions</a></li>
<li> 快速測試的下載鏈接:<a href="https://www.cloudera.com/downloads/quickstart_vms/5-12.html">CDH 5.12 Quick Start Download</a></li>
<li> 快速測試的文件:<a href="https://www.cloudera.com/documentation/enterprise/5-6-x/topics/cm_qs_quick_start.html">Cloudera Manager and CDH QuickStart Guide</a></li>
</ol></dd></dl></section><section><h3 id="WizKMOutline_1514644395949117">Hortonworks Data Platform (HDP)</h3><figure><a href="https://lh3.googleusercontent.com/-Iv-pO0QCv9M/WkepjPQBXUI/AAAAAAAAXZs/0dFFx5d8cEICNWTtQkrKqL2aF0IFXk_FgCHMYCw/s1600-h/image%255B33%255D"><img width="261" height="119" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-U36hW0FnDUY/Wkepjx71lnI/AAAAAAAAXZw/TQL_AFm53QkmBrW92SYjBOt0G5_6hggaQCHMYCw/image_thumb%255B17%255D?imgmax=800" border="0"></a><br />
<figcaption>Hortonworks Logo</figcaption></figure><p>HDP可以說是最早有支援Windows的Distribution,後面提到的Azure HDInsight內部執行的就是HDP。 </p><p>HDP可以說是把很多opensource package整合在一起的Distribution,所以不像cloudera那樣有自己的管理界面,而是用Ambari(也是一個open source的package)。 </p><figure><a href="https://lh3.googleusercontent.com/-eEAd9ubEHl0/Wkepqy9DQyI/AAAAAAAAXZ0/9gQU0Bc_BdQC26V9Fn9HHQsOcHL7aCKWQCHMYCw/s1600-h/image%255B31%255D"><img width="654" height="264" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-m5Ntqqu30yE/Wkep9UhFywI/AAAAAAAAXZ8/4j7ujPWbq_YKXRIorkICoqE-UHyvhVClQCHMYCw/image_thumb%255B15%255D?imgmax=800" border="0"></a><br />
<figcaption>整個架構</figcaption></figure><p>HDP支援Windows和Linux。 </p><dl><dt>參考資料</dt>
<dd><ol><li>Overview介紹:<a href="https://hortonworks.com/products/data-platforms/hdp/">鏈接</a> - 對於每個Package有對應說明</li>
<li>下載Sandbox VM做測試:<a href="https://hortonworks.com/products/sandbox/">GET STARTED WITH HORTONWORKS SANDBOX</a></li>
</ol></dd></dl></section><section><h3 id="WizKMOutline_1514644395949824">Syncfusion Big Data Platform</h3><figure><a href="https://lh3.googleusercontent.com/-yPNIweir73g/WkeqFFxFpKI/AAAAAAAAXaA/T5GjHyPYvGsXVqmLJ8iZ4IrNRaNMouyegCHMYCw/s1600-h/image%255B29%255D"><img width="293" height="88" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-191_oP4rBG8/WkeqO0pB8LI/AAAAAAAAXaE/8x1H6I8fdiAy0PQkYoovN_eSlvesVkL5ACHMYCw/image_thumb%255B13%255D?imgmax=800" border="0"></a><br />
<figcaption>Syncfusion的logo</figcaption></figure><p>Syncfusion最出名應該是有提供一些免費的ebook叫做Succinctly系列,用短短篇幅介紹一些技術,同時對於Windows的開發有提供很多好用的套件可以快速上手。因此在這邊介紹的Distribution裡面以Windows開發者來說是最親民。 </p><p>Syncfusion Big Data Platform (下面簡稱SBDP) 是這3個裡面最年輕的Distribution,不過個人認為至少在Windows平台下是最容易操作的一個。 </p><p>SBDP有包含一個BigData Studio,裡面用tab的方式能夠切換不同的Package,並且有一個界面可以看到這些Package的Service是否有啟動,這個操作起來非常的直覺。 </p><figure><figcaption><a href="https://lh3.googleusercontent.com/-BpD4fa5w1kI/WkeqWnakwqI/AAAAAAAAXaI/vtO5dIyexBgDb6oX_o1bPnbkss-K0mgEwCHMYCw/s1600-h/image%255B27%255D"><img width="654" height="350" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-PDsQ7mI-ARA/WkeqX5LtaJI/AAAAAAAAXaM/WFWluLyuG3Qwswnw9JtHWTcjAZnNCUnwgCHMYCw/image_thumb%255B11%255D?imgmax=800" border="0"></a><br />
BigData Studio的截圖</figcaption></figure><p>SBDP支援Windows和Linux,如果需要在Windows開發個人建議從SBDP做嘗試。 </p><p>SBDP有提供Community的版本,所以在測試上面是免費,不過如果用在Production如果不符合Community License就會需要一筆費用。 </p><dl><dt>參考資源</dt>
<dd><ul><li>首頁介紹:<a href="https://www.syncfusion.com/products/big-data">鏈接</a></li>
<li>下載鏈接(需要先註冊帳號):<a href="https://www.syncfusion.com/downloads/bigdata">鏈接</a></li>
<li>操作手冊:<a href="https://help.syncfusion.com/bigdata/overview">鏈接</a></li>
</ul></dd></dl></section><section><h3 id="WizKMOutline_1514644395949777">Azure HDInsight</h3><p>Azure HDInsight不算是Distribution,是微軟Azure上面的一個Hadoop as Service的概念。因此,如果沒有機器但是想要測試Hadoop,可以考慮用Azure HDInsight。 </p><p>整個Azure HDInsight底層其實就是Hortonworks的HDP。 </p><p>基本上拆成了兩塊: </p><ol><li>HDInsight - 屬於運算的部分(可以理解MapReduce執行的部分)</li>
<li>Azure Storage - HDFS的部分</li>
</ol><p>所以儲存和運算可以分開,由於HDInsight比較貴,因此可以<em>先把資料上傳到Azure Storage</em>(Storage和HDInsight比相對便宜呢多),等到<em>需要執行運算</em>的時候在啟動HDInsight。 </p><figure><a href="https://lh3.googleusercontent.com/-zLw-8llNokM/WkeqZPXX9II/AAAAAAAAXaQ/RmXWwBP-GPQsqb09x1E-m1bIP7gfzbmnQCHMYCw/s1600-h/image%255B25%255D"><img width="654" height="312" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-sVCUHFm0i_g/WkeqaVZDqTI/AAAAAAAAXaU/hgKTNMYpPkUlnEp6yk2VJO1VFPuiXU4CwCHMYCw/image_thumb%255B9%255D?imgmax=800" border="0"></a><br />
<figcaption>架構</figcaption></figure><br />
<dl><dt>參考資料</dt>
<dd><ul><li>官方介紹:<a href="https://azure.microsoft.com/en-us/services/hdinsight/">鏈接</a></li>
<li>文件:<a href="https://docs.microsoft.com/en-us/azure/hdinsight/">鏈接</a></li>
</ul></dd></dl></section></section><section><h2 id="WizKMOutline_1514644395949203">一切才剛剛開始 - Data Engineer之路</h2><p>Data Engineer屬於Data Sciencist的分支的一個部分,主要在做的工作就是專注于在資料儲存這一塊。 </p><p>因此如果對於Hadoop和整個Ecosystem的管理、維護及使用非常有興趣,那麼可以繼續往下鑽研並且可以找Data Engineer相關的工作。 </p></section><section><h2 id="WizKMOutline_1514644395949421">結語</h2><p>這個系列關於Data底層儲存就介紹到這邊了,希望對於要往下鑽研能夠提供一個足夠的基礎,至少往下看的時候不會完全看不懂。 </p><p>之前做的Hadoop VM先不要刪,後面介紹R的時候會介紹R如何和Hadoop接。所以如果到時候要跟著做的話會需用到。 </p><p>接下來將會開始到下一個階段(<a href="http://blog.alantsai.net/2017/12/data-science-series-13-data-processing-workflow-introduction.html">[13]Data的運用 - 介紹篇</a>),也就是實際對資料的理解、運用到最後建立出預測模型。 </p></section><section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:f1cdc0e9-2e2c-4777-8212-24094dee1db4" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a>,<a href="http://blog.alantsai.net/search/label/hadoop" rel="tag">hadoop</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-45763718475196528192017-12-30T22:46:00.000+08:002017-12-31T00:26:06.120+08:00[Data Science 到底是什麼從一個完全外行角度來看][11]Hadoop總結(上篇)–Ecosystem介紹<section><figure><a href="https://lh3.googleusercontent.com/-AFtZXWeRX9o/WkelcVZsOFI/AAAAAAAAXYo/12-GHKI4I0cZwt4XHEBZtrH2AKylW9veACHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-c3mOZ-3ScYU/Wkeld0EUWUI/AAAAAAAAXYs/vfffl5JNhuIdl7aDabNXB-shNMzbTbQDwCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption><span>圖片來源: <a href="https://pixabay.com/en/books-spine-colors-pastel-1099067/">https://pixabay.com/en/books-spine-colors-pastel-1099067/</a> 和 <a href="https://pixabay.com/en/math-blackboard-education-classroom-1547018/">https://pixabay.com/en/math-blackboard-education-classroom-1547018/</a></span></figcaption></figure></section><section><p>在上一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-10-hadoop-streaming-intro-use-net-core-for-MapReduce.html">[10]用.Net Core跑Hadoop MapReduce - Streaming介紹</a>)透過Hadoop Streaming的幫助,改成用.Net Core 2.0的程式作為MapReduce的邏輯,基本上這個系列裡面的Hadoop介紹也要告一個段落。</p><p>這一篇,將會快速回顧到目前為止所了解到關於Hadoop的部分,再來介紹Hadoop Ecosystem,和3個比較常見的package介紹。 </p></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514643100960577" ;="">溫故知新</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514643100961193" ;="">Hadoop Ecosystem</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514643100961585" ;="">HIVE</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514643100961836" ;="">HBase</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514643100961587" ;="">Spark</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514643100961168" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a> <section><h2 id="WizKMOutline_1514643100960577">溫故知新</h2><p>先來快速回顧一下到目前為止看了什麼: </p><ol><li>從Big Data開始介紹,了解到Big Data裡面的3個V - 由於別的技術的可行性提高,Big Data成長也越來越快:<a href="http://blog.alantsai.net/2017/12/data-science-series-03-big-data-intro.html">鏈接</a></li>
<li>再來介紹了Hadoop的誕生 - 為了因應Big Data而誕生的程式:<a href="http://blog.alantsai.net/2017/12/data-science-series-04-hadoop-intro.html">鏈接</a></li>
<li>在來手動用VM建立了一個pseudo-distributed mode的hadoop:<a href="http://blog.alantsai.net/2017/12/data-science-series-05-install-and-test-hadoop-part1.html">上篇鏈接</a>、<a href="http://blog.alantsai.net/2017/12/data-science-series-06-install-and-test-hadoop-part2.html">下篇鏈接</a></li>
<li>有了一個可運作的hadoop之後,了解了Hadoop的核心:YARN和MapReduce:<a href="http://blog.alantsai.net/2017/12/data-science-series-07-deeper-look-at-yarn-and-hdfs-in-hadoop.html">鏈接</a></li>
<li> 接下來把Hadoop的VM複製出來用來建立一個worker - 打造了fully-distributed mode:<a href="http://blog.alantsai.net/2017/12/data-science-series-08-hadoop-fully-distributed-mode-tutorial.html">鏈接</a></li>
<li> 最後介紹了MapReduce的程式,先介紹原理,後來介紹如何用.Net Core寫一個:<a href="http://blog.alantsai.net/2017/12/data-science-series-09-hadoop-map-reduce-java-wordcount-example.html">MapReduce原理</a>、<a href="http://blog.alantsai.net/2017/12/data-science-series-10-hadoop-streaming-intro-use-net-core-for-MapReduce.html">Hadoop Streaming執行.Net Core</a></li>
</ol><p>從目前了解的來看,對於整個Hadoop的核心已經有了基本的概念,馬上浮現的問題是,這樣建立和管理Hadoop不會太麻煩嗎?透過MapReduce寫不同的邏輯太難寫了吧。 </p><p>相信看完之後會有種感覺,<em><strong>Hadoop感覺很"底層"</strong></em>,從應用程度來說太不Friendly(友善),並且要怎麼管理這些Hadoop Cluster? </p><div class="bs-callout bs-callout-info">題外話,Hadoop給我的感覺就像程式開發裡面的Assembly,速度快,但是不好寫,因此會使用High Level Language像C#。 </div><p>因此,接下來看看一些在Hadoop上面的Ecosystem和所謂的<em>Hadoop Distribution</em>。 </p></section><section><h2 id="WizKMOutline_1514643100961193">Hadoop Ecosystem</h2><p>還記得之前提到Hadoop版本的時候介紹了2.0之後其中一個大改變就是加入了YARN。 </p><p>YARN的加入讓在Hadoop上面開發變得更加的簡單,因此很多Application蓋在了Hadoop的上面,達到利用Hadoop的Cluster運算和HDFS。 </p><p>下圖是一個Hadoop Ecosystem的幾個重要package,這邊會針對裡面的: </p><ul><li>HIVE - 用類似sql語法執行MapReduce的方式</li>
<li>HBase - 在HDFS上面的NoSql儲存</li>
<li>Spark - 另外一種執行工作的模式</li>
</ul>多做一些簡單介紹 <figure><figcaption><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm05mW7k1-wnt24zOjNngZLQ7C-ZBVyDWNGF_1XFxh7c6buh6qFiQFDXaFwrSdI2_TLODrIBI0kikbDJZJHH7GSNoPbQ9lD1NDUtIW89Zud-o9UjFTu_HXY_Q_e7Ypjz2Vwrckq-oOm0DM/s1600-h/image%255B7%255D"><img width="654" height="316" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-pXPsK9tl11M/Wkelg-SlvEI/AAAAAAAAXY0/yyVVkEZ2qA4HHk7xaIBso5kluQm_XqlawCHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a>Hadoop Ecosystem,來源:http://www.dotnettricks.com/learn/hadoop/apache-hadoop-ecosystem-and-components</figcaption></figure><section><h3 id="WizKMOutline_1514643100961585">HIVE</h3><figure><a href="https://lh3.googleusercontent.com/-87yddDTmLxY/Wkelh3iVasI/AAAAAAAAXY4/iG6ORs8ShQkz6Sh-s_L2b3Q0MwDII3CawCHMYCw/s1600-h/image%255B10%255D"><img width="269" height="161" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-xIMQI1E1fAU/WkeliyB-heI/AAAAAAAAXY8/NWc3y9wRjKgs3caEFJQPT3g3f9dJsoREgCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a><br />
<figcaption>Hive Logo</figcaption></figure><p>HIVE一開始是由Facebook開發,後來捐出來變成一個Open Source專案。主要目的是讓懂SQL的人能夠快速上手能從HDFS取資料。 </p><p>還記得之前提到要寫MapReduce感覺有點麻煩,HIVE其實就是一個使用<em>類似SQL語法的語言,HiveQL來和MapReduce溝通的中間層</em>。 </p><p>換句話說,用HiveQL語法,HIVE會自動轉成MapReduce從HDFS裡面把資料取出來。 </p><p>因此,懂SQL就能夠快速上手從HDFS裡面撈出資料。 </p><p>下面是從<a href="https://en.wikipedia.org/wiki/Apache_Hive">Wikipedia</a>截取的WordCount範例,可以看到,基本上會sql基本上看的懂在做什麼,把這個和Java和.Net Core版本做比較,對於會sql的人來說這個簡單多了 </p><pre class="brush: plain;">DROP TABLE IF EXISTS docs;
CREATE TABLE docs (line STRING);
LOAD DATA INPATH 'input_file' OVERWRITE INTO TABLE docs;
CREATE TABLE word_counts AS
SELECT word, count(1) AS count FROM
(SELECT explode(split(line, '\s')) AS word FROM docs) temp
GROUP BY word
ORDER BY word;
</pre><p>更多資訊,請參考:<a href="https://hive.apache.org/">官網</a></p></section><section><h3 id="WizKMOutline_1514643100961836">HBase</h3><figure><a href="https://lh3.googleusercontent.com/-NA8UMRxLdFo/Wkelj6ivn5I/AAAAAAAAXZA/uZ_esDB39t0fqEQTXFWRXISGuqnX5SKFQCHMYCw/s1600-h/image%255B13%255D"><img width="654" height="174" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-7LSW0yKajlQ/WkelkyDbRHI/AAAAAAAAXZE/stEYH3QJLFIM4NsyDNIjHF6EWWV2kGUggCHMYCw/image_thumb%255B5%255D?imgmax=800" border="0"></a><br />
<figcaption>HBase logo</figcaption></figure><p>聽到Big Data最長聽到的就是No Sql database,也就是不像sql先定義好每個table有什麼欄位的另外一種Database。 </p><p>HBase就是一個<em>使用HDFS的No Sql Database</em>。 </p><p>HBase還提供吧資料儲存在Memory達到<em>快速讀取</em>HDFS資料的一個界面,更好的能夠和其他package結合,例如<em>可以用HIVE去撈HBase的資料</em>。 </p><p>因為HBase速度的關係,有些會把cold data(封存用的資料少存取)放到<em>HDFS</em>裡面,而hot data(長存取的資料)放到<em>HBase</em>裡面。 </p><div class="bs-callout bs-callout-info">題外話,HBase可以不架在YARN上面,只需要HDFS即可。 </div><p>更多資料請參考:<a href="https://hbase.apache.org/">HBase</a></p></section><section><h3 id="WizKMOutline_1514643100961587">Spark</h3><figure><a href="https://lh3.googleusercontent.com/-gntY9dVsVRk/Wkell4L4KzI/AAAAAAAAXZI/OFQ2u5GRA181CpaLWK1FljrxxYp1-UrGgCHMYCw/s1600-h/image%255B16%255D"><img width="310" height="176" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-WCXG45Rr8Lo/Wkelmk4vt9I/AAAAAAAAXZM/KAJcIDiZDz8i8B6aZCJSkUDHo8FSRl5MACHMYCw/image_thumb%255B6%255D?imgmax=800" border="0"></a><br />
<figcaption>spark logo</figcaption></figure><p>基本上Spark是整個ecosystem最夯的部分,因為他解決了Hadoop的一個很致命的問題,<em>過慢問題</em>,官網說在最快的情況可以比Hadoop快<em>100倍</em>。 </p><p>Spark的基本概念很簡單,以Hadoop來說,每一個階段的執行,都會把結果<em>儲存在HDFS</em>,換句話說很多<em>IO操作</em>。 </p><p>Spark用了另外一個方式,前面一段output會是後面一段的input - 這個的儲存<em>都是在Memory</em>,換句話說減少了IO量,提升了速度。 </p><div class="bs-callout bs-callout-info">或許會說,不是都cluster了嗎,怎麼還會慢?這邊的慢指的是相對來說。要記得,這邊處理都是<em>ZB等級</em>的資料,真的跑下去還是很花時間。 </div><p>更多資料請參考:<a href="https://spark.apache.org/">官網</a></p></section><p>從Ecosystem的圖可以看到其實還有很多重要的package,而看到這個也會發現Hadoop真的變成了一個<em>很底層的核心</em>。 </p><p>看到了這麼多package了之後,有個問題會浮現出來,這麼多不同package要自己安裝不是很麻煩嗎?更別說package之間可能還有相容性問題,難道沒有一個一整包包好的服務嗎?還有cluster management怎麼辦?雖然有package做整件事情,但是怎麼整合呢? </p><p>這也是所謂的<em>Hadoop Distribution</em></p></section><section><h2 id="WizKMOutline_1514643100961168">結語</h2><p>這篇介紹了整個Hadoop的Ecosystem,並且挑出了3個最夯的:Hive、HBase和Spark。 </p><p>本來這篇要把整個總結寫完,但是發現篇幅有點長,因此在下一篇在介紹Hadoop Distribution和相關的工作頭銜,Data Engineer介紹。 </p></section> <section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:f10ae1af-a21d-42e3-be68-5a462692d1ea" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a>,<a href="http://blog.alantsai.net/search/label/hadoop" rel="tag">hadoop</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-32276185876885963792017-12-30T13:44:00.000+08:002018-02-10T22:30:14.065+08:00[Data Science 到底是什麼從一個完全外行角度來看][10]用.Net Core跑Hadoop MapReduce - Streaming介紹<section><figure><a href="https://lh3.googleusercontent.com/-RP0Gkq3i-oE/WkcnGQeRhAI/AAAAAAAAXW0/HgFyGTkmNwE97vofL36E-suboOHJluFSQCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-FXkM_hkx4YI/WkcnHQOktrI/AAAAAAAAXW4/KNNuagCg9Zo9vnDzkM-8mcdYB2z4lf9KQCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption><span>圖片來源: <a href="https://pixabay.com/en/books-spine-colors-pastel-1099067/">https://pixabay.com/en/books-spine-colors-pastel-1099067/</a> 和 <a href="https://pixabay.com/en/math-blackboard-education-classroom-1547018/">https://pixabay.com/en/math-blackboard-education-classroom-1547018/</a></span></figcaption></figure></section><section><p>上一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-09-hadoop-map-reduce-java-wordcount-example.html">[09]了解Hadoop裡的MapReduce到底是什麼?</a>)了解了什麼是MapReduce,並且了解了怎麼用Java寫一個MapReduce的Hello World程式:WordCount。 </p><p>馬上會想到的一個問題是,難道只有Java可以寫MapReduce的程式嗎? </p><p>這篇將會介紹Hadoop的Streaming服務,讓任何語言只要透過<em>Standard Input和Standard Output</em>就可以寫出MapReduce程式。 將會使用最熟悉的語言,.Net Core來完成這個事情。 </p><p>在這篇也會介紹另外一種測試Hadoop的方式,使用Docker來測試。 </p><div class="bs-callout bs-callout-default">這篇的範例程式碼在github:<a href="https://github.com/alantsai/blog-data-science-series/tree/master/src/chapter-10-dotnet-mapreduce">alantsai/blog-data-science-series 裡面的 src/chapter-10-dotnet-mapreduce</a></div></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514612012655599" ;="">什麼是Hadoop Streaming</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514612012656732" ;="">實際操作</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514612012656715" ;="">Mapper開發</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514612012656712" ;="">Reducer開發</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514612012656716" ;="">測試結果</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514612012656878" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a><section><h2 id="WizKMOutline_1514612012655599">什麼是Hadoop Streaming</h2><p>當一個MapReduce的程式被執行的時候,會先被切割成為一個一個的Task,然後由那台的DataNode用Java執行那個Task。 </p><p>所以整個執行類似下圖,整個MapReduce都在JVM的環境下: </p><figure><a href="https://lh3.googleusercontent.com/-nllf8H6fyGA/WkcnIu6LLaI/AAAAAAAAXW8/TRgczukT6H8k7LcBlUe-vrO6WQrQfs8NACHMYCw/s1600-h/image%255B5%255D"><img width="654" height="369" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-bSrPZnnJg_Y/WkcnKMdzj-I/AAAAAAAAXXA/iAQNcgtWyMYsZ6ebR8nWdnyBknkOMKqPACHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a><br />
<figcaption>JVM的MapReduce</figcaption></figure><p>不過Hadoop考量到如果外部需要執行MapReduce要怎麼辦,因此建立了一個叫做Streaming的功能。 </p><p>基本上,只要那台DataNode可以<em><strong>Run的起來</strong></em>都可以跑。 </p><p>Hadoop Streaming透過<em><strong>Standard Input/Output/Error 3個管道</strong></em> 來和被Run起來的程式溝通。 </p><p>MapReduce的程式只需要從Standard Input讀進來,做處理,然後在寫到Output。如果有錯誤訊息可以記錄在Error裡面。 </p><p>整個概念大概是: </p><figure><a href="https://lh3.googleusercontent.com/-7aZ4PVZ1mEw/WkcwowUSYSI/AAAAAAAAXYQ/jeYjCaZDnqoYTJBUUPwdmFQHHr3Otv0TACHMYCw/s1600-h/image%255B3%255D"><img width="654" height="482" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Pkp_tC_BoD0/Wkcwp8pw99I/AAAAAAAAXYU/r9lM-U8EsI4HcdtwGtDSXdW_DsCwkVBLACHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a><br />
<figcaption>Hadoop Streaming</figcaption></figure></section><section><h2 id="WizKMOutline_1514612012656732">實際操作</h2><p>還記得整個MapReduce基本上就是在每個階段做過處理之後,會產生一個key value pair。Hadoop用<em><strong>tab</strong></em>來切割Key 和 Value。 </p><p>有了這個概念之後來看實際程式,以下使用的是.Net Core的console來開發,分幾個階段: </p><ol><li>Mapper開發</li>
<li>Reducer開發</li>
<li>測試結果</li>
</ol><section><h3 id="WizKMOutline_1514612012656715">Mapper開發</h3><p>由於是透過Standard Input/Output,因此console非常適合,所以會建立一個Mapper的.Net Core Console程式。 </p><p>在Mapper的階段,內容會是一行一行讀進來,所以把讀進來的內容做文字切割, 每找到一個word,就寫到output,<em>word是key</em>,<em>1是value</em>(代表找到一筆) </p><p>會一直迴圈的讀,直到沒有任何檔案為止。如果把這個和之前java比照會發現邏輯一樣。 </p><pre class="brush: csharp;">class Program
{
static void Main(string[] args)
{
string line;
while ((line = Console.ReadLine()) != null)
{
// 用文字切割
var words = Regex.Matches(line, @"[\w]+");
foreach (var word in words)
{
// 每一個找到的算1筆 - keyvalue用tab切割
Console.WriteLine("{0}\t1", word);
}
}
}
}</pre></section><section><h3 id="WizKMOutline_1514612012656712">Reducer開發</h3><p>會在建立另外一個專案用來放Reducer的程式。 </p><p>Reducer一樣是讀Input然後寫到output。由於這次讀到的內容<em><strong>是從Mapper來的</strong></em>,所以會先用tab做切割,key是word,value就是筆數(也都是1)。 </p><p>在這邊,有建立一個words dictionary,這個是因為在Mapper階段其實<em>沒有管</em>word有沒有重複,反正出現就是+1。 </p><p>不過在Reducer因為要加總,因此用了<code>words</code> dictionary作為一個暫存的空間。 </p><p>最後把所有結果寫到output - 也是 key value pair,key一樣是word,不過value就是word出現的總數。 </p><pre class="brush: csharp;">static void Main(string[] args)
{
// 用來儲存已經出現過的字 - java版本會自動處理,不過這個stream需要手動記錄
Dictionary<string, int> words = new Dictionary<string, int>();
string line;
while ((line = Console.ReadLine()) != null)
{
// 傳過來的key value用tab分割(Mapper也是用tab切割key和value)
var keyValuePair = line.Split('\t');
string word = keyValuePair[0];
int count = Convert.ToInt32(keyValuePair[1]);
// 如果已經有這個word,和字典的加總,不然就建立新的
if (words.ContainsKey(word))
{
words[word] += count;
}
else
{
words.Add(word, count);
}
}
// 把所有結果寫出來
foreach (var word in words)
{
Console.WriteLine("{0}\t{1}", word.Key, word.Value);
}</pre><div class="bs-callout bs-callout-info">和Java的版本不同,java版本會自動幫忙把key一樣組成一個list比較好操作,但是透過streaming需要自己手動操作。 </div></section><section><h3 id="WizKMOutline_1514612012656716">測試結果</h3><p>當整個程式準備好了之後,接下來就可以對這個程式做測試了。 </p><p>在接下來將會用一個docker版本的hadoop做測試 - 希望透過docker方式也可以了解用docker做測試有多方便。 </p><p>接下來的測試都是在powershell可以直接執行。 </p><div class="bs-callout bs-callout-info"><p>如果對docker不熟悉,那麼下面做不了。要跑docker基本上要Windows 10 Professional以上或者linux,並且有裝docker。 </p><p>裡面用到的docker image是一個linux的container。 </p><p>下面也可以直接在之前建立的Ubuntu環境裡面執行,不過需要先: </p><ul><li> 安裝.net core 2.0 </li>
<li> 跳過前面的步奏,知道後面呼叫hadoop Streaming那段即可 </li>
</ul></div><div class="bs-callout bs-callout-info"><p>接下來的指令操作都是在從github clone下來的專案裡面<code>src\chapter-10-dotnet-mapreduce</code>的資料夾下面執行。 </p><p>完整的指令是: </p><pre class="brush: powershell;">git clone https://github.com/alantsai/blog-data-science-series.git
cd .\blog-data-science-series\src\chapter-10-dotnet-mapreduce
</pre></div><dl><dt>先把.net core的console 發佈出來</dt>
<dd> 在powershell執行指令:<code>dotnet publish -o ${pwd}\dotnetmapreduce .\DotNetMapReduceWordCount\DotNetMapReduceWordCount.sln</code><figure><a href="https://lh3.googleusercontent.com/-7hjaKXRXqo8/WkcnNEXGaXI/AAAAAAAAXXM/hwtIMKEwJJcDVJSmiyr9Ly5lLCjqF0QHACHMYCw/s1600-h/image%255B11%255D"><img width="654" height="171" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-eJsFLS9RF4c/WkcnOBi2BNI/AAAAAAAAXXQ/_MdMKjJy8OMdBtPKdfeoIrestW5zIUELQCHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a> <figcaption>發佈結果</figcaption></figure></dd>
<dt>把hadoop用docker compose啟動</dt>
<dd> 使用指令把hadoop啟動:<code>docker-compose up -d</code>。 會看到: <ol><li>執行完有1個master 2個worker啟動</li>
<li>在YARN的web節點看到有兩個Node</li>
<li>在DataNode看到有兩個節點</li>
</ol><figure><a href="https://lh3.googleusercontent.com/-aVz_W4CVO0Q/WkcnPZd6SSI/AAAAAAAAXXU/OHhWZylncDYH90c0VNdssPiBWdaaNatwACHMYCw/s1600-h/image%255B14%255D"><img width="654" height="365" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-gTPb6ZWDZNc/WkcnQsEDhBI/AAAAAAAAXXY/yAyxudmAGbgtDvDGvz2vTUnVtWKTUzNPwCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a> <figcaption>可以看到啟動成功並且有兩個節點</figcaption></figure></dd>
<dt>把.Net core程式複製到master的hadoop節點裡面</dt>
<dd> 把剛剛發佈出來的.Net core程式複製到master裡面,並且進入到master裡面的bash並且可以看到有copy進去的內容 <pre class="brush: powershell;">docker cp dotnetmapreduce hadoop-dotnet-master:/dotnetmapreduce
docker exec -it hadoop-dotnet-master bash
ls
ls /dotnetmapreduce</pre><figure><a href="https://lh3.googleusercontent.com/-15cJ7kHjBNw/WkcnSG-pnjI/AAAAAAAAXXc/BTRexfbAh7clmnNFRYw6NRazwCkhHT60wCHMYCw/s1600-h/image%255B17%255D"><img width="654" height="171" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-tAfgPX7R_oI/WkcnTsvzIcI/AAAAAAAAXXg/vNC_FTSSQzYAugqGB31VGN7gaDTv8Xn9wCHMYCw/image_thumb%255B5%255D?imgmax=800" border="0"></a><figcaption>進入到master的bash並且檢查copy是否成功</figcaption></figure></dd>
<dt>把要計算的檔案放到hadoop的HDFS</dt>
<dd> 透過下面指令把檔案放到hadoop的HDFS的input資料夾並且檢查: <pre class="brush: powershell;">hadoop fs -mkdir -p /input
hadoop fs -copyFromLocal /dotnetmapreduce/jane_austen.txt /input
hadoop fs -ls /input
</pre><figure><a href="https://lh3.googleusercontent.com/-23RRtJuVDCQ/WkcnUwQkH3I/AAAAAAAAXXk/OW3hTR1s_YwGvMIH3xnlNQJBc3FU8Y48ACHMYCw/s1600-h/image%255B20%255D"><img width="654" height="120" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-OYuzw_kfiFY/WkcnWLah5tI/AAAAAAAAXXo/kSiOu95arVs38LpAEZ_nMV8GLtZ6X1m1gCHMYCw/image_thumb%255B6%255D?imgmax=800" border="0"></a> <figcaption>複製檔案到HDFS</figcaption></figure></dd>
<dt>用hadoop Streaming執行net core mapreduce</dt>
<dd> 用hadoop的streaming執行: <pre class="brush: powershell;">hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.7.2.jar \
-files "/dotnetmapreduce" \
-mapper "dotnet dotnetmapreduce/DotNetMapReduceWordCount.Mapper.dll" \
-reducer "dotnet dotnetmapreduce/DotNetMapReduceWordCount.Reducer.dll" \
-input /input/* -output /output
</pre><figure><a href="https://lh3.googleusercontent.com/-RYjrgOTeGK0/WkcnYo6-N8I/AAAAAAAAXXs/0bZQKz6SVPgPCmZIi2_FRfb1_o39HwcAQCHMYCw/s1600-h/image%255B23%255D"><img width="654" height="223" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Vimliibb7z8/WkcnZn-O8pI/AAAAAAAAXXw/lC7jAU3PSOMkq4pxY5dnUF8-LX9vl8OcwCHMYCw/image_thumb%255B7%255D?imgmax=800" border="0"></a> <figcaption>和之前執行map reduce的log一樣</figcaption></figure></dd>
<dt>檢查結果</dt>
<dd> 執行完了之後,可以看到計算的每個字出現次數 <pre class="brush: powershell;">hadoop fs -ls /output
hadoop fs -cat /output/part-00000
</pre><figure><a href="https://lh3.googleusercontent.com/-RhzE6QlyhKw/Wkcna6qZwKI/AAAAAAAAXX0/QFpyLLHbJcMedKAEtOkyf9EHowi4mplpQCHMYCw/s1600-h/image%255B26%255D"><img width="654" height="413" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Tj_p8JxkloA/WkcncG_2yVI/AAAAAAAAXX4/VLXz1UsvW-Itd8e0q98ZYKhAM78nIMPsgCHMYCw/image_thumb%255B8%255D?imgmax=800" border="0"></a> <figcaption>執行結果</figcaption> </figure><div class="bs-callout bs-callout-warning">會注意到這邊的結果和java版本有點不同,因為判斷字的邏輯不同導致。 </div><div class="bs-callout bs-callout-info">如果docker不需要了,可以用<code>docker-compose down</code>把整個hadoop關掉。 </div></dd></dl></section></section><section><h2 id="WizKMOutline_1514612012656878">結語</h2><p>在這篇介紹了透過Hadoop Streaming達到在hadoop用.Net core 2.0的console程式做MapReduce如何。 </p><p>這篇也改成使用docker來做hadoop測試而不是用一直以來建立的VM。用docker和VM比較會發現到docker其實做這種事情非常方便,如果對docker不熟悉,可以考慮花點時間做些學習(之後我的部落格也會有個系列介紹docker使用,有興趣的話請持續關注)。 </p><div class="bs-callout bs-callout-info">在這個系列的後面,之前建立的VM還會用到 - 用來和R做結合。所以如果對後面操作有興趣,VM還是先保留。 </div><p>在這個系列的Hadoop介紹也到了一個尾聲,在下一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-11-hadoop-conclustion-ecosystem-intro.html">[11]Hadoop總結(上篇)–Ecosystem介紹</a>)將會對目前hadoop有介紹的部分做一個總結,介紹hadoop的ecosystem,和還有什麼部分是應該繼續關注下去。 </p></section> <section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:85f26ad6-2c99-4be6-9f2d-59dc57c01179" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a>,<a href="http://blog.alantsai.net/search/label/hadoop" rel="tag">hadoop</a>,<a href="http://blog.alantsai.net/search/label/net-core" rel="tag">net-core</a>,<a href="http://blog.alantsai.net/search/label/docker" rel="tag">docker</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-41888064912399612952017-12-27T21:37:00.000+08:002017-12-30T13:46:20.312+08:00[Data Science 到底是什麼從一個完全外行角度來看][09]了解Hadoop裡的MapReduce到底是什麼?<section><figure><a href="https://lh3.googleusercontent.com/-601ygquvgt4/WkOfA6dx4eI/AAAAAAAAXV4/7HkHdeOQ9gE4Uxlbhff1CdcytjWX0QbVgCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-qDgM7uC_aEo/WkOfCkb2m2I/AAAAAAAAXV8/_7Q2L8IZeOkWuRSU_C8-ltYTFFzgM2PnACHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption><span>圖片來源: <a href="https://pixabay.com/en/books-spine-colors-pastel-1099067/">https://pixabay.com/en/books-spine-colors-pastel-1099067/</a> 和 <a href="https://pixabay.com/en/math-blackboard-education-classroom-1547018/">https://pixabay.com/en/math-blackboard-education-classroom-1547018/</a></span></figcaption></figure></section><section><p>在上一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-08-hadoop-fully-distributed-mode-tutorial.html">[08]Hadoop 改成完全分散模式</a>)透過複製VM的方式建立出了fully-distributed mode,基本上在這個系列裡面對於Hadoop的介紹也快到了一個尾聲。</p><p>不過,還有一個部分被忽略了,也就是實際在Hadoop做運算的程式,也是WordCount的實際運算邏輯。</p><p>這篇會介紹MapReduce的概念,並且看一下WordCount的java程式是如何撰寫。</p></section><section><a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514216989241590" ;="">什麼是MapReduce</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514216989248293" ;="">換個方式理解 - 用選舉為例</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514216989248724" ;="">怎麼在Hadoop寫MapReduce</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514216989248854" ;="">Map</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514216989248767" ;="">Reduce</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514216989248883" ;="">設定</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514216989249921" ;="">結語</a><br />
</li>
</ul></div></section><a name='more'></a><section><h2 id="WizKMOutline_1514216989241590">什麼是MapReduce</h2><p>MapReduce其實是一種開發模式(Program Model),基本上可以把整個邏輯分成為Map階段和Reduce階段。 </p><ul><li>Map階段基本上會做filtering和sorting並且傳出一個key value pair做結果(以wordcount為例,每一個字會作為最後的key,而value則是1代表有一筆)</li>
<li>Reduce階段基本上會做整合(以wordcount為例,從Map傳過來的key如果一樣,表示同一個字,因此把一樣的key做加總最後的出總筆數)</li>
</ul><p>從下圖可以看到整個的流程: </p><figure><a href="https://lh3.googleusercontent.com/-z9zzTpLkQV4/WkOfEqkJFJI/AAAAAAAAXWA/VhznYv1guu8MyYFTig8MiKtPjK36Sg3fgCHMYCw/s1600-h/image%255B7%255D"><img width="654" height="478" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-o3uPPa-n1Ng/WkOfGQCPFBI/AAAAAAAAXWE/X1NVw_EHUTgTwvCB5Y-JSi-dAUppLYAXwCHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a><figcaption>整個WordCount的MapReduce流程。來源:https://www.mssqltips.com/sqlservertip/3222/big-data-basics--part-5--introduction-to-mapreduce/</figcaption></figure><br />
<dl><dt>input</dt>
<dd>這個是要做計算的原始資料,以上圖為例其實就是一堆文字清單</dd>
<dt>split</dt>
<dd>把input資料做分散處理 - 以hadoop來說,當MapReduce工作被輸入的時候,會被切割到各個cluster裡面等待做處理</dd>
<dt>map</dt>
<dd>這個就是MapReduce裡面的Map階段 - 每一個節點會把對應切割出來的資料建立key value結果 - key是字本身,然後value是1代表找到一筆</dd>
<dt>combine</dt>
<dd>這個其實也是在map的機器裡面做 - 把每一個key一樣的先做一次加總,避免傳送多次出去</dd>
<dt>shuffle & sort</dt>
<dd>在進入reduce階段之前,會先被做一個排序,因此相關的key值會放在一起</dd>
<dt>reduce</dt>
<dd>這個階段會做實際的加總,因此每一個key以的的value會被加總</dd>
<dt>outpu</dt>
<dd>這個是最後得到的結果</dd></dl><div class="bs-callout bs-callout-info"><p>這邊需要注意一下,當提到map和reduce是小寫的時候,指的會是functional programing提供的方法。MapReduce則是開發模式。 </p><p>上圖雖然用了小寫,不過這邊指的還是hadoop裡面的MapReduce。 </p></div><div class="bs-callout bs-callout-info">Map和Reduce階段回傳的結果都是一個key value pair。 </div></section><section><h2 id="WizKMOutline_1514216989248293">換個方式理解 - 用選舉為例</h2><p>如果上面那個例子看了還是有點模糊,換個生活遇到的例子作說明</p><p>當台灣遇到選舉的時候,一般來說有選舉權的民眾會去戶籍地去做投票 - 投票完有沒有看當天新聞了解這些投票是怎麼計算的嗎? </p><p>如果那個時候看新聞,會注意到,會有跑馬燈一直跑說,某某縣市目前xxx有幾票 - 這個票數是及時在變動: </p><figure><figcaption><a href="https://lh3.googleusercontent.com/-OCP9dJYFTUo/WkOfKqKHqQI/AAAAAAAAXWI/gwdpJMDUoFwYmDY5XWb5PdR8Q1GGSW9rACHMYCw/s1600-h/image%255B12%255D"><img width="654" height="369" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-LTYHcGMh2rw/WkOfOIt_5JI/AAAAAAAAXWQ/qfLbkt0Oy5wCo9mqYFTc_gfnJmQ6ZQtAQCHMYCw/image_thumb%255B6%255D?imgmax=800" border="0"></a><br />
</figcaption><figcaption>選舉的時候新聞及時播放票數。來源:http://my-own-post.com/new20150116/</figcaption></figure><p>整個數票的動作其實就是MapReduce。 </p><dl><dt>input</dt>
<dd>所有有投票的票數就是整個input</dd>
<dt>split</dt>
<dd>每個可以投票的民眾去戶籍地投票,同等於把這個input split到不同的區域</dd>
<dt>map</dt>
<dd><p>投票時間截止了之後,每一個投票站會開始從箱子取出來,然後唱名這張票屬於哪個候選人。 </p><p>每一張票的候選人就是key,然後唱名1票就是value </p></dd>
<dt>combine</dt>
<dd> 當每一個投票站都分好了之後,會先做一個初步的加總,得到的每個站的總票數。 </dd>
<dt>shuffle & sort</dt>
<dd>在這個階段,會把每個投票站同一個候選人(key)的放在一起</dd>
<dt>reduce</dt>
<dd>做最後加總 - 把所有一樣key的值加在一起</dd>
<dt>output</dt>
<dd>最後結果就是誰當選了</dd></dl><p>首先,每個可以投票的會去戶籍地做投票的動作,這個其實同等於 </p></section><section><h2 id="WizKMOutline_1514216989248724">怎麼在Hadoop寫MapReduce</h2><p>希望透過上面的比喻方式,對於整個MapReduce有個更清楚的了解,那在Hadoop裡面怎麼寫MapReduce呢?</p><p>Hadoop是java的程式,因此用java寫一定是最容易,下面快速介紹一下如何用java寫MapReduce,大概會分幾個部分: </p><ul><li>Map</li>
<li>Reduce</li>
<li>設定</li>
</ul><section><h3 id="WizKMOutline_1514216989248854">Map</h3><pre class="brush: csharp;">public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, Context context) throws IOException,
InterruptedException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
context.write(word, one);
}
}
}</pre><p>基本上,上面建立了一個<code>Map</code>class繼承<code>Mapper</code>並且定義了一個方法叫做<code>map</code>。 </p><p>Hadoop會把每一段文字個用<code>value</code>傳過來,因此用了tokenizer把裡面的word取出來。 </p><p>每一個取出來的word,會被寫成一組key value pair(<code>context.write(word,one)</code>),word是key,value是<code>數值1</code>。 </p><p>會一直做,直到整個word都處理完。 </p></section><section><h3 id="WizKMOutline_1514216989248767">Reduce</h3><pre class="brush: csharp;">public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws
IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
</pre><p>Reducer和mapper類似,先定義一個class叫做<code>Reduce</code>繼承<code>Reducer</code>。</p><p>裡面有一個<code>reduce</code>的程式定義reduce階段要做什麼</p><p>在這邊,java已經有處理好把一樣的key放成一組,因此可以透過迴圈的方式把所有值加總。 </p><p>最後把整個結果寫出去,一樣是key value pair,key還是原來的key,不過value是所有的加總。</p></section><section><h3 id="WizKMOutline_1514216989248883">設定</h3><p>Map階段和Reduce階段的功能都定義好了之後,接下來需要做的是告訴程式執行的時候那個是Map和那個是Reduce。 </p><pre class="brush: csharp;highlight:[28]">package org.myorg;
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
import org.apache.hadoop.util.*;
public class WordCount {
// 剛剛定義的 Map
....
// 剛剛定義的 Reduce
....
public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(WordCount.class);
conf.setJobName("wordcount");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
conf.setMapperClass(Map.class);
conf.setCombinerClass(Reduce.class);
conf.setReducerClass(Reduce.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
JobClient.runJob(conf);
}
}
</pre><p>這個程式應該蠻好理解,基本上就是把剛剛定義好的Map和Reduce做設定。</p><p>這邊比較特別是<code>Combiner</code>的部分,因為也是加總所以和reduce是一樣的概念。</p></section></section><section><h2 id="WizKMOutline_1514216989249921">結語</h2><p>透過這篇了解了整個MapReduce的運作機制,並且看了如何用Java寫過一個WordCount的MapReduce程式。</p><p>這邊會發現到,程式裡面完全沒有任何分散式處理的概念,但是Hadoop會<em><strong>自動</strong></em>以分散式的模式執行。這個讓撰寫變得非常簡單。</p><p>可是另外一個問題會浮現出來,難道只有Java可以寫MapReduce嗎? </p><p>在下一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-10-hadoop-streaming-intro-use-net-core-for-MapReduce.html">[10]用.Net Core跑Hadoop MapReduce - Streaming介紹</a>)將會介紹如何用.net core寫出可以再Hadoop透過stream的方式執行的MapReduce,並且這次會改成用docker的方式來執行,提供另外一種更快速和容易測試Hadoop的方式。 </p></section><section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:e89abc48-c72f-427c-b156-b85bdea3eb50" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a>,<a href="http://blog.alantsai.net/search/label/hadoop" rel="tag">hadoop</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-2945723187236689542017-12-26T21:55:00.000+08:002017-12-26T22:14:45.288+08:00[Data Science 到底是什麼從一個完全外行角度來看][08]Hadoop 改成完全分散模式<section><figure><a href="https://lh3.googleusercontent.com/-5ZIPrzPqaWQ/WkJSwcrrgqI/AAAAAAAAXSg/cz-miyNn8kEazSI1pROY-wI7jE8njVkbQCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-iqTlX5Iecb8/WkJSyLYxqzI/AAAAAAAAXSk/xYI1E0v9zWU9IYyPK37UKa5ojxnuoPDdACHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption><span>圖片來源: <a href="https://pixabay.com/en/books-spine-colors-pastel-1099067/">https://pixabay.com/en/books-spine-colors-pastel-1099067/</a> 和 <a href="https://pixabay.com/en/math-blackboard-education-classroom-1547018/">https://pixabay.com/en/math-blackboard-education-classroom-1547018/</a></span></figcaption><br />
</figure></section><section><p>在上一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-07-deeper-look-at-yarn-and-hdfs-in-hadoop.html">[07]更深入看看Hadoop裡面的YARN和HDFS</a>)了解了整個jps的process代表的意思之後,在這篇將會延續之前(<a href="http://blog.alantsai.net/2017/12/data-science-series-05-install-and-test-hadoop-part1.html">[05]建立Hadoop環境 -上篇</a>、<a href="http://blog.alantsai.net/2017/12/data-science-series-06-install-and-test-hadoop-part2.html">[06]建立Hadoop環境 -下篇</a>)建立出來<em style="line-height: 1.6; font-size: 15px;">pseudo-distributed mode</em><span style="line-height: 1.6; font-size: 15px;">的hadoop改成 </span><em style="line-height: 1.6; font-size: 15px;">fully-distributed mode</em></p><p>這篇結束之後,除了Master,會建立出一台slave。由於Master裡面也有DataNode和NodeManager,所以總共會有<em>2個</em>DataNode。 </p></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514114580092827" ;="">建立步奏</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514114580092272" ;="">修改原本的VM變成Master機器</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514114580092622" ;="">從Master建立Slave</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514114580092931" ;="">最後設定</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514114580092732" ;="">重新Format指令</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514114580092906" ;="">啟動和驗證</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514114580092308" ;="">執行WordCount</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514114580092413" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a> <section><h2 id="WizKMOutline_1514114580092827">建立步奏</h2><p>基本上整個的建立步奏可以分為6個部分: </p><ol><li>修改原本的VM變成Master機器</li>
<li>從Master建立Slave</li>
<li>最後設定</li>
<li>重新Format指令</li>
<li>啟動和驗證</li>
<li>執行WordCount</li>
</ol></section><section><h2 id="WizKMOutline_1514114580092272">修改原本的VM變成Master機器</h2><dl><dt>修改Hostname改成master</dt>
<dd><p>開啟Terminal(快速鍵<code>Ctrl+Alt+ t</code>)然後輸入:<code>sudo gedit /etc/hosts</code></p><p>在裡面的檔案把<code>ubuntu</code>改成<code>master</code></p><figure><a href="https://lh3.googleusercontent.com/-dtmJ5QWVKB0/WkJSz9ZbWkI/AAAAAAAAXSo/N94Z4mu9jwYREHcWIoqbqL_XA6StHFjEQCHMYCw/s1600-h/image%255B5%255D"><img width="654" height="271" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-9ckWMhgI_Mo/WkJS1LeOmeI/AAAAAAAAXSs/j7_BNBUNR38iBvir0Pkd1KcO6CuXm_F5wCHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a> <figcaption>調整host</figcaption></figure><div class="bs-callout bs-callout-info">記得透過右上角把整個機器重啟,然後開termianl會發現@後面是<em><strong>master</strong></em> <figure><a href="https://lh3.googleusercontent.com/-xaSvW-NDM5I/WkJS1wOQvCI/AAAAAAAAXSw/QfjC08fh0JYvp2itK0o0tP7I4n6ZmW4DACHMYCw/s1600-h/image%255B8%255D"><img width="275" height="324" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-IA0PBs7umY0/WkJS4yLJ_aI/AAAAAAAAXS0/jZaEvN9vIR0m_0qVCKpUrCnqy1IwtrtJQCHMYCw/image_thumb%255B2%255D?imgmax=800" border="0"></a> <a href="https://lh3.googleusercontent.com/-Mx0mSLhJn0k/WkJS7CUlbMI/AAAAAAAAXS4/jVxj6JTvExcDDHiR6WVf0ZmRK486cjORQCHMYCw/s1600-h/image%255B11%255D"><img width="234" height="102" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-9bPTYx_InuE/WkJS9Npb-OI/AAAAAAAAXS8/kUEb5LfDAjsi3hMmVJGz953Iwe0sd07jwCHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a> <figcaption>重啟機器和檢查terminal是不是變成master</figcaption></figure></div><div class="bs-callout bs-callout-info">重啟了之後,當輸入指令會需要<em>等一下</em>,因為他會嘗試和master溝通 - master不存在所以要等一下他timeout才會出現 </div></dd>
<dt>設定host的ip</dt>
<dd><p>透過右上角的network資訊找到目前機器的ip,並且用terminal執行:<code>sudo gedit /etc/hosts</code></p><p>在裡面加入:<code>{ip} master</code> - ip是上面找到的ip </p><figure><a href="https://lh3.googleusercontent.com/-5BVOL5Sl8bM/WkJS_xeBJyI/AAAAAAAAXTA/kc-qoV8hAFckyIpYt95Yj-qTpba9IRdUACHMYCw/s1600-h/image%255B14%255D"><img width="654" height="494" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-rCsKpEO9428/WkJTCFK8mmI/AAAAAAAAXTE/FxYVIW-AZWEnbXC4xJUH_RNLxPwIUz0oQCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a> <figcaption>找到ip</figcaption></figure><figure><a href="https://lh3.googleusercontent.com/-c_kww-2gkWs/WkJTEDFgmvI/AAAAAAAAXTI/JNT0Zw3asCsVoBb8zyrLMwU4lz-Ngw3lgCHMYCw/s1600-h/image%255B17%255D"><img width="654" height="249" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-etTZsQoGYUE/WkJTGpnSRGI/AAAAAAAAXTM/SSBKWQViHGcyP6_jTruOezRERsxJY39KQCHMYCw/image_thumb%255B5%255D?imgmax=800" border="0"></a> <figcaption>設定master的host ip</figcaption></figure></dd>
<dt>修改NameNode</dt>
<dd><p>在terminal執行:<code>gedit /usr/local/hadoop/etc/hadoop/master</code></p><p>在開的檔案,把裡面內容改成<code>master</code></p><figure><a href="https://lh3.googleusercontent.com/-IpWjf-Y2al0/WkJTINw5RLI/AAAAAAAAXTQ/XRRoPfyOu1MfOY8g9U77AMhyYCihOCNWgCHMYCw/s1600-h/image%255B20%255D"><img width="603" height="179" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-OLw2N0t1vsc/WkJTJ1kQ8II/AAAAAAAAXTU/f8EvRgvffB4WWuWnOlaWDIuIvk6SR_MqQCHMYCw/image_thumb%255B6%255D?imgmax=800" border="0"></a> <figcaption>改成master</figcaption></figure></dd>
<dt>修改cor-site.xml</dt>
<dd><p>在terminal輸入:<code>gedit /usr/local/hadoop/etc/hadoop/core-site.xml</code></p><p>把<em><strong>整個</strong></em><code>configuration</code>內容改成:</p><pre class="brush: xml;"> <property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property></pre><p>這邊把localhost改成了master</p></dd>
<dt>修改hdfs-site.xml</dt>
<dd><p>用terminal開啟:<code>gedit /usr/local/hadoop/etc/hadoop/hdfs-site.xml</code></p><p>在<code>Configuration</code>最後一筆的<em><strong>前面加上</strong></em>: </p><pre class="brush: xml;"><property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</pre><figure><a href="https://lh3.googleusercontent.com/-kfUp-LTg3GY/WkJTLeL_6-I/AAAAAAAAXTY/qO7ysOHLOgUkjOxN_I95mn9im8tqzNtFwCHMYCw/s1600-h/image%255B23%255D"><img width="654" height="534" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-A2txyXz515E/WkJTM4EcNBI/AAAAAAAAXTc/9le4-Is7MtQ4OdVRNW0SOjhZQezMqL2EwCHMYCw/image_thumb%255B7%255D?imgmax=800" border="0"></a> <figcaption>修改畫面</figcaption></figure></dd>
<dt>修改 mapred-site.xml</dt>
<dd><p>在terminal輸入:<code>gedit /usr/local/hadoop/etc/hadoop/mapred-site.xml</code></p><p><em>增加</em>以下設定Configuration:</p><pre class="brush: xml;"><property>
<name>mapred.job.tracker</name>
<value>master:54311</value>
</property>
</pre><figure><a href="https://lh3.googleusercontent.com/-Eg85ZBeCxA4/WkJTPXUhZxI/AAAAAAAAXTg/v4DSStu4rL4t04ghKKl_c1lv2lLKnBczACHMYCw/s1600-h/image%255B26%255D"><img width="654" height="579" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYkmyDT9_sRZhZWiwRKnswJiQgg3q63E5SD2B78rBv2jqSl-lg_aWbDHBd1QccC-n6AJjEpQayKiL6-tO-4m-uxmz4IVtCnguYft8G66OruJSFRtxS5sO9YXWZ_8JDzf08tqS2XjlvrmUv/?imgmax=800" border="0"></a> <figcaption>設定畫面</figcaption></figure></dd>
<dt>修改yarn-site.xml</dt>
<dd><p>在terminal輸入:<code>gedit /usr/local/hadoop/etc/hadoop/yarn-site.xml</code></p><p><em>增加</em>以下設定到Configuration:</p><pre class="brush: xml;"><property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8050</value>
</property>
</pre><figure><a href="https://lh3.googleusercontent.com/-XBbuE0gU2GA/WkJTU5JUAVI/AAAAAAAAXTo/g_4CcZOfJzApjFt6WmV3sa8WHu0mIOFmgCHMYCw/s1600-h/image%255B29%255D"><img width="650" height="594" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-fvgGvEE6eQI/WkJTY9qafkI/AAAAAAAAXTs/Y8pmFuHOxu8eikDGrZM0la-9sVyOui7VQCHMYCw/image_thumb%255B9%255D?imgmax=800" border="0"></a> <figcaption>增加yarn site設定</figcaption></figure></dd>
<dt>slaves檔案設定</dt>
<dd><p>用terminal輸入:<code>gedit /usr/local/hadoop/etc/hadoop/slaves</code></p><p>改成以下設定: </p><pre class="brush: plain;"> master
slave1
</pre></dd></dl></section><section><h2 id="WizKMOutline_1514114580092622">從Master建立Slave</h2><p>先從設定找到Master VM的設定位置,並且複製一份出來 </p><figure><a href="https://lh3.googleusercontent.com/-EtKL6jS8VAg/WkJTa4aMEGI/AAAAAAAAXTw/2OGqSoO4liQsT6RNpI-ll3zzfNoVCNsMACHMYCw/s1600-h/image%255B32%255D"><img width="654" height="307" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-owDYa5UxcCU/WkJTfRQ1v1I/AAAAAAAAXT0/mAmsJuSCqbcwK7ZV3889MPOG0xJTxtJPQCHMYCw/image_thumb%255B10%255D?imgmax=800" border="0"></a><br />
<a href="https://lh3.googleusercontent.com/-clvz72QaEFs/WkJTjuuml3I/AAAAAAAAXT4/vyuRU8Pi9h4_XRWKTHLqpc1APUVCdyYJgCHMYCw/s1600-h/image%255B35%255D"><img width="654" height="439" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-JJOuzP6q01c/WkJTsbyakyI/AAAAAAAAXT8/FrrO8nOhqSoEA8IYYKHYi1xVQhW1En2EwCHMYCw/image_thumb%255B11%255D?imgmax=800" border="0"></a><br />
<figcaption>透過設定找到VM檔案位置</figcaption></figure><p>用開啟VM的方式打開<em><strong>複製</strong></em>出來的VM </p><figure><a href="https://lh3.googleusercontent.com/-HVcCZvvJdgw/WkJTuG0hJ7I/AAAAAAAAXUA/xBaYQbHOXeQA1d8TX3oWmzUMns-ZaX0KgCHMYCw/s1600-h/image%255B38%255D"><img width="654" height="370" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-_Zivd8Rekd0/WkJTv9EH4nI/AAAAAAAAXUE/PmZN9-ac6foQEoN0Nmp49ZznS7UgDUhmQCHMYCw/image_thumb%255B12%255D?imgmax=800" border="0"></a><br />
<figcaption>開啟VM並且改成hadoop-slave</figcaption></figure><p>對開啟的VM做出: </p><ol><li>選擇剛剛開啟的VM</li>
<li>選擇設定</li>
<li>切換<code>Options</code>的頁簽</li>
<li>修改VM名稱為hadoop-slave</li>
<li>按下 <code>ok</code></li>
</ol><figure><a href="https://lh3.googleusercontent.com/-h4NtixYgLbM/WkJTxlGstLI/AAAAAAAAXUI/Wurdb6sq58cahypxijuDmRjqXinqr3_TACHMYCw/s1600-h/image%255B41%255D"><img width="654" height="357" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-d8UqyGBt16g/WkJTy5J2MCI/AAAAAAAAXUM/_rH0LNG1e6cLr9GxTjsh-1U-Vr87kvgNACHMYCw/image_thumb%255B13%255D?imgmax=800" border="0"></a><br />
<figcaption>設定VM名稱</figcaption></figure><p>把slave那台啟動起來,當出現選擇的時候,記得選擇<em><strong>I Copied It</strong></em></p><figure><a href="https://lh3.googleusercontent.com/-9UspAMrBGSM/WkJTztn5BwI/AAAAAAAAXUQ/xm4-eUK_A6MRVdK0_KEMhVTf4FX4qDohQCHMYCw/s1600-h/image%255B44%255D"><img width="654" height="475" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-FyE8Fg6j4c4/WkJT1neSuYI/AAAAAAAAXUU/I10kRNhD_T44OiwB79vpx0fyCj1elpnMQCHMYCw/image_thumb%255B14%255D?imgmax=800" border="0"></a><br />
<figcaption>選擇I Copied It</figcaption></figure><p>最後把兩個VM都啟動起來,可以再上面的title看到那一台是master和那台是slave </p><figure><a href="https://lh3.googleusercontent.com/-jbzVY5PTph8/WkJT28qJC3I/AAAAAAAAXUY/89SnoWPofR8D5-iJ3tJlK0fmAkxR492CwCHMYCw/s1600-h/image%255B47%255D"><img width="654" height="336" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-TU_C2WDueNQ/WkJT47x7cpI/AAAAAAAAXUc/R7LL6TUrNOUkd1PaM4T1cvt6MGZ97NWmgCHMYCw/image_thumb%255B15%255D?imgmax=800" border="0"></a><br />
<figcaption>兩台機器啟動起來</figcaption></figure></section><section><h2 id="WizKMOutline_1514114580092931">最後設定</h2><dl><dt>修改slave那台的hostname改成slave1</dt>
<dd><p>開啟Terminal(快速鍵 <code>Ctrl+Alt+ t</code>)然後輸入: <code>sudo gedit /etc/hosts</code></p><p>在裡面的檔案把 <code>master</code>改成 <code>slave1</code></p><figure><a href="https://lh3.googleusercontent.com/-KBOKFk4LxhE/WkJT62jXFnI/AAAAAAAAXUg/B3CFpgJ9s9QipRsiQ-oJjQ9qHGKW4QBfgCHMYCw/s1600-h/image%255B50%255D"><img width="413" height="174" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-sD5BIlE-zuM/WkJT-xjJEdI/AAAAAAAAXUk/vIHx9U1MI20keyBcaQ3SW6vZyCS0syFkwCHMYCw/image_thumb%255B16%255D?imgmax=800" border="0"></a> <figcaption>調整host</figcaption></figure><div class="bs-callout bs-callout-info">記得一樣要重啟機器才會有作用 </div></dd>
<dt>設定slave的ip</dt>
<dd><p>透過右上角的network資訊找到<em>slave</em>機器的ip,並且在<em><strong>master和slave</strong></em>的機器terminal執行:<code>sudo gedit /etc/hosts</code></p><p>在裡面加入:<code>{ip} slave1</code> - ip是上面找到的ip </p><figure><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2TbaefVtDuI4ibMK74ioR2Z9qpXghoo9w_ib-JxszGuy7rrLzHgsQIksYBU9yZXeGMfaZBbFdL_uks1jMY5Q3WJOsm6hMH4tNb5xblefPe3bSwSLOFJkkXdDl3V3RS5kDg5_Ar4pQA-bG/s1600-h/image%255B53%255D"><img width="654" height="300" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-5rIeJNfmui4/WkJUCt9I87I/AAAAAAAAXUs/Brx9piJULjsiVWiOkLgR_G_cuY1z3TFfQCHMYCw/image_thumb%255B17%255D?imgmax=800" border="0"></a> <figcaption>兩台都要修改</figcaption></figure></dd>
<dt>確認master和slave 1可以互動</dt>
<dd><p>分別從<em>master</em>那台的terminal呼叫:<code>ping slave1</code>和<em>slave</em>那台機器的terminal呼叫:<code>ping master</code></p><p>確保兩台之間溝通沒有問題</p><figure><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_sIcr1OifPcRA8fOTxhjLLvy8CmsNGl-_UT15SVJZi5Fb01A39qJ1abxFWmejsCFEGAl5Kg7swNSrBw9kwj5eLbaF_a4CcXqa48ugXBD-qeptr5GTOJ5BlPw7aYbh1818_bbQHHn2e4nw/s1600-h/image%255B56%255D"><img width="654" height="172" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-bKDTdPyreB8/WkJUFVsK51I/AAAAAAAAXU0/uPqw4VVvea0bJpmoBiXgWLJnU4yYi10VACHMYCw/image_thumb%255B18%255D?imgmax=800" border="0"></a> <figcaption>兩台互相ping</figcaption></figure></dd>
<dt>在master那台設定slave的sh key</dt>
<dd><p>在master的機器把slave ssh key建立出來然後做出測試,在terminal執行:</p><pre class="brush: plain;">cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
scp -r ~/.ssh slave1:~/
ssh slave1
exit
</pre><figure><a href="https://lh3.googleusercontent.com/-i5VZDexm6R0/WkJUGH-LZTI/AAAAAAAAXU4/ofGAef-y3Z0rbv25CJtv7pd_SoJqU3NOACHMYCw/s1600-h/image%255B59%255D"><img width="654" height="403" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-1_Gb4z9nc38/WkJUIKWW9xI/AAAAAAAAXU8/2ciP40Ke2wYu3YASHlzNW3TQPzxcGQwKQCHMYCw/image_thumb%255B19%255D?imgmax=800" border="0"></a> <figcaption>測試ssh畫面</figcaption></figure></dd></dl></section><section><h2 id="WizKMOutline_1514114580092732">重新Format指令</h2><dl><dt>建立DataNode和NameNode資料夾</dt>
<dd><p>在<em>master</em>輸入以下來重建資料夾:</p><pre class="brush: plain;">sudo rm -rf /usr/local/hadoop/hadoop_data/hdfs
mkdir -p /usr/local/hadoop/hadoop_data/hdfs/namenode
mkdir -p /usr/local/hadoop/hadoop_data/hdfs/datanode
sudo chown -R hduser:hduser /usr/local/hadoop
</pre><p>在<em>slave</em>輸入以下來重建對應資料夾:</p><pre class="brush: plain;">sudo rm -rf /usr/local/hadoop/hadoop_data/hdfs
mkdir -p /usr/local/hadoop/hadoop_data/hdfs/datanode
sudo chown -R hduser:hduser /usr/local/hadoop
</pre></dd>
<dt>格式化hdfs</dt>
<p>在<em>master</em>輸入以下來format hdfs:</p><pre class="brush: plain;">hadoop namenode -format
hadoop datanode -format
</pre><p>在<em>slave</em>輸入以下來format hdfs:</p><pre class="brush: plain;">hadoop datanode -format
</pre></dl></section><section><h2 id="WizKMOutline_1514114580092906">啟動和驗證</h2><p>在master呼叫<code>start-all.sh</code>(這邊偷懶了,其實比較建議呼叫start-yarn和start-hdfs)來啟動整個hadoop。 </p><p>啟動了之後可以再兩台的jps看到服務都出現: </p><figure><a href="https://lh3.googleusercontent.com/-C3DIifvOQHg/WkJUKP6W7rI/AAAAAAAAXVA/OWIvnQEQmX4PfXGAhfGclk4_y3kQ1BVxgCHMYCw/s1600-h/image%255B62%255D"><img width="654" height="283" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-IZkfcVgOgBE/WkJUL0WHUcI/AAAAAAAAXVI/Q_PVw9kvXnMU2agb6WOvUQsiULOJXF7dwCHMYCw/image_thumb%255B20%255D?imgmax=800" border="0"></a><br />
<figcaption>master同時也是slave</figcaption></figure><p>檢查ResourceManager,在Firefox輸入:http://localhost:8088 </p><figure><a href="https://lh3.googleusercontent.com/-8p9r0JwwhIg/WkJUN9XvHAI/AAAAAAAAXVM/ZrcH4oe6cCgMHxbPPx408d1tWEMk6y0cgCHMYCw/s1600-h/image%255B65%255D"><img width="654" height="476" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-bl8GOYf1yTY/WkJUPFTJiTI/AAAAAAAAXVQ/CQ3K9aFpeCQrxbJmY-fpaLRs6kxMRfRWgCHMYCw/image_thumb%255B21%255D?imgmax=800" border="0"></a><br />
<figcaption>可以看到有兩個Node</figcaption></figure><p>檢查DataNode,在Firefox輸入:http://localohost:50070 </p><figure><a href="https://lh3.googleusercontent.com/-kl-3zbf1GoE/WkJUQ2hHFYI/AAAAAAAAXVU/i73nJgztvQMiF3rY-tb0GUsZgA-BVcABwCHMYCw/s1600-h/image%255B68%255D"><img width="654" height="810" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-pZMvs8FU7nY/WkJUTuk2GbI/AAAAAAAAXVY/gQHrpAtUGpg6nhulV_RHzyqzIYMVqWNWACHMYCw/image_thumb%255B22%255D?imgmax=800" border="0"></a><br />
<figcaption>可以看到有兩個DataNode</figcaption></figure></section><section><h2 id="WizKMOutline_1514114580092308">執行WordCount</h2><p>執行方式和之前一模一樣:</p><pre class="brush: plain;">cd ~/Downloads
hadoop fs -mkdir -p /user/hduser/input
hadoop fs -copyFromLocal jane_austen.txt /user/hduser/input
</pre><p>執行WordCount程式:<code>hadoop jar wordcount2.jar WordCount /user/hduser/input/jane_austen.txt /user/hduser/output</code></p><p>檢查執行結果:<code>hadoop fs -cat /user/hduser/output/part-r-00000</code></p><div class="bs-callout bs-callout-warning">如果要在執行一次計算,需要先把hdfs裡面的output<em>砍掉</em>,要不然會執行不了。指令是:<code>hadoop fs -rm -r /user/hduser/output</code></div><div class="bs-callout bs-callout-warning">如果執行有問題,或者run不起來,可以試試重開機,然後從<em>測試Hadoop</em>裡面的<em>格式化HDFS</em>開始重新做一次。 </div></section><section><h2 id="WizKMOutline_1514114580092413">結語</h2><p>在這篇,透過之前建立的VM轉換成為Master,並且在從這個Master複製出來變成slave。 </p><p>可以想象,如果要串聯多台電腦可以用這種方式達到分散式運算和分散式檔案儲存。只不過這邊用VM來模擬這個情況。</p><p>基本上,到目前為止對於整個Hadoop應該已經有個比較完整的感覺,並且了解如何建立一個測試來玩玩看。</p><p>不過有一個部分還沒有介紹,就是MapReduce裡面執行的WordCount程式是怎麼建立出來。</p><p>在下一篇將會介紹MapReduce執行的概念和WordCout是怎麼寫出來。</p></section> <section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:10e0057c-84bf-4737-891e-81a0daf24ed1" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a>,<a href="http://blog.alantsai.net/search/label/hadoop" rel="tag">hadoop</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-75788009921525312372017-12-25T21:26:00.001+08:002018-02-10T22:31:45.789+08:00[Data Science 到底是什麼從一個完全外行角度來看][07]更深入看看Hadoop裡面的YARN和HDFS<section><figure><a href="https://lh3.googleusercontent.com/-dflngrHE-qU/WkD7gIKzbnI/AAAAAAAAXRM/JMY1-HAtKg0Logv3MixEX1Qx7PY2CrqNACHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-35u5PA2wW3c/WkD7hJooNpI/AAAAAAAAXRQ/sQf2gPcjnogwDzO37UnWyepcaIYD31RBQCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption><span>圖片來源: <a href="https://pixabay.com/en/books-spine-colors-pastel-1099067/">https://pixabay.com/en/books-spine-colors-pastel-1099067/</a> 和 <a href="https://pixabay.com/en/math-blackboard-education-classroom-1547018/">https://pixabay.com/en/math-blackboard-education-classroom-1547018/</a></span></figcaption><br />
</figure></section><section><p>在上一篇(<a style="line-height: 1.6; font-size: 15px;" href="http://blog.alantsai.net/2017/12/data-science-series-06-install-and-test-hadoop-part2.html">[06]建立Hadoop環境 -下篇</a><span style="line-height: 1.6; font-size: 15px;">)把hadoop </span><em style="line-height: 1.6; font-size: 15px;">pseudo-distributed mode</em><span style="line-height: 1.6; font-size: 15px;">整個建立了起來,在這個過程中有透過 </span><em style="line-height: 1.6; font-size: 15px;">jps</em><span style="line-height: 1.6; font-size: 15px;">看到啟動的時候有5個process:</span></p><ol><li>NameNode</li>
<li>SecondaryNameNode</li>
<li>ResourceManager</li>
<li>NodeManager</li>
<li>DataNode</li>
</ol><p>這些process分別是yarn和HDFS執行起來的process,其中Master會有前 <em><strong>3個</strong></em>而slave有後 <em><strong>2個</strong></em></p><p>這篇將會對於這幾個問題做一些介紹。</p><div class="bs-callout bs-callout-warning">這篇提到的架構屬於Hadoop 2.x 版本的內容,Hadoop 3 之後有所變動。 </div></section><section><a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514094423863565" ;="">Hadoop Cluster架構</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514094423863148" ;="">JobTracker和TaskTracker</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514094423863617" ;="">YARN - ResourceManager</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514094423863599" ;="">localhost:8088</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514094423863306" ;="">NameNode、DataNode和Secondary NameNode</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514094423863621" ;="">Secondary NameNode呢?</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514094423863991" ;="">localhost:50070</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514094423863980" ;="">結語</a><br />
</li>
</ul></div></section><a name='more'></a><section><h2 id="WizKMOutline_1514094423863565">Hadoop Cluster架構</h2><p>在介紹幾個jps之前,需要了解Hadoop Clusted的架構。 </p><p>Hadoop屬於Client/Server架構,基本上會有 <em><strong>一個Master</strong></em>, <em><strong>多個slave</strong></em>。 </p><div class="bs-callout bs-callout-info">因為Master很重要,所以2.x版本可以為master做High Availability和Federation。 </div><p>在上一篇建立的屬於 <em>pseudo-distributed mode</em>,換句話說Master和Slave都是同一台,所以才看到了5個process。</p><p>以下圖來說,是一個Master配上兩個Slave。master和slave裡面又可以分開兩層:MapReduce 和 HDFS 層 </p><figure><a href="https://lh3.googleusercontent.com/-osWsuhxwLUk/WkD7ihTM6FI/AAAAAAAAXRU/bMMJFU-Nk1gsTbwmg0C_Oznwcep4CEpVACHMYCw/s1600-h/image%255B8%255D"><img width="654" height="455" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-F-qIJn-j9oE/WkD7kci7WmI/AAAAAAAAXRY/SvTG9ALXBrYRKEH1uGqCSxs59ahvHif_wCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a><figcaption>不同層的內容。來源:http://saphanatutorial.com/how-yarn-overcomes-mapreduce-limitations-in-hadoop-2-0/</figcaption></figure><div class="bs-callout bs-callout-warning">注意,這邊的MapReduce層用的是Hadoop 1.x 的名稱。以2.0來說應該是YARN層。 </div></section><section><h2 id="WizKMOutline_1514094423863148">JobTracker和TaskTracker</h2><p>先來看看上面那層,可以看到: </p><ul><li>JobTracker - 在Master</li>
<li>TaskTracker - 在Slave</li>
</ul><p>當一個工作被記錄的時候(例如呼叫WordCount.jar),會先進入到 <em>JobTracker</em>,再由JobTracker去 <em>切割</em>分派給 slave的 <em>TaskTracker</em>去做執行。最後TaskTracker在回報結果到JobTracker裡面。 </p><figure><a href="https://lh3.googleusercontent.com/-UrnsOJFhDi0/WkD7ljjVlHI/AAAAAAAAXRc/g0o-P30tPbEkjQSbxkd6eu-wKq19TuwSACHMYCw/s1600-h/image%255B13%255D"><img width="489" height="386" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-w2gMEePiFmk/WkD7m4euZlI/AAAAAAAAXRg/n52Ac3T2JmUltazMPOvULmmLQROlpd9agCHMYCw/image_thumb%255B7%255D?imgmax=800" border="0"></a><figcaption>job分派情況,來源:http://saphanatutorial.com/mapreduce/</figcaption></figure><section><h3 id="WizKMOutline_1514094423863617">YARN - ResourceManager</h3><p>看到這邊,或許會奇怪,為什麼jps裡面沒有JobTracker和TaskTracker?原因是,JobTracker和TaskTracker是 <em>MapReduce Layer</em>層的內容,而Hadoop 2.0加上了YARN,因此在jps看到的是 <em><strong>ResourceManager</strong></em>和 <em><strong>NodeManager</strong></em>。 </p><p>簡單來說,可以理解成為: </p><ol><li>JobTracker - ResourceManager</li>
<li>TaskTracker - NodeManager</li>
</ol></section><section><h3 id="WizKMOutline_1514094423863599">localhost:8088</h3><p>Port 8088是ResourceManager的UI界面</p><p>因此可以用瀏覽器看到目前: </p><ul><li>有幾個cluster - 幾個slave</li>
<li>有哪些工作</li>
<li>工作的執行情況</li>
</ul><p>因此,run起來之後可以用這個來檢查目前情況。 </p><figure><a href="https://lh3.googleusercontent.com/-hFcMOQHySVo/WkD7oR8vRrI/AAAAAAAAXRk/g5l-TDrkl0clTidOzc3KvTZWfxblYFmFgCHMYCw/s1600-h/image%255B16%255D"><img width="654" height="332" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-s85nilB4pJk/WkD7qKavOBI/AAAAAAAAXRo/s_T84VMpJ_E11nyYrhL4koQCODgJcOy2gCHMYCw/image_thumb%255B8%255D?imgmax=800" border="0"></a><br />
<figcaption>8088的呈現畫面</figcaption></figure></section></section><section><h2 id="WizKMOutline_1514094423863306">NameNode、DataNode和Secondary NameNode</h2><p>基本上HDFS層和MapReduce層有一樣概念,不過這一次變成是儲存資料層的分散式儲存。 </p><ul><li>NameNode - 在Master</li>
<li>DataNode - 在Slave</li>
</ul><p>NameNode會記錄檔案<em><strong>分散</strong></em>在那幾個DataNode裡面。並且會透過<em><stron>replicate</stron>的方式把資料分成N份(一般是3份)儲存在不同DataNode達到檔案高可用性。 </em></p><p>以下圖來說,檔案被拆成了兩份:<em>A</em>和<em>C</em>,會自動被儲存在DataNode1~3,因此如果DataNode2掛掉了,NameNode會知道,並且 變成由DataNode1和DataNode3來處理。 </p><figure><a href="https://lh3.googleusercontent.com/-KQ8VD1R9V2M/WkD7rubV1ZI/AAAAAAAAXRs/qe-p0PBz8ME_-IcH9M6U_wmnWVIXbO7dgCHMYCw/s1600-h/image%255B21%255D"><img width="606" height="214" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-s2YGszg2_xQ/WkD7uYvbw9I/AAAAAAAAXRw/O0H0nIkfHIE_jT_TvKDDG_grVCtvfOCiQCHMYCw/image_thumb%255B11%255D?imgmax=800" border="0"></a><figcaption>NameNode和DataNode的關係。來源:https://www.quora.com/Explain-what-is-NameNode-in-Hadoop</figcaption></figure><section><h3 id="WizKMOutline_1514094423863621">Secondary NameNode呢?</h3><p>上面介紹了NameNode和DataNode,那麼Secondary NameNode呢? </p><p>Secondary NameNode用來提供一個<em>Checkpoint</em>輔助NameNode處理資料。 </p><p>因此Secondary NameNode不是備份用,因此為了避免誤會有時候會成為<em>Checkpoint Node</em><span style="line-height: 1.6; font-size: 15px;">。</span></p></section><section><h3 id="WizKMOutline_1514094423863991">localhost:50070</h3><p>Port 50070是NameNode的一個web UI界面</p><p>在這個界面裡面可以看到DataNode有幾台,並且有幾台死掉了等資訊。</p><figure><a href="https://lh3.googleusercontent.com/-AOxHKKnWdNM/WkD7xf4pWdI/AAAAAAAAXR0/UHEhY-UT7QUB30G0yPcd1QcAJD6nCBM0wCHMYCw/s1600-h/image%255B24%255D"><img width="654" height="412" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-uT1vQ9ANzFg/WkD72cuROOI/AAAAAAAAXR4/L2antyZl0gwI3A4atubgsyS8o6dHANBAwCHMYCw/image_thumb%255B12%255D?imgmax=800" border="0"></a><br />
<figcaption>50070的畫面</figcaption></figure></section></section><section><h2 id="WizKMOutline_1514094423863980">結語</h2><p>希望透過這篇對於底層的jps process有些了解,並且對於hadoop的cluster更有感覺。 </p><p>在下一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-08-hadoop-fully-distributed-mode-tutorial.html">[08]Hadoop 改成完全分散模式</a>),將會回到實際操作的部分,不過這次實際建立一個完整的cluster。Master那台本身是一台slave然後建立另外一台純粹是slave的機器。 </p></section><section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:6ba9b4fb-981d-4c19-91be-174db59bfd7f" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a>,<a href="http://blog.alantsai.net/search/label/hadoop" rel="tag">hadoop</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-7569830348976982112017-12-24T08:54:00.000+08:002017-12-25T21:32:48.443+08:00[Data Science 到底是什麼從一個完全外行角度來看][06]建立Hadoop環境 -下篇<section><figure><a href="https://lh3.googleusercontent.com/-CJ0uihAhLFo/Wj74iyCdZTI/AAAAAAAAXOs/EYVw6iPpjkMYdw6v2RB52eIX-QEZrCqGgCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-sA2nwBYGciQ/Wj74kUtMrmI/AAAAAAAAXOw/LkY3v9DGRR0E_Rw8Lwp89xrMAvXTHu3IwCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption><span>圖片來源:<a href="https://pixabay.com/en/books-spine-colors-pastel-1099067/">https://pixabay.com/en/books-spine-colors-pastel-1099067/</a> 和 <a href="https://pixabay.com/en/math-blackboard-education-classroom-1547018/">https://pixabay.com/en/math-blackboard-education-classroom-1547018/</a></span></figcaption><br />
</figure></section><section><p>上一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-05-install-and-test-hadoop-part1.html">[05]建立Hadoop環境 -上篇</a>)透過VMWare Player把Ubuntu裝好並且一些相關環境設定到,等於把hadoop的基礎環境建立好了。 </p><p>這篇將延續上篇的環境,把Hadoop建立上去,並且讓Hadoop跑一個hello world的範例。 </p></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514075612638700" ;="">環境準備</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514075612638645" ;="">建立Hadoop測試環境</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514075612638964" ;="">安裝和設定Hadoop</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514075612638833" ;="">測試Hadoop</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514075612638738" ;="">執行Hadoop的Hello World - WordCount</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514075612638726" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a> <section><h2 id="WizKMOutline_1514075612638700">環境準備</h2><p>這邊的清單和上一篇一樣,如果上篇已經有抓過,可以跳過: </p><dl><dt> 主機環境 </dt>
<dd> 接下來使用到的機器規格如下: <ul><li>OS - Windows 10 1703</li>
<li>CPU - i7-6500U 雙核</li>
<li>Memory - 16GB</li>
</ul></dd>
<dt> VMWare Player 14 </dt>
<dd><p>任何虛擬機器軟體都可以,只是剛好用的是VMWare Player 14。 </p><ul><li><a href="https://my.vmware.com/en/web/vmware/free#desktop_end_user_computing/vmware_workstation_player/14_0|PLAYER-1410|product_downloads">下載頁面</a></li>
<li>檔案大小約 90MB </li>
</ul></dd>
<dt> Ubuntu 16.04.3 </dt>
<dd><p>其他版本的Ubuntu也沒問題 - 如果用的是Ubuntu 14,那麼只有等一下安裝openjdk的部分會有問題,其他都一樣。 </p><ul><li><a href="https://www.ubuntu.com/download/desktop">下載頁面</a></li>
<li><a href="https://www.ubuntu.com/download/desktop/thank-you?version=16.04.3&architecture=amd64">直接下載(約1.4GB)</a></li>
</ul></dd>
<dt> Hadoop v2.7.4 </dt>
<dd><p>基本上 v2.x 的都沒有問題,只是剛好手上有2.7.4所以沒有在下載新的。如果是v3.0那麼設定會不同 </p><ul><li><a href="http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz">下載頁面</a></li>
<li><a href="http://apache.stu.edu.tw/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz">直接下載(約254 MB)</a></li>
</ul></dd>
<dt> MapReduce的Hello World程式 - WordCount </dt>
<dd><p>這個是用來測試map reduce的hello world程式: </p><ul><li><a href="https://1drv.ms/u/s!Am-7OXCiIo1Lh9EaLbZsQyArJyYZ6Q">WordCount2.jar</a></li>
<li><a href="https://1drv.ms/t/s!Am-7OXCiIo1Lh9EbxkNiZl1d7ERYtQ">jane_austen.txt</a> - pride and prejudice 前三章 - 測試算字數用</li>
</ul></dd></dl></section><section><h2 id="WizKMOutline_1514075612638645">建立Hadoop測試環境</h2><p>基本上整個的環境建立大概可以分幾個部分: </p><ol><li>安裝Ubuntu VM</li>
<li>設定Ubuntu環境</li>
<li>安裝和設定Hadoop</li>
<li>測試Hadoop</li>
</ol><div class="bs-callout bs-callout-info">這篇會介紹<em>第三步和第四部</em>的部分 </div><section><h3 id="WizKMOutline_1514075612638964">安裝和設定Hadoop</h3><dl><dt> 下載和解壓縮Hadoop </dt>
<dd><p>先用firefox下載(<a href="http://apache.stu.edu.tw/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz">直接下載</a>)hadoop到<em><strong>Downloads</strong></em>資料夾 </p><figure><a href="https://lh3.googleusercontent.com/-oweprqnd6Dc/Wj74lGMOExI/AAAAAAAAXO0/vmKK4rpueWgiiORjsVeTK-EhlQ_uzr9WACHMYCw/s1600-h/image%255B5%255D"><img width="518" height="461" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-x57nNkUp34E/Wj74mOSaRRI/AAAAAAAAXO4/743JC7tfxeEgnBJUVbsCvxWlVFnEMRtEwCHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a> <figcaption>下載最後位置</figcaption></figure><p>在Terminal(快速鍵 <code>Ctrl + Alt + t</code>)裡面執行以下指令: </p><pre class="brush: plain;">cd Downloads
sudo tar -zxvf ./hadoop-2.7.4.tar.gz -C /usr/local
cd /usr/local
sudo mv ./hadoop-2.7.4/ ./hadoop
sudo addgroup hadoop
sudo chown -R hduser:hadoop hadoop</pre>這個的作用是把它解壓縮出來,放到<code>/usr/local/hadoop</code>的位置,並且設定執行權限 <figure><a href="https://lh3.googleusercontent.com/-ZKp5Roo5qng/Wj74niNqNAI/AAAAAAAAXO8/HqSjgT_mEk8j-Oc4z5YXxcR1sBYV6JDQACHMYCw/s1600-h/image%255B8%255D"><img width="654" height="366" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-9Bh-Ukb4d7w/Wj74pfbBzBI/AAAAAAAAXPA/_12y2sz_g98P1nkKpIKNMAIiJThZqTPSACHMYCw/image_thumb%255B2%255D?imgmax=800" border="0"></a> <figcaption>解壓縮完成看到hadoop資料夾</figcaption></figure></dd>
<dt> 設定 hadoop/etc/hadoop/core-site.xml </dt>
<dd><p>用Terminal執行:<code>gedit /usr/local/hadoop/etc/hadoop/core-site.xml</code></p><p>在 <code>Configuration</code>裡面輸入: </p><pre class="brush: xml;"><property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property></pre><p>這個是在設定<em><strong>NameNode</strong></em>位置在哪裡 - NameNode之後會介紹,但是基本上就是主控HDFS的Master。 </p><figure><a href="https://lh3.googleusercontent.com/-AWpG-rty1OI/Wj74qs3Zc7I/AAAAAAAAXPE/EhFHm3KeSGwBqSrqCr-HrqGtGlDaK1LrQCHMYCw/s1600-h/image%255B11%255D"><img width="654" height="674" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-mTsXv4QiEj4/Wj74tP5hSaI/AAAAAAAAXPI/hdQmwof_Qf0NExiZ1t6tW9h4aLbEWrqHwCHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a> <figcaption>修改core-site.xml的截圖</figcaption></figure></dd>
<dt> 修改hadoop-env.sh </dt>
<dd><p>這邊要把<code>${JAVA_HOME}</code>的值寫進去(理論上應該不需要才對,因為我們之前有設定參數,但是好像吃不進去,所以要寫死進去) </p><p>在Terminal執行:<code>gedit /usr/local/hadoop/etc/hadoop/hadoop-env.sh</code></p><p>找到:<code>export JAVA_HOME=${JAVA_HOME}</code>然後把它改成<code>export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64</code></p><figure><a href="https://lh3.googleusercontent.com/-9Lq7ai8kwRc/Wj74t2heJsI/AAAAAAAAXPM/1U1JZaaWG8IVqTejPWjgNG4Zo0GjTK7QQCHMYCw/s1600-h/image%255B14%255D"><img width="547" height="400" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-h6_bPa5jOHc/Wj74wR02LaI/AAAAAAAAXPQ/Fa0C2ula1qAnCM0SlU9fM81yqBAwDpthQCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a> <figcaption>修改之後的結果</figcaption></figure></dd>
<dt> 設定hdfs-site.xml </dt>
<dd><p>這邊設定的是: </p><ul><li>每一個在HDFS的檔案要replicate幾份 - 預設都是3</li>
<li>NameNode儲存位置</li>
<li>DataNode儲存位置</li>
</ul><p>在Terminal執行:<code>gedit /usr/local/hadoop/etc/hadoop/hdfs-site.xml</code>,然後在<code>Configuration</code>裡面加入: </p><pre class="brush: xml;"><property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value> file:/usr/local/hadoop/hadoop_data/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value> file:/usr/local/hadoop/hadoop_data/hdfs/datanode</value>
</property</pre><figure><a href="https://lh3.googleusercontent.com/-cA4L9F97mac/Wj74yxoopqI/AAAAAAAAXPU/SP2aJt2wKkIDlMIg0JxzeXi6gASXT0pSACHMYCw/s1600-h/image%255B17%255D"><img width="654" height="737" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Q5uYNvA6XiA/Wj743Ngd-kI/AAAAAAAAXPY/GGZ22S5BedIuuxGb-uvr_Dion3SFZz-_QCHMYCw/image_thumb%255B5%255D?imgmax=800" border="0"></a> <figcaption>修改畫面</figcaption></figure></dd>
<dt> 修改yarn-site.xml </dt>
<dd><p>這邊修改的是yarn的設定,在Terminal執行<code>gedit /usr/local/hadoop/etc/hadoop/yarn-site.xml</code>,在<code>Configuration</code>裡面加入: </p><pre class="brush: xml;"><property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property></pre><p>這邊後面兩個,<code>yarn.nodemanager.resource.cpu-vcores</code> 和 <code>yarn.nodemanager.resource.memory-mb</code> 是設定使用到的資源,如果後面執行不太起來要注意這個值和VM給的資源。 </p><figure><a href="https://lh3.googleusercontent.com/-2PEhHzm6Mr0/Wj745LhaZcI/AAAAAAAAXPc/gG79UvtJrm4Jgo6iErNHMzg3PYXXnk7jQCHMYCw/s1600-h/image%255B20%255D"><img width="654" height="737" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-r9-iQmzKfTE/Wj749UxSt6I/AAAAAAAAXPg/q4ylYnPvC_0Ui5TN2PR7bSMLBkp66ptEQCHMYCw/image_thumb%255B6%255D?imgmax=800" border="0"></a> <figcaption>修改完的畫面</figcaption></figure></dd>
<dt> 修改marped-site.xml </dt>
<dd><p>這個檔案預設不存在,所以要從template把它先復製出來。 </p><p>在Terminal輸入: </p><pre class="brush: plain;">cd /usr/local/hadoop/etc/hadoop
sudo cp mapred-site.xml.template mapred-site.xml
cd ~
sudo gedit /usr/local/hadoop/etc/hadoop/mapred-site.xml</pre><p>打開了之後,把<code>configuration</code>改成: </p><pre class="brush: xml;"><property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property></pre><figure><a href="https://lh3.googleusercontent.com/-opld-kD0iIw/Wj74-ErWZ4I/AAAAAAAAXPk/PvEgkhtVQBM89YE-06j6QMwlqugaFHw-gCHMYCw/s1600-h/image%255B23%255D"><img width="560" height="513" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-8Ai0n4VfG00/Wj75BT67PvI/AAAAAAAAXPo/Jv2PplAcPHY6m_CJtek8qpMkcgHYMjZxgCHMYCw/image_thumb%255B7%255D?imgmax=800" border="0"></a> <figcaption>完成設定</figcaption></figure></dd>
<dt> 建立HDFS用到的目錄 </dt>
<dd> 在Terminal輸入: <pre class="brush: plain;">sudo rm -rf /usr/local/hadoop/hadoop_data/hdfs
mkdir -p /usr/local/hadoop/hadoop_data/hdfs/namenode
mkdir -p /usr/local/hadoop/hadoop_data/hdfs/datanode
sudo chown -R hduser:hduser /usr/local/hadoop</pre><p>這個將會建立hdfs的相關資料夾 </p></dd></dl></section><section><h3 id="WizKMOutline_1514075612638833">測試Hadoop</h3><p>以上就是hadoop的安裝和設定,接下來只需要把它run起來即可。 </p><dl><dt> 格式化HDFS </dt>
<dd> 在Terminal執行: <pre class="brush: plain;">hadoop namenode -format
hadoop datanode -format </pre><div class="bs-callout bs-callout-warning">中間可能會問是否確定繼續執行,記得要輸入<code>yes</code></div></dd>
<dt> 啟動yarn和hdfs </dt>
<dd> 在Terminal輸入: <pre class="brush: plain;">start-yarn.sh
start-dfs.sh</pre><p>這個是在<em>Master上面</em>執行,會自動透過ssh的方式把所有Slave也一起啟動。 </p><div class="bs-callout bs-callout-info">還有兩種啟動方式: <ul><li><code>start-all.sh</code> 和 <code>stop-all.sh</code> - 這個已經被deprecated 不過同等於上面兩個在一起執行</li>
<li><code>hadoop-daemon.sh namenode/datanode</code> 和 <code>yarn-deamon.sh resourcemanager</code> - 這個是手動在<em>各個</em>節點裡面手動啟動對應服務</li>
</ul></div></dd>
<dt> 確認啟動process是否正常 </dt>
<dd><p>在Terminal上面執行:<code>jps</code></p><figure><a href="https://lh3.googleusercontent.com/-DKYiOi2CdwI/Wj75EU8N6JI/AAAAAAAAXP0/pns4S7r4W9U5r-5XYK--2Lm0syBb2AIHACHMYCw/s1600-h/image%255B26%255D"><img width="295" height="132" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-MsAjRD0SKxE/Wj75GK-GO_I/AAAAAAAAXP4/9rebiGU-edc5XU3eXv0BD_PaoW3L_S-MQCHMYCw/image_thumb%255B8%255D?imgmax=800" border="0"></a> <figcaption>檢查執行的服務</figcaption></figure><p>這邊會看到5個服務: </p><ol><li>NameNode</li>
<li>SecondaryNameNode</li>
<li>ResourceManager</li>
<li>NodeManager</li>
<li>DataNode</li>
</ol><div class="bs-callout bs-callout-info">在真的分散式架構,前3個只會在Master出現,後面兩個只會在Slave出現 </div></dd>
<dt> 確認Web UI是否正常 </dt>
<dd><p>服務啟動成功之後可以在Firefox輸入: </p><ul><li><a href="http://localhost:8088">http://localhost:8088</a> - 這個是ResourceManager的web界面</li>
<li><a href="http://localhost:50070">http://localhost:50070</a>- 這個是NameNode的web界面 - 換句話說是hdfs的畫面</li>
</ul><figure><a href="https://lh3.googleusercontent.com/-CxdC5sF6C9M/Wj75HOT5EII/AAAAAAAAXP8/v97Z3G6HdvkJxItq2BajlUucD7nD6HoewCHMYCw/s1600-h/image%255B29%255D"><img width="654" height="332" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-mO-F6d24JFI/Wj75I9T6hcI/AAAAAAAAXQA/M542v0alLegzThHAi8sMYOHxg5XlyOsSgCHMYCw/image_thumb%255B9%255D?imgmax=800" border="0"></a> <figcaption>ResourceManager的畫面</figcaption></figure><figure><a href="https://lh3.googleusercontent.com/-R_tSLQgS1-8/Wj75KtkmNqI/AAAAAAAAXQE/XllmWKDY8B8mZvqQStAwWt9muDHar9jZQCHMYCw/s1600-h/image%255B32%255D"><img width="654" height="412" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-V8RRKiwltlw/Wj75M8wPHaI/AAAAAAAAXQI/yGKXz0CvZbweERnPKDn6aHWEWVNl_kAsACHMYCw/image_thumb%255B10%255D?imgmax=800" border="0"></a> <figcaption>NameNode的畫面</figcaption></figure></dd></dl></section></section><section><h2 id="WizKMOutline_1514075612638738">執行Hadoop的Hello World - WordCount</h2><p>首先先把 <a href="https://1drv.ms/u/s!Am-7OXCiIo1Lh9EaLbZsQyArJyYZ6Q">WordCount2.jar</a>和<a href="https://1drv.ms/t/s!Am-7OXCiIo1Lh9EbxkNiZl1d7ERYtQ">jane_austen.txt</a>下載到<code>Downloads</code>裡面。 </p><figure><a href="https://lh3.googleusercontent.com/-7xSrWxuljkM/Wj75QraE9TI/AAAAAAAAXQM/wa9euY0Zc64aN5fwPS0qEUHgwt2BNUnswCHMYCw/s1600-h/image%255B35%255D"><img width="654" height="256" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-_QdZx02-ay0/Wj75SCA2G7I/AAAAAAAAXQQ/XKePhB7ukD8Hp3WlEEIKmUvM3awhihNVwCHMYCw/image_thumb%255B11%255D?imgmax=800" border="0"></a><br />
<figcaption>下載完的畫面</figcaption></figure><p>把檔案複製到 hadoop的HDFS裡面,在Terminal輸入: </p><pre class="brush: plain;">cd ~/Downloads
hadoop fs -mkdir -p /user/hduser/input
hadoop fs -copyFromLocal jane_austen.txt /user/hduser/input</pre><div class="bs-callout bs-callout-info">可以用<code>hadoop fs -ls /user/hduser/inpu</code>檢查複製進去的檔案。 </div><p>執行WordCount的程式,<code>hadoop jar wordcount2.jar WordCount /user/hduser/input/jane_austen.txt /user/hduser/output</code></p><figure><a href="https://lh3.googleusercontent.com/-T2PAMILtwSU/Wj75T-Gw2bI/AAAAAAAAXQU/i1hd2owz9HcRqJhHHn5cwxR_doTQXDQhACHMYCw/s1600-h/image%255B38%255D"><img width="654" height="138" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-mvqjWNcap0c/Wj75VWGWbPI/AAAAAAAAXQY/TeGINEkgheUjQyjL45l6QseCB5u6-tncgCHMYCw/image_thumb%255B12%255D?imgmax=800" border="0"></a><br />
<figcaption>執行WordCount</figcaption></figure><p>檢查執行結果:<code>hadoop fs -cat /user/hduser/output/part-r-00000</code></p><figure><a href="https://lh3.googleusercontent.com/-_QFg6YIxN2A/Wj75WHNveAI/AAAAAAAAXQc/isF8Pa2HIdI2UXqH5xhJBXz1IRGfuVVsQCHMYCw/s1600-h/image%255B41%255D"><img width="654" height="296" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-5638G93kYGU/Wj75W0F49AI/AAAAAAAAXQg/-SuCUBjT7DQBVNsOHsskd8r-RMifnr1-QCHMYCw/image_thumb%255B13%255D?imgmax=800" border="0"></a><br />
<figcaption>看到最後計算結果</figcaption></figure><div class="bs-callout bs-callout-warning">如果要在執行一次計算,需要先把hdfs裡面的output<em>砍掉</em>,要不然會執行不了。指令是:<code>hadoop fs -rm -r /user/hduser/output</code></div><div class="bs-callout bs-callout-warning">如果執行有問題,或者run不起來,可以試試重開機,然後從<em>測試Hadoop</em>裡面的<em>格式化HDFS</em>開始重新做一次。 </div></section><section><h2 id="WizKMOutline_1514075612638726">結語</h2><p>在這篇把整個Hadoop建立完成,並且執行了一個map reduce的word count程式計算出pride and prejudice前3章的字數計算。 </p><p>在這篇建立出來的hadoop是所謂的<em><strong>pseudo-distributed mode</strong></em>,換句話說Master和Slave在<em><strong>同一台機器</strong></em>,但是實際運作上會有Master對上多個Slave。 </p><p>不過在進入這種分散式模式之前,需要在了解一些hadoop細節。 </p><p>在下一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-07-deeper-look-at-yarn-and-hdfs-in-hadoop.html">[07]更深入看看Hadoop裡面的YARN和HDFS</a>),將會在針對hadoop裡面的分散式模式在做更詳細一點介紹,包含yarn和hdfs裡面對應的process。 </p></section><section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:72592fa7-81a9-47e5-b1d2-ba2f92822336" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a>,<a href="http://blog.alantsai.net/search/label/hadoop" rel="tag">hadoop</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-83847314212366373172017-12-23T19:24:00.000+08:002017-12-24T08:56:53.646+08:00[Data Science 到底是什麼從一個完全外行角度來看][05]建立Hadoop環境 -上篇<section><figure><a href="https://lh3.googleusercontent.com/-TVWd5UeyrC8/Wj47ExLZKvI/AAAAAAAAXMg/jRP-EzPHFesU9CLaix1S4YpkH6n8L7nnQCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-O5olxioUCso/Wj47GSDDRiI/AAAAAAAAXMk/q-uftf2XjOE69vD6ZXJAxUmUcwVaGachwCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption><span>圖片來源:<a href="https://pixabay.com/en/books-spine-colors-pastel-1099067/">https://pixabay.com/en/books-spine-colors-pastel-1099067/</a> 和 <a href="https://pixabay.com/en/math-blackboard-education-classroom-1547018/">https://pixabay.com/en/math-blackboard-education-classroom-1547018/</a></span></figcaption><br />
</figure></section><section><p>上一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-04-hadoop-intro.html">[04]Hadoop是什麼?</a>)以一個非常高的overview看了Hadoop是什麼,在接下來將會把理論轉成實際操作,將建立一個Ubuntu 的 VM上面架設hadoop並且跑一個MapReduce的hello world程式,WordCount(算字數)。</p><p>等到跑完範例之後,將會在深入一點看hadoop的MapReduce和HDFS運作模式。 </p><p>首先,從建立環境開始。 </p></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514026901216988" ;="">環境準備</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514026901223166" ;="">建立Hadoop測試環境</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514026901223379" ;="">安裝Ubuntu VM</a><br />
</li>
<li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514026901223970" ;="">設定Ubuntu環境</a><br />
</li>
</ul><li><a style="line-height: 1.6; font-size: 15px;" href="#WizKMOutline_1514026901223140" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a> <section><h2 id="WizKMOutline_1514026901216988">環境準備</h2><p>整個操作會是在VM(虛擬機器)上面執行,並且因為Hadoop在linux世界比在Windows來的穩定,因此,會建立一個Ubuntu的環境,並且把Hadoop架設在裡面。 </p><p>在接下來的lab將會用到以下幾個軟體/環境: </p><dl><dt> 主機環境 </dt>
<dd> 接下來使用到的機器規格如下: <ul><li>OS - Windows 10 1703</li>
<li>CPU - i7-6500U 雙核</li>
<li>Memory - 16GB</li>
</ul></dd>
<dt> VMWare Player 14 </dt>
<dd><p>任何虛擬機器軟體都可以,只是剛好用的是VMWare Player 14。 </p><ul><li><a href="https://my.vmware.com/en/web/vmware/free#desktop_end_user_computing/vmware_workstation_player/14_0|PLAYER-1410|product_downloads">下載頁面</a></li>
<li>檔案大小約 90MB </li>
</ul></dd>
<dt> Ubuntu 16.04.3 </dt>
<dd><p>其他版本的Ubuntu也沒問題 - 如果用的是Ubuntu 14,那麼只有等一下安裝openjdk的部分會有問題,其他都一樣。 </p><ul><li><a href="https://www.ubuntu.com/download/desktop">下載頁面</a></li>
<li><a href="https://www.ubuntu.com/download/desktop/thank-you?version=16.04.3&architecture=amd64">直接下載(約1.4GB)</a></li>
</ul></dd>
<dt> Hadoop v2.7.4 </dt>
<dd><p>基本上 v2.x 的都沒有問題,只是剛好手上有2.7.4所以沒有在下載新的。如果是v3.0那麼設定會不同 </p><ul><li><a href="http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz">下載頁面</a></li>
<li><a href="http://apache.stu.edu.tw/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz">直接下載(約254 MB)</a></li>
</ul></dd>
<dt> MapReduce的Hello World程式 - WordCount </dt>
<dd><p>這個是用來測試map reduce的hello world程式: </p><ul><li><a href="https://1drv.ms/u/s!Am-7OXCiIo1Lh9EaLbZsQyArJyYZ6Q">WordCount2.jar</a></li>
<li><a href="https://1drv.ms/t/s!Am-7OXCiIo1Lh9EbxkNiZl1d7ERYtQ">jane_austen.txt</a> - pride and prejudice 前三章 - 測試算字數用</li>
</ul></dd></dl><p>以上就是整個會用到的程式和環境,接下來就來看看如何建立hadoop環境。 </p></section><section><h2 id="WizKMOutline_1514026901223166">建立Hadoop測試環境</h2><p>基本上整個的環境建立大概可以分幾個部分: </p><ol><li>安裝Ubuntu VM</li>
<li>設定Ubuntu環境</li>
<li>安裝和設定Hadoop</li>
<li>測試Hadoop</li>
</ol><div class="bs-callout bs-callout-info">由於截圖比較多,所以這篇會先介紹<em>第一步和第二部</em>的部分,hadoop安裝和測試將會在下一篇做介紹 </div><section><h3 id="WizKMOutline_1514026901223379">安裝Ubuntu VM</h3><p>首先先把VMWare Player安裝起來(<a href="https://my.vmware.com/en/web/vmware/free#desktop_end_user_computing/vmware_workstation_player/14_0|PLAYER-1410|product_downloads">下載頁面</a>) </p><p>把VMWare Player執行起來,先建立VM: </p><figure><a href="https://lh3.googleusercontent.com/-75cWRoboxMU/Wj47HWFFhBI/AAAAAAAAXMo/c2pHdFg7F3k0UCcmXNzN4pJ68mnckJpQQCHMYCw/s1600-h/image%255B5%255D"><img width="654" height="253" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Q2-0ISv842k/Wj47IAI7DbI/AAAAAAAAXMs/YfPdr1VhfGcNgYSQBfpv-FPuL-6T_XNOACHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a><br />
<figcaption>建立VM</figcaption></figure><p>選擇下載的Ubuntu iso檔案位置(<a href="https://www.ubuntu.com/download/desktop/thank-you?version=16.04.3&architecture=amd64">直接下載</a>) </p><figure><a href="https://lh3.googleusercontent.com/-0EGERhxXBF4/Wj47JC6gtsI/AAAAAAAAXMw/33_54YZ54koP-g9NoA5VI1IdewbiMvpjACHMYCw/s1600-h/image%255B8%255D"><img width="645" height="638" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-xZz65gua1XE/Wj47K1mgz0I/AAAAAAAAXM0/Nc7P0O_0vaA-HlAAwD02r47x20DWl8EKQCHMYCw/image_thumb%255B2%255D?imgmax=800" border="0"></a><br />
<figcaption>選擇iso檔案的路徑</figcaption></figure><p>設定帳號的部分,建議設定<code>hduser</code>,如果設定不同,在下面的修改需要作出對應修改。 </p><figure><a href="https://lh3.googleusercontent.com/-yoCvFbfeMbE/Wj47LztRqtI/AAAAAAAAXM4/HtZQXE7HyFsPAvCSwdB6Mz5uEJKbikKpgCHMYCw/s1600-h/image%255B11%255D"><img width="645" height="638" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-Z5gJ8Rkxu0c/Wj47NQCq6NI/AAAAAAAAXM8/ekowg3AFz68M0aztYSlWBJoobsJHp7zOgCHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a><br />
<figcaption>帳號設定畫面</figcaption></figure><p>機器的名稱和儲存位置就隨意,只要可以識別即可 </p><figure><a href="https://lh3.googleusercontent.com/-Dtd3sJf9FbE/Wj47O5FadZI/AAAAAAAAXNA/9vcPTTm2Arc5qMRXBOyHjVrxkTGuEyuoQCHMYCw/s1600-h/image%255B14%255D"><img width="645" height="638" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-qkz7kk0My_E/Wj47QdI_CQI/AAAAAAAAXNE/m1DTjS5_eBwTCUNcwVKUBAAnIW_sTMdigCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a><br />
<figcaption>VM名稱</figcaption></figure><p>VM硬碟的部分,20GB不用動,下面那個選項建議改成<code>第一個選項</code>,原因是之後要複製比較方便。 </p><figure><a href="https://lh3.googleusercontent.com/-m8nx_bLBxw8/Wj47Sr054xI/AAAAAAAAXNI/lSg3ZF8qkvE88sOyYDWBmdxn6fF2yvJ4ACHMYCw/s1600-h/image%255B17%255D"><img width="645" height="638" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-h6n7HUde7iU/Wj47UXUaSdI/AAAAAAAAXNM/6MwsPUp_EBcbkjVyb_VYvGRAe1JA9RabgCHMYCw/image_thumb%255B5%255D?imgmax=800" border="0"></a><br />
<figcaption>設定硬碟</figcaption></figure><p>設定CPU和memory的部分需要透過: </p><ol><li>選擇 <kbd>Customize Hardware</kbd></li>
<li>選擇 Memory</li>
<li>最好至少要有<em>2048MB</em></li>
<li>按下<kbd>close</kbd>即可,修改就會儲存</li>
</ol><div class="bs-callout bs-callout-info">最好 CPU 能夠給到 <em>2+</em>,Memory最好可以到<em>4096 MB+</em> - 後面執行比較不會有問題(要不然需要在手動調整一些使用資源避免執行不起來)。 </div><figure><a href="https://lh3.googleusercontent.com/--4-cvhsK6rI/Wj47VLHu9KI/AAAAAAAAXNQ/KvIs4EXS0qUki6xefH7OPIX2o1KEsWeLgCHMYCw/s1600-h/image%255B20%255D"><img width="654" height="356" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-PwCcDnX9Zms/Wj47XTCZ_NI/AAAAAAAAXNU/xznldCtuJ0o2gHR2Whj0uQLJ7HqWMUD-wCHMYCw/image_thumb%255B6%255D?imgmax=800" border="0"></a><br />
<figcaption>設定資源</figcaption></figure><p>接下來VMWare Player會自動安裝,如果有出現要不要安裝 <code>VMWare Tool for linux</code>,建議裝 </p><figure><a href="https://lh3.googleusercontent.com/-X9TtiV6yT9M/Wj47ajXpjNI/AAAAAAAAXNY/-jb1D2CY7zA8WYB-kmyYBa505FuZFeGyACHMYCw/s1600-h/image%255B23%255D"><img width="654" height="423" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-sBkUOrlrcbY/Wj47cPAXSiI/AAAAAAAAXNc/iXLkZm_yIBMk5hiYGuwPx2b6jX5widY7ACHMYCw/image_thumb%255B7%255D?imgmax=800" border="0"></a><br />
<figcaption>安裝畫面</figcaption></figure><p>最後,安裝好之後,出現的就是登入畫面,直接輸入當初設定的密碼即可。 </p><figure><a href="https://lh3.googleusercontent.com/-oF8DiaFS-Eo/Wj47dVKNw8I/AAAAAAAAXNg/GmXeWgWmdQEv2Q-XgN2QnGSw0-aqeLvuwCHMYCw/s1600-h/image%255B26%255D"><img width="654" height="633" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-h-sneWfTxBs/Wj47kclPNxI/AAAAAAAAXNk/zeWkf9Gu2401zxbJuhgzeStM6At2R8vWQCHMYCw/image_thumb%255B8%255D?imgmax=800" border="0"></a><br />
<figcaption>登入系統</figcaption></figure></section><section><h3 id="WizKMOutline_1514026901223970">設定Ubuntu環境</h3><p>Hadoop是java的程式,因此需要先安裝Java - 正常來說Java 7就夠了,不過這邊會裝Java 8。 </p><p>再來,要設定一些環境參數讓後面用到。 </p><p>最後,會需要安裝ssh,因為啟動服務的時候會用ssh來溝通避免需要一台一台去啟動服務。 </p><dl><dt> 開啟Terminal </dt>
<dd> 登入Ubuntu之後,開啟Terminal(快速鍵 <kbd>Ctrl + Alt + t</kbd>)。基本上後面會一直用到,所以記得這個快速鍵 </dd>
<dt> 更新package </dt>
<dd><p>先更新目前package的情況,使用指令:<code>sudo apt-get update</code></p><figure><a href="https://lh3.googleusercontent.com/-4LD_udQ0wSY/Wj47lAbgXZI/AAAAAAAAXNo/Lf7CcfHgjyMKgQiJXplKJpkCM6UnsXLGACHMYCw/s1600-h/image%255B29%255D"><img width="654" height="358" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-MuP_0g8bwlE/Wj47mHMZU9I/AAAAAAAAXNw/TbfUcVXE8fYRDq4K6q6Xm4GOM_7jQKYkQCHMYCw/image_thumb%255B9%255D?imgmax=800" border="0"></a> <figcaption>update畫面</figcaption></figure></dd>
<dt> 安裝Java 8 </dt>
<dd> 在terminal執行:<code>sudo apt-get install openjdk-8-jre openjdk-8-jdk</code><figure><a href="https://lh3.googleusercontent.com/-1tuKsdQ4n24/Wj47pMPqG1I/AAAAAAAAXN0/ivqNko7vUpkRHzDbCjkbXq_JcitZ0W-6wCHMYCw/s1600-h/image%255B32%255D"><img width="654" height="478" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-9yz_SaQuF24/Wj47qPmvs0I/AAAAAAAAXN4/J-w2wsaxFZ8Yjf5a8alvZ8LMIMtuOCffwCHMYCw/image_thumb%255B10%255D?imgmax=800" border="0"></a> <figcaption>中間有需要<em>輸入 y</em> 才會繼續執行</figcaption></figure></dd>
<dt> 設定環境參數 </dt>
<dd><p>現在terminal執行:<code>gedit ~/.bashrc</code>,然後在檔案最後面加上: </p><pre class="brush: plain;">export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH</pre><figure><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh4NiKLgahpqn1Xl-A0x04u1890Bbo4Eid41D6SNU4L_RaSdWg214bxr9myHZxT1CGnTMh0K-zhJ5ueVK2RzjE1FjXN6OWpWDUjD81qIMy7L53J6SnUI_Ii9ueG4ysQhkPWChHAiaAZ6gZ/s1600-h/image%255B35%255D"><img width="654" height="266" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-dtDvF7RBUZk/Wj47sBGgXtI/AAAAAAAAXOA/Lp4SRsLK9jonw5O5AA3FHZAop6TWb1LdgCHMYCw/image_thumb%255B11%255D?imgmax=800" border="0"></a> <figcaption>設定畫面</figcaption></figure><p>最後確認一下參數有沒有進入: </p><pre class="brush: plain;">source ~/.bashrc
echo $JAVA_HOME
java -version</pre><figure><a href="https://lh3.googleusercontent.com/-zKIBTxFQhPU/Wj47tsDDFlI/AAAAAAAAXOE/WiK62Y1hFU0wV_jmWwyU1CYLDbPI40EHACHMYCw/s1600-h/image%255B38%255D"><img width="654" height="302" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-knTT1p4jxxw/Wj47vc3jjkI/AAAAAAAAXOI/pE0KOx1h-G8P1lcjUQNj-uJJEqA1EFpVgCHMYCw/image_thumb%255B12%255D?imgmax=800" border="0"></a> <figcaption>參數確認,並且java版本是1.8</figcaption></figure></dd>
<dt> 安裝ssh server </dt>
<dd><p>為了能夠讓master和多個slave溝通,需要安裝ssh,再來設定ssh的key: </p><pre class="brush: plain;">sudo apt-get install openssh-server
cd ~/.ssh/
su - hduser
ssh-keygen -t rsa</pre><p>在產生key的部分,正常是<em>要設定一個密碼</em>比較安全,不過這個是測試用,所以就<kbd>enter</kbd>3次下去即可 </p><figure><a href="https://lh3.googleusercontent.com/-mM2yCusWHmI/Wj47wwyJZVI/AAAAAAAAXOM/twIlhAWJhCALkohOO00ccXu2vxdDNwZKQCHMYCw/s1600-h/image%255B41%255D"><img width="616" height="466" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-MymcFcUVA4A/Wj47yltrrAI/AAAAAAAAXOQ/5YYUqrxCeXgr_RbebTKCuggWiT4TsNUGQCHMYCw/image_thumb%255B13%255D?imgmax=800" border="0"></a> <figcaption>產生key的畫面</figcaption></figure><p>key產生了之後,要把它寫出來並且測試ssh是否正常: </p><pre class="brush: plain;">cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
ssh localhost
exit</pre><figure><a href="https://lh3.googleusercontent.com/-Oc8FBVwDCWA/Wj47zQaBuMI/AAAAAAAAXOU/8SdXx91YWMI-T8J1oiNaqF3zf3JrYAXhwCHMYCw/s1600-h/image%255B44%255D"><img width="654" height="707" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-rMUL4FRCRuo/Wj471a44yXI/AAAAAAAAXOY/ZcuUlUE0udMOjlY2Xt7h14hXee8_4_ohgCHMYCw/image_thumb%255B14%255D?imgmax=800" border="0"></a> <figcaption>測試和退出的畫面</figcaption></figure></dd></dl></section></section><section><h2 id="WizKMOutline_1514026901223140">結語</h2><p>這篇介紹了建制測試環境的一些設定,由於圖片比較多因此把後半段hadoop的安裝/設定和測試放在下一篇。 </p><p>在下一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-06-install-and-test-hadoop-part2.html">[06]建立Hadoop環境 -下篇</a>)將會接著這篇目前VM的情況,並且把整個hadoop建制完成。 </p></section><section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:12724c2f-cead-45ab-b1df-e8a3374543de" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a>,<a href="http://blog.alantsai.net/search/label/hadoop" rel="tag">hadoop</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-26764679437086584792017-12-22T22:30:00.000+08:002017-12-23T19:25:20.087+08:00[Data Science 到底是什麼從一個完全外行角度來看][04]Hadoop是什麼?<section><figure><a href="https://lh3.googleusercontent.com/-JvGVjQKkStM/Wj0WEEvnw8I/AAAAAAAAXLc/7IY0rL8Ds2ABhQJndi3E0rjnJtdAD_L9gCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-6THpWWNF8-0/Wj0WFTR6qyI/AAAAAAAAXLg/IQALieVFoy8aUN26p3Y7uR0Cnn-i9QnsQCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption>圖片來源:https://pixabay.com/en/books-spine-colors-pastel-1099067/ 和 https://pixabay.com/en/math-blackboard-education-classroom-1547018/</figcaption><br />
</figure></section><section><p>在上一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-03-big-data-intro.html">[03]Big Data到底是有多Big?</a>)了解到了Big Data的3個V,也就是量、增長速度和多元格式的挑戰,這篇來看看讓管理一切變得有可能的軟體:Hadoop。 </p><p>這篇將介紹Hadoop的由來,為什麼這麼重要,不同版本之間的差異,和基本架構。 </p></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6;" href="#WizKMOutline_1513952426247202" ;="">Hadoop的歷史</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513952426248502" ;="">Hadoop的特色</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513952426249243" ;="">Hadoop的版本</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6;" href="#WizKMOutline_1513952426249384" ;="">0.x 和 1.x 版本</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513952426249870" ;="">2.x版本</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513952426249442" ;="">3.x版本</a><br />
</li>
</ul><li><a style="line-height: 1.6;" href="#WizKMOutline_1513952426250703" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a> <section><h2 id="WizKMOutline_1513952426247202">Hadoop的歷史</h2><figure><figcaption><a href="https://lh3.googleusercontent.com/-g0RN6sBPOmI/Wj0WHZbvuPI/AAAAAAAAXLk/bTp4g-IHQd8FaDlFfQ20jS3vFI3knIIcgCHMYCw/s1600-h/image%255B5%255D"><img width="654" height="248" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-XpiqUzK3B7U/Wj0WJeNEh7I/AAAAAAAAXLo/66uFmJ_HtqUDs_wRLGWNA4ZnYA0y-AT6gCHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a><br />
hadoop的logo - 黃色大象</figcaption></figure><p>相信對於Hadoop這個詞應該不會陌生,畢竟Hadoop不算是新的東西,自2006誕生以來已經有11年的時間,因為Big Data的關係,多多少少都會提到它。 </p><p>Hadoop的誕生是因為Google release了一份paper,裡面描述了Google內部的<em>MapReduce</em>(運算)和<em>Google File System</em>(儲存)的運作概念,然後由<em>Doug Cutting</em>用Java把它實作出來,並且用他兒子的 黃色大象玩具的名字命名,因此Hadoop就誕生了。 </p></section><section><h2 id="WizKMOutline_1513952426248502">Hadoop的特色</h2><p>基本上,Hadoop提供了一個用串聯<em>一般</em>電腦來達到處理Big Data所需要的<em>儲存</em>和<em>運算</em>。 </p><p>這邊,<em><strong>一般電腦</strong></em>非常重要,因為意味著<em>不需要</em>超級電腦就可以裝。一般來說,Scale up(把單一硬體加大)永遠是比Scale Out(平行擴展多台串聯)還要來的貴很多。 </p><p>因此,當提到Big Data的時候,都會提到Hadoop,因為Hadoop讓儲存大資料量和運算大資料量變得親民。 </p><p>Hadoop,有兩個重要的核心: </p><ol><li>Hadoop Distributed File System(HDFS) - 分散式儲存資料</li>
<li>MapReduce - 分散式運算</li>
</ol></section><section><h2 id="WizKMOutline_1513952426249243">Hadoop的版本</h2><p>基本上Hadoop有3個版本: </p><ol><li>0.x 和1.x 版本 - 基本上應該沒人再用了</li>
<li>2.x 版本</li>
<li>3.x 版本</li>
</ol><p>除了大版號的差異之外,小版本之間也是有在maintain,下面可以看到光2.x版本就有4個不同branch。 </p><figure><a href="https://lh3.googleusercontent.com/-zKT6Xm9aQwc/Wj0WKc5-z2I/AAAAAAAAXLs/SGKgXknExwsPrrhH1OfSs6_bn-oMDOaewCHMYCw/s1600-h/image%255B8%255D"><img width="654" height="392" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-GULdInUTCws/Wj0WM30dcII/AAAAAAAAXLw/P5qzY4rhYx4DcW72tw2x-l13bp4u_Pg8gCHMYCw/image_thumb%255B2%255D?imgmax=800" border="0"></a><br />
<figcaption>目前有在maintain的版本</figcaption></figure><section><h3 id="WizKMOutline_1513952426249384">0.x 和 1.x 版本</h3><p>最早出來的版本基本結構如下: </p><figure><a href="https://lh3.googleusercontent.com/-nHcBOfmPH9o/Wj0WOaS7P7I/AAAAAAAAXL0/Wt7ufLdqzUwKRbg1U2WHPlhGPNcYHUrZwCHMYCw/s1600-h/image%255B11%255D"><img width="260" height="294" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-LQkTSRuKOUc/Wj0WQLMa5qI/AAAAAAAAXL4/1fB59oHxpMYAF-j1RCvjI81NT1Al6yAGwCHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a><br />
<figcaption>0.x和1.x版本的架構</figcaption></figure><p>可以看到,當初只有兩個最重要的核心: </p><ol><li>HDFS</li>
<li>MapReduce</li>
</ol><p>其他第三方的應用,例如HIVE(hadoop上面的SQL)則需要<em>自己處理</em>和底層Hadoop的溝通。換句話說,假設別的套件之間要溝通,基本上做不到,或者要花很多工,因為兩者之間<em>沒有一個共通的頻道</em>。 </p><p>還有另外一個問題是,Hadoop屬於一個Master多個Slave的架構,換句話說,當Master掛掉了,整個就掛掉了,因此有<em>Single Point Of Failure</em>的問題。 </p><p>因此2.x出現了。 </p></section><section><h3 id="WizKMOutline_1513952426249870">2.x版本</h3><p>因為互相之間溝通困難的問題,因此在2.x版本多出了所謂的<strong><em>Yet Antoher Resource Manager (YARN)</em></strong></p><p>因此架構變成了: </p><figure><a href="https://lh3.googleusercontent.com/-ef-HQcFkX10/Wj0WRG2aYvI/AAAAAAAAXL8/AyxKfsokDrYp8iFZSlwQ2vHF-bCiQlCPwCHMYCw/s1600-h/image%255B14%255D"><img width="328" height="427" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-3fET3TdVTZ4/Wj0WS5brwII/AAAAAAAAXMA/9L0Oi5WSxuMrBnYaU9O1ujViXOz4VVFLgCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a><br />
<figcaption>2.x的架構</figcaption></figure><p>在2.x之後,可以看到,MapReduce不直接架在HDFS上面,而是在YARN的上面,其他的軟體例如HIVE也是在YARN上面,這個時候如果兩邊需要溝通,YARN提供這個渠道。 </p><p>在2.x也增加了所謂的Hig Availability和Federation的模式,避免第一版的single failure的問題。 </p></section><section><h3 id="WizKMOutline_1513952426249442">3.x版本</h3><p>3.x版本最近剛剛正式版release(2017/12/13),因此屬於非常新的版本。 </p><p>這個版本要求JDK版本一定要在8以上,並且YARN和HDFS的部分都有做出了改變,例如本來HDFS預設會儲存3份提供可靠的Storage,這個已經改成了另外一種模式稱為Erasure Coding不止可以維持本來的容錯機制,並且需要的空間更少。 </p><div class="bs-callout bs-callout-info">這個部分了解的不算太多,在接下來的操作也會主要focus在2.x版本,因此有興趣可以去官網看到最新的調整。 </div></section></section><section><h2 id="WizKMOutline_1513952426250703">結語</h2><p>在這篇,用一個overview的方式快速介紹了Hadoop,了解了幾個重要的元素和Hadoop的幾個特色。 </p><p>在下一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-05-install-and-test-hadoop-part1.html">[05]建立Hadoop環境 -上篇</a>)要進入動手的階段(終於不是只有理論了),將會建立Ubuntu的VM並且把Hadoop架設起來,了解如何快速測試玩玩看Hadoop。 </p></section><section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:e4e6902a-ee32-4841-b32a-5d6811c7c272" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-4916639079138288782017-12-21T22:52:00.001+08:002017-12-22T22:37:41.012+08:00[Data Science 到底是什麼從一個完全外行角度來看][03]Big Data到底是有多Big?<section><figure><a href="https://lh3.googleusercontent.com/-pYlP49Q-jHM/WjvJRsktg6I/AAAAAAAAXKg/ScvJthAijqQ6lTX_tCbBWutFajCvEL5wwCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-UU-bChrb_PU/WjvJV4Oy9KI/AAAAAAAAXKk/eZ5rm5mS2rUneUhCWkSlR2jJ9rJ742aFQCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption>圖片來源:https://pixabay.com/en/books-spine-colors-pastel-1099067/ 和 https://pixabay.com/en/math-blackboard-education-classroom-1547018/</figcaption><br />
</figure></section><section><p>在上一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-02-what-is-data-science--what-skill-is-needed-and-what-do-they-do.html">[02]Data Science 是什麼?</a>)了解了整個Data Science包含的內容,這篇將會看看源頭,Data本身。 </p><p>這篇先了解到什麼是Big Data?有什麼特性?到底是有多Big? </p></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6;" href="#WizKMOutline_1513867192078132" ;="">什麼是Big Data</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513867192078510" ;="">3V 之 Volume - 量</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513867192078556" ;="">3V 之 Velocity - 增長速度</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513867192078611" ;="">3V 只 Variety - 資料的多元性</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513867192078260" ;="">Big Data帶來的挑戰</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513867192078291" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a><section><h2 id="WizKMOutline_1513867192078132">什麼是Big Data</h2><p>目前階段在介紹整個Data Scientist日常的中心,Big Data </p><figure><a href="https://lh3.googleusercontent.com/-lUHh6v2CXtc/WjvJXymrPtI/AAAAAAAAXKo/JD3DzBzSg3cuzim0x6dnvkVaMPxUBxNgQCHMYCw/s1600-h/image%255B6%255D"><img width="545" height="530" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-aN7ZfkASXVM/WjvJaJ4aXXI/AAAAAAAAXKs/H_uXod8yLqUX90_WdEtCBSVz0GE0WoFJgCHMYCw/image_thumb%255B2%255D?imgmax=800" border="0"></a><br />
<figcaption>Big Data的處理</figcaption></figure><p>Big Data 在台灣翻譯成為 <em>巨量資料</em>,但是因為中國那邊反而實際用的比較多,因此<em>大數據</em>反而是比較耳熟能詳的詞。 </p><p>Big Data其實是個相對詞,對於我們來說是「Big」Data,可能兩年後只是幾天的量而已,事實上,從數據<em><strong>產生</strong></em>出到2003年的<em><strong>資料綜合</strong></em> = 我們<em><strong>2天</strong></em>的產生量而已; </p><p>IDC更研究指出,現今<em><strong>90%</strong></em>的資料,都是這<em><strong>2年</strong></em>產生出來。 </p><p>這個資料量非常的恐怖,更別說我們還沒完全進入全IoT(Internet Of Things 物聯網)時代,如果到了那個時候估計光每一秒說不定都是現在1天的綜合(這個是個人亂猜,不過估計不久將來應該很快會發生)。 </p><p>所以Big Data是一個相對詞,不過當描述Big Data的時候,一般來說會有3個特性,因為都是英文字母V開頭,因此也稱為<em><strong>3V</strong></em>: </p><ol><li>Volume</li>
<li>Velocity</li>
<li>Variety</li>
</ol><figure><figcaption><img alt="Big Data - What is Big Data - 3 Vs of Big Data - Volume, Velocity and Variety - Day 2 of 21 3vs " src="https://blog.sqlauthority.com/i/b/3vs.png"><br />
3V的含義,資料來源:https://blog.sqlauthority.com/2013/10/02/big-data-what-is-big-data-3-vs-of-big-data-volume-velocity-and-variety-day-2-of-21/</figcaption></figure></section><section><h2 id="WizKMOutline_1513867192078510">3V 之 Volume - 量</h2><p>Big Data的其中一個特性就是量很大,因此3V裡面的Volume指的就是產生的量。 </p><p>既然提到量,那麼就要提到儲存量的單位: </p><figure><a href="https://lh3.googleusercontent.com/-fkmYo8g6a4o/WjvJbl6z0OI/AAAAAAAAXKw/Gikgq_rF3jEuzwQO5rLJ3VtNtIaJBOdvwCHMYCw/s1600-h/image%255B14%255D"><img width="204" height="370" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-J6c2vITOiv0/WjvJdGW9lSI/AAAAAAAAXK0/GlgUovxruvkj5UghtRB7EWlW_z8vO28gQCHMYCw/image_thumb%255B6%255D?imgmax=800" border="0"></a><br />
<figcaption>換句話說,1 ZB = 10^21 Byte。來源:https://en.wikipedia.org/wiki/Zettabyte</figcaption></figure><p>了解了單位,來看看每天產生的量: </p><figure><a href="https://lh3.googleusercontent.com/-ntlA1eXpuow/WjvJeiNEw6I/AAAAAAAAXK4/fE0z_d3PQ2Yk6bgYbd1UF0STSp2eqxPDgCHMYCw/s1600-h/image%255B19%255D"><img width="654" height="652" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-YQIiLjrUo_w/WjvJhVVunxI/AAAAAAAAXK8/vxNhLQdkwfcbIxix45EIRzXB2gC0qM1uQCHMYCw/image_thumb%255B9%255D?imgmax=800" border="0"></a><br />
<figcaption>可以看到光2002年的每秒產量就和1992年的每天一樣,來源:http://www.vcloudnews.com/every-day-big-data-statistics-2-5-quintillion-bytes-of-data-created-daily/</figcaption></figure><p>這個量非常恐怖,那麼,如果我們說Big Data到底在說什麼等級呢? </p><p>基本上,當國外在說Big Data分析的時候,一般來說講的都是<em><strong>PB</strong></em>等級。 </p><p>大家可以想象一下,要能夠儲存PB並且做運算的電腦要多高級? </p></section><section><h2 id="WizKMOutline_1513867192078556">3V 之 Velocity - 增長速度</h2><p>Velocity指的是量的增長速度。從本來批次的增加,到最後的及時增加。 </p><figure><a href="https://lh3.googleusercontent.com/-lwDssrilaLs/WjvJjtFRWmI/AAAAAAAAXLA/ZYWu6LiY8EQl6AjnT4WzUZ9FTPnEuw_agCHMYCw/s1600-h/image%255B24%255D"><img width="654" height="440" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-ZkGFBaE96eM/WjvJlXpY16I/AAAAAAAAXLE/u90uKWhXeBcc8F_ca0hy27qDBcENdeWDgCHMYCw/image_thumb%255B12%255D?imgmax=800" border="0"></a><br />
<figcaption>可以看到,每分鐘會有72小時影片上傳到Youtube:來源:http://www.vcloudnews.com/every-day-big-data-statistics-2-5-quintillion-bytes-of-data-created-daily/</figcaption></figure><p>當IoT完全進入的時候,資料增長一定會是Real Time。 </p></section><section><h2 id="WizKMOutline_1513867192078611">3V 只 Variety - 資料的多元性</h2><p>資料不再是像關聯性資料庫這種結構性資料(Structure Data),其他非結構性(Unstructure Data)資料 - 例如影片,相片等等。 </p><p>這種不同類型的資料讓處理起來也變得更加複雜。 </p></section><section><h2 id="WizKMOutline_1513867192078260">Big Data帶來的挑戰</h2><p>可以看到,Big Data不僅代表資料量很大,增長速度很快並且資料結構非常多元,那這些資料到底如何儲存和運算呢? </p><p>把硬體一直加大(Scale Up)所損耗的錢是倍數成長,因此更好的情況是平行擴展(Scale out)的方式。因此<em>Hadoop</em>的誕生讓一切變得有可能。 </p><p>Hadoop做到讓<em>一般性電腦</em>能夠透過<em>連在一起</em>的方式達到儲存大量資料,並且平行運算。舉例來說,如果我要儲存1TB的資料,但是我沒有TB硬碟,那麼可以透過2個500GB的硬碟把那1TB的資料儲存在Hadoop的HDFS。 </p><p>因此Hadoop把處理Big Data變得可行。 </p></section><section><h2 id="WizKMOutline_1513867192078291">結語</h2><p>在這篇介紹了Big Data的基本特性,和所謂的3V。 </p><p>了解了Big Data的狀況之後,會發現到面臨的挑戰是,要儲存和計算這麼大量的資料靠一台超級電腦根本不可能,因此Hadoop的誕生導致了使用Big Data變得可能。 </p><p>在下一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-04-hadoop-intro.html">[04]Hadoop是什麼?</a>),將會介紹讓Big Data處理變得可能,Hadoop。 </p></section><section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:00a02f0c-6696-4d22-b80e-e9b49e35ec4c" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-36802441735858348202017-12-20T23:02:00.000+08:002017-12-22T22:36:49.965+08:00[Data Science 到底是什麼從一個完全外行角度來看][02]Data Science 是什麼?<section><figure><a href="https://lh3.googleusercontent.com/-MRG7JDhh1u8/Wjp63b9gmUI/AAAAAAAAXJg/iIdn9Rp8k7YvvxioHbrDjWr3sF6rMMHMgCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-eVtvulNYoJ8/Wjp65CWk3UI/AAAAAAAAXJk/s2q74xOPAL89CZ_hzF5o_4JEbE7P_0yjwCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption>圖片來源:https://pixabay.com/en/books-spine-colors-pastel-1099067/ 和 https://pixabay.com/en/math-blackboard-education-classroom-1547018/</figcaption><br />
</figure></section> <section><p>如果說資料(data)和石油一樣是最有價值的資源,那麼Data Science就同等於從原油提煉出石油的技術。 </p><p>上篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-01-introduction.html">[01]開篇</a>)了解了整個系列的內容之後,這篇來了解一下 Data Science 到底是什麼?需要什麼技能/技術?和到底怎麼把data提煉出來變成可以用來做使用的資訊(變成石油)。 </p></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6;" href="#WizKMOutline_1513781600738864" ;="">Data為什麼可以變成和石油一樣有價值的資源?</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6;" href="#WizKMOutline_1513781600738105" ;="">以孫子兵法為例</a><br />
</li>
</ul><li><a style="line-height: 1.6;" href="#WizKMOutline_1513781600738302" ;="">Data Science 為什麼會夯起來?</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513781600738562" ;="">推動Data Science的幾個技術?</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513781600738159" ;="">Data Science 需要有哪方面的知識?</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513781600738925" ;="">Data Scientist 的日常工作</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513781600738978" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a> <section><h2 id="WizKMOutline_1513781600738864">Data為什麼可以變成和石油一樣有價值的資源?</h2><p>在介紹Data Science之前,要先了解的是最後的成果是什麼?像原油變成石油一樣,最後石油是最主要能源之一,因此非常有價值,那麼Data最後到底變成什麼可以和石油一樣價值? </p><p>依我的理解,Data提煉出來搭配Machine Learning最後的結果是建立出一個<em><strong>預測模型(Predict Model)</strong></em>。想象一下,我們常常說,世上沒有後悔藥,為什麼需要後悔藥,因為你<em>看不到</em>未來會發生什麼事情。 </p><p>如果你可以看到呢?或者說不需要很明確只需要把你的選擇正確的幾率提升幾個百分比,那優勢已經是無法估計。 </p><p>所以,決策者可以依照Predict Model制定自己的策略,把優勢抓在自己這邊,打敗<em><strong>不確定性(Uncertainty)</strong></em>。 </p><section><h3 id="WizKMOutline_1513781600738105">以孫子兵法為例</h3><p>如果對於Predict Model還是有點模糊,那麼換個角度來看這個事情。 </p><p>大家都聽過孫子兵法,在我來看,簡單來說,孫子兵法就是一個基於經驗總結(Data),經過孫子處理過而得到的一個作戰守則(Predict Model衍生出的策略)。 </p><p>其實孫子兵法<em>不是</em>在教大家如何<em>以少勝多</em> - 畢竟當你是少的時候就算贏也是慘勝,他其實教的是如何在各個小戰役裡面<em>以多勝少</em>,等到次數多了,優勢的傾斜會越來越大直到最後勝利。 </p></section></section><section><h2 id="WizKMOutline_1513781600738302">Data Science 為什麼會夯起來?</h2><p>其實從Data提煉可用的資訊出來並不是一個新的概念,一直以來都有相關研究在這方面。例如 統計,data mining等等,都是想要用現用資料來了解情況或者預測未來。 </p><p>那既然已經有了,為什麼現在會多出那麼一個詞呢? </p><p>其實一切會夯起來,完全是因為<em>Big Data (大數據)</em>。 </p><p>舉個簡單例子,大家都知道瞎子摸象的故事,一些人看不到,加上大象太大,所以他們依據<em>自己摸到的部分</em>來<em><strong>推論</strong></em>大象是什麼。 </p><p>摸到身體的說,它是一面墻壁,有些人摸到耳朵,然後說它是像一面扇子等等。但是沒有一個人摸到<em>全部</em>,所以<em>沒有</em>一個人對大象的<em>描述</em>是對的。 </p><figure><figcaption><a href="https://lh3.googleusercontent.com/-781eDOpfkzk/Wjp67Pk68oI/AAAAAAAAXJo/SxHeghAl7VM1B53KTvlz1NjHTSs_6vhAQCHMYCw/s1600-h/image%255B7%255D"><img width="644" height="376" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-NoR1TtcQn7E/Wjp68QaDjhI/AAAAAAAAXJs/mY9GQvxfHCIGPuSFS5J0NlWxSR6F3YyugCHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a><br />
瞎子摸象,資料來源:https://kknews.cc/news/pq4oqaj.html</figcaption></figure><p>如果停一下,想想這個故事,因為大家<em>沒辦法看到整個大象</em>,因此大家的解讀<em>都有偏差</em>,如果反過來說,假設大家<em>可以看到整個大象</em>,那麼是否解讀就會<em>正確</em>(至少從相對的角度來說)呢? </p><p>學過統計的知道,有個概念叫做sampling(隨機抽樣),為什麼要做sampling呢?因為整個母體(全部的資料=整個大象)太過於<em>大量無法</em>處理(瞎子無法摸到),所以多多少少都有失偏頗(就像有些人覺得大象是面墻一樣)。 </p><p>因為現在技術<em>有辦法</em>處理大量資料(就像如果瞎子突然看得到了),那麼對於整個預估是否會更準確呢? </p><p>所以,Data Science 會夯起來,完全是因為 一直有需求,而直到現在才有技術有辦法支持達到效果。 </p></section><section><h2 id="WizKMOutline_1513781600738562">推動Data Science的幾個技術?</h2><p>既然知道為什麼Data Science會夯起來,來看看整個為什麼會夯起來。 </p><figure><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhuuIz1CFtZ8oR3uFKRSazkhTo8fFuPTXi5yu1Efdyou0kp3-2iMweOZtRa7sRKwNtgN4QRSOBGryM4aYZFPGMvVPWOgOCRAcKXQU1vffuO3QP5Ps-NsCT1KwhwxL_c6usoiIxMrYXUGyz/s1600-h/image%255B10%255D"><img width="654" height="598" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-L3ndozjD40Y/Wjp6-dpPcVI/AAAAAAAAXJ0/6p-OT-EXkOERRjCHe9zRxTPYRJRAuhDQQCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a><br />
<figcaption>幾個推動Data Science的技術</figcaption></figure><p>首先,在中間的部分是資料分析的部分,也是實際的核心,因為我們要用資料分析來了解資料。 </p><p>如上面提到,當數據大起來的時候,越能夠看到整個全貌,因此Big Data非常重要。 </p><p>能夠處理大數據之後,可以把大數據清理乾淨,搭配Machine Learning可以建立出準確的predict model。這些Predict Model可以放在Internet Of Things(IoT)讓這些IoT的機器做出更好決策,也由於有這些IoT,可以收集到更多數據。 </p><p>數據更多,用Machine Learning建立更好的模型,IoT越方便 - 這個是一個一直循環的過程,到最後如果<em>完全可以自動化</em>,是不是Predict Model會越來越準確? </p></section><section><h2 id="WizKMOutline_1513781600738159">Data Science 需要有哪方面的知識?</h2><p>到目前為止,看到了為什麼Data Science會夯起來,整個的整體環境讓整個資料分析處於一個正循環的狀況,那接下來就是,要當一個Data Science需要什麼能力? </p><figure><figcaption><a href="https://lh3.googleusercontent.com/-x01Gd4JmoDI/Wjp7AnuDhPI/AAAAAAAAXJ4/9FzgrlwFSkAp68RSIiN4F5cVdlJ_E-VTgCHMYCw/s1600-h/image%255B15%255D"><img width="654" height="604" title="image" style="display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-kkpPPMkq50g/Wjp7Bl-Is8I/AAAAAAAAXJ8/SC2KZhZtrNYbePVRgtmQfUnYoapdh6IuACHMYCw/image_thumb%255B7%255D?imgmax=800" border="0"></a><br />
Data Science Venn Diagram。來源:https://ion.icaew.com/itcounts/b/weblog/posts/theaccountinganddatascienceworldsmeet</figcaption></figure><p>網路上有個非常有名的Data Science Venn Diagram,告訴我們Data Science需要什麼能力,基本上需要3個領域: </p><dl><dt> Computer Science </dt>
<dd> 稱之為技術能力。畢竟,要處理Big Data,要讓電腦執行一些運算都需要一些資訊的技術能力,例如Programming,或者建立Big Data環境 </dd><dd></dd>
<dt> Maths & Statistics </dt>
<dd> 稱之為數學能力。畢竟,一些預測模型和資料處理技術其實都是數學公式和統計學的模型。 </dd><dd></dd>
<dt> Domain Knowledge </dt>
<dd> 某個領域的知識。舉例來說,假設你不是寫web的,可能400、404、500對你們無感,但是對於寫web的很清楚知道這個代表頁面呈現情況,因此可以用來計算整個網站的穩定度。 </dd><dd></dd></dl><p>這些能力<em>不代表</em>都要很精通,但是至少要有一定水準才有辦法做。因此,很多都是不同的人<em>一起</em>通力合作來建立Predict Model。 </p><div class="bs-callout bs-callout-info">題外話:這個其實和我們說的通才或者pie 人才是一樣概念,只是專才是不夠的...... </div></section><section><h2 id="WizKMOutline_1513781600738925">Data Scientist 的日常工作</h2><p>做Data Science的人稱為 Data Scientist (資料科學家),而基本上都是和資料打交道,整個流程大概如下: </p><figure><a href="https://lh3.googleusercontent.com/-7WLJKg9f1tw/Wjp7DC4mBnI/AAAAAAAAXKA/Uuew3TTUS2U8A89YfuRJAFbh5xAT4_DhwCHMYCw/s1600-h/image%255B18%255D"><img width="654" height="636" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-3vcw7EkOHNk/Wjp7FrmEZgI/AAAAAAAAXKE/jZzQlpxOjG0WnYvZ3Z1KBkCT30OvkwTOQCHMYCw/image_thumb%255B8%255D?imgmax=800" border="0"></a><br />
<figcaption>Data Scientist的日常</figcaption></figure><ol><li>首先都是有一個問題(需求)的產生</li>
<li>開始收集相關data</li>
<li>data基本上都需要經過處理,例如轉型、清理髒資料等</li>
<li>依照這些資料建立predict model</li>
<li>驗證predict model是否準確</li>
<li>沒問題就發佈出去實際使用</li>
</ol><p>基本上 百分之80%的時間都是都是在<em>資料收集</em>和<em>資料處理</em>。 </p><p>machine learning基本上就是第4步和第5步。 </p><p>這些步奏不一定是順序執行,很有可能會跳來跳去,甚至直接就放棄某個問題而直接換一個問題。 </p><p>接下來這個系列會把每個步奏都和大家介紹一下。 </p></section><section><h2 id="WizKMOutline_1513781600738978">結語</h2><p>這篇把整個Data Science做了一個簡單的介紹。 </p><p>希望透過這篇能夠了解到為什麼Data Science很重要,需要的技術和日常主要在處理什麼事情。 </p><p>在下一篇(<a href="http://blog.alantsai.net/2017/12/data-science-series-03-big-data-intro.html">[03]Big Data到底是有多Big?</a>)將會介紹最底層的推手,讓一起別的更加準確的技術,最重要的資源 Big Data。 </p></section><section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:239397a4-e22e-4754-972e-a841d1538acf" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a>,<a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-67569715882317562232017-12-19T21:59:00.000+08:002017-12-20T07:55:24.029+08:00[Data Science 到底是什麼從一個完全外行角度來看][01]開篇<section><figure><a href="https://lh3.googleusercontent.com/-x_2UFLRBL_w/WjkatV5BKiI/AAAAAAAAXI8/UL17aIuG_wcxJ-COgkcuAfCR9ZEbULiMACHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-15xUKKdBrrw/WjkaueNtf7I/AAAAAAAAXJA/teYBH1Iz4HABZqwEWuqTmjDtuZwyTup9wCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption>圖片來源:https://pixabay.com/en/books-spine-colors-pastel-1099067/ 和 https://pixabay.com/en/math-blackboard-education-classroom-1547018/</figcaption><br />
</figure></section><section><section><p>又到了新的一屆鐵人賽,這次和之前不一樣的是,多了團隊模式。然後,不知不覺就組成了一個團隊.... 失敗的話應該會永遠被釘死吧。 </p><p>所以,為了不被釘死,要好好努力來寫啦,已經被警告,別像去年那樣,待補,結果和卡債一樣,永遠翻不了生(雖然到目前為止還在努力的補當中)。 </p><p>那今年的主題是什麼呢?不是新的程式環境(OS: .Net core哪去了?),不是延伸去年內容打造更完整的建制環境(OS: 整合docker的DevOps哪去了?),而是一個完全不熟悉的領域,Data Science(資料科學)。 (如果你是工程師,那麼別錯過 1/6 在台大的 <a href="http://study4.tw/Activity/Details/12">Study4.TW Study4Love - 與大師對談</a>) </p><p>今年的題目是:<em><strong>Data Science 到底是什麼 - 從一個完全外行角度來看</strong></em></p></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6;" href="#WizKMOutline_1513691477636652" ;="">為什麼想寫這個主題?</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513691477636647" ;="">這個系列的主要程度和內容?</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513691477636377" ;="">需要準備什麼環境?</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513691477636428" ;="">結語</a><br />
</li>
</ul></div></section><br />
<div class="bs-callout bs-callout-info">同步發佈於第九屆 2018iT 邦幫忙鐵人賽:<a href="https://ithelp.ithome.com.tw/articles/10192297">https://ithelp.ithome.com.tw/articles/10192297</a><br />
</div><br />
<a name='more'></a> <section><h2 id="WizKMOutline_1513691477636652">為什麼想寫這個主題?</h2><p>先給各位我的背景,我其實是一個一般的Web Developer,主要使用微軟的技術,所以都是.Net、Asp .Net這些東西。從我這幾年參加過的鐵人賽可以看出,算是剛脫離junior的階段:<a href="https://ithelp.ithome.com.tw/users/20083151/ironman/556">第六屆跑去寫了java</a>:,<a href="https://ithelp.ithome.com.tw/users/20083151/ironman/856">第七屆寫了如何自定自己的框架</a>, <a href="https://ithelp.ithome.com.tw/users/20083151/ironman/1235">第八屆寫了建制Devops</a> (也是滑鐵盧的一屆,努力還債中....),今年本來是想延續去年的主題,然後進入到Docker整合DevOps。 </p><p>不過剛好在最近,因為想了解大數據(Big Data),然後有去上課(如果大家有興趣,然後在台中,可以參考看看, 最近1月也會開課:<a href="https://www.uuu.com.tw/Public/content/Edm/170825_TC.htm">鏈接</a>),剛好認識了Data Science的整個big picture。 </p><p>不得不說,我有點<em>震撼</em>到,因為雖然一直以來都有聽到:Hadoop、Big Data、Machine Learning、Internet Of Things這些詞,然後也模模糊糊知道在做什麼,但是並不知道整個<em>組合</em>起來對<em>世界正在造成什麼改變</em>。 </p><p>雖然大家可能常常聽到,我們實在經歷<em><strong>工業4.0</strong></em>的工業革命。但是可能我們比較沒有意識到的是,每一工業革命其實都是對整個世界的<em>巨大改變</em>。而Data Science正是<em>推動</em>工業4.0的其中一個主要的推手。 </p><figure><a href="https://lh3.googleusercontent.com/-iZMD6WhkT2Y/WjkaweNmrqI/AAAAAAAAXJE/0QgNa7xVRLYZPPE3qnu6sPR7prYr6P0hwCHMYCw/s1600-h/image%255B5%255D"><img width="654" height="368" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://buzzorange.com/techorange/wp-content/uploads/sites/2/2017/01/e6adb7e58fb2e6bc94e980b2.png" border="0"></a><br />
<figcaption>工業革命的大事記。來源:<a style="line-height: 1.6;" href="https://buzzorange.com/techorange/2017/01/23/industry-4-0-2/">台灣轉不動工業 4.0,如果企業經營者不丟棄成本思維</a></figcaption></figure><p>既然這麼重要,那麼正經歷變革的我們難道不需要有些了解嗎?大變革就像大海的巨浪來襲,是要準備好能在裡面游泳存活下來,還是因為措手不及而淹死? </p><p>所以,雖然對於這個領域完全是外行,而且對於我的工作上面也沒有什麼直接幫助(反而要花時間去了解),但是不記錄的話估計一個月就忘光了,因此想要借這個機會把學習到的做一個整理,方便以後回來看。 </p></section><section><h2 id="WizKMOutline_1513691477636647">這個系列的主要程度和內容?</h2><p>這個系列是給完全不了解這個領域的人看的,所以假設你有聽過Data Science(沒聽過更好)但是不知道在做什麼,那麼這個很適合。會從底層的資料到上面的Machine Learning做一個入門總覽介紹。 </p><p>如果你是大神級人物(對我來說任何懂Data Science都是大神 XD),那麼也麻煩不吝指教。 </p><p>整個 Data Science 其實就是在建立一個 <em>預測模型</em>,讓決策者可以依照這個模型去制定策略。Data Science工作就是讓這個<em>預測模型</em>能夠非常準確。要達到這個效果,有好多知識和技能一起組合使用才能達到。 </p><p>這個系列大概會拆幾個部分: </p><dl><dt> Data Science的概觀 </dt>
<dd> 了解什麼是Data Science、到底在做什麼、為什麼很重要和怎麼改變世界。 </dd><dd></dd>
<dt> Big Data的概念和Hadoop </dt>
<dd> 整個的浪潮會掀起其實是因為Big Data能夠有辦法用<em>一般電腦</em>來做處理。因此,會先從這個部分先介紹,包含: <ul><li>Big Data是什麼</li>
<li>Hadoop是什麼</li>
<li>如何架設Hadoop</li>
</ul></dd><dd></dd>
<dt> Data Processing - R 語言介紹 </dt>
<dd> 有了資料了之後,接下來就是對資料做處理。這邊會用R來介紹: <ul><li>R的基本介紹</li>
<li>一些統計學的介紹 - 預測其實都是統計模型,因此需要了解一些統計知識</li>
<li>用R做資料處理</li>
<li>視覺化資料 - 找出資料的關係</li>
</ul></dd><dd></dd>
<dt> Machine Learning - 做出預測模型 </dt>
<dd> 有了乾淨的資料,可以來了解如何透過machine learning建立模型做出預測: <ul><li>Machine Learning到底是什麼</li>
<li>幾種模型的介紹</li>
</ul></dd><dd></dd>
<dt> 總結 </dt>
<dd> 一些參考資料和如何繼續下去。 </dd><dd></dd></dl></section><section><h2 id="WizKMOutline_1513691477636377">需要準備什麼環境?</h2><p>基本上只需要一般電腦就好,這邊範例會使用一般的Windows 10的電腦做操作,如果要在Hadoop也跟著做的話,那麼電腦記憶體要高一點,因為會用建立VM的方式架設Ubuntu。 </p><p>至於後面用到的R基本上一般電腦都可以裝,所以沒有特殊要求。 </p></section><section><h2 id="WizKMOutline_1513691477636428">結語</h2><p>希望這篇讓大家有個概念,<em>Data Science 很重要</em>,<em>Data Science 很重要</em>,<em>Data Science 很重要</em>。 </p><p>想想,如果在做決定的時候,透過預測模型,可以讓你本來成功幾率,從-11%到+6%有利,那麼翻個幾次不就整個成功了。 </p><p>下一篇,從Data Science開始介紹 - 先來了解什麼是Data Science。 </p></section><section><div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:d7b057c6-129b-4239-870d-3a89e2cae351" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8cData+Science+%e5%88%b0%e5%ba%95%e6%98%af%e4%bb%80%e9%ba%bc%e5%be%9e%e4%b8%80%e5%80%8b%e5%ae%8c%e5%85%a8%e5%a4%96%e8%a1%8c%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8b%e3%80%8d" rel="tag">「Data Science 到底是什麼從一個完全外行角度來看」</a>,<a href="http://blog.alantsai.net/search/label/data+science" rel="tag">data science</a></div></section></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0tag:blogger.com,1999:blog-7924743034677720383.post-76034764861812846982017-12-16T10:16:00.000+08:002018-02-11T10:14:32.891+08:00[從.Net工程師的角度來看DevOps 25]在Visual Studio Team Services執行Build Script和CI Server總結<section><figure><a href="https://lh3.googleusercontent.com/-F0eQpjkMr4g/WjSBckzq-OI/AAAAAAAAXHw/qWznbo6H1sUhmLgbsXMRxNca7xYgdhF6QCHMYCw/s1600-h/image%255B2%255D"><img width="654" height="290" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-yiG9Nse9Rt0/WjSBeH-jwTI/AAAAAAAAXH0/zAeDIzzE-m4RVwN07mC0qfWWQG-QEm1dQCHMYCw/image_thumb?imgmax=800" border="0"></a><br />
<figcaption>圖片來源:https://pixabay.com/en/books-spine-colors-pastel-1099067/ 和 https://blog.xebialabs.com/2016/03/21/essential-devops-terms/</figcaption><br />
</figure></section><section><p>在上一篇(<a href="http://blog.alantsai.net/2017/12/devopsSeries-intro-to-free-ci-service-visual-studio-team-services.html">[從.Net工程師的角度來看DevOps 24]免費build私人Repo的CI Service - Visual Studio Team Service介紹</a><span style="line-height: 1.6;">)了解了如何用Visual Studio Team Services(VSTS)的內建Template來build範例專案;在設定的過程,其實沒辦法直接使用內建template,會需要調整一些參數。</span></p><p>這些調整的內容和AppVeyor要調整的非常不一樣,造成了如果要換CI Server會花一些時間在這些瑣碎的細節上面。 </p><p>這篇將會看看,如果要把VSTS改成用build script來build專案,會需要做些什麼。 </p></section> <section> <a name="KMContentPageTopID" id="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin: 0px 0px 0px 20px;"><li><a style="line-height: 1.6;" href="#WizKMOutline_1513390188874937" ;="">調整VSTS來執行build script</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513390188874477" ;="">簡單總結CI Server和build script的關係</a><br />
</li>
<ul style="margin: 0px 0px 0px 30px;"><li><a style="line-height: 1.6;" href="#WizKMOutline_1513390188874300" ;="">每個CI Server設定方式都不同</a><br />
</li>
<li><a style="line-height: 1.6;" href="#WizKMOutline_1513390188874403" ;="">拿不到build完的內容 - Artifact</a><br />
</li>
</ul><li><a style="line-height: 1.6;" href="#WizKMOutline_1513390188874907" ;="">結語</a><br />
</li>
</ul></div></section> <a name='more'></a> <section><h2 id="WizKMOutline_1513390188874937">調整VSTS來執行build script</h2><p>首先,先建立一個新的build definition,這次在template的部分選擇empty template: </p><figure><a href="https://lh3.googleusercontent.com/-7AKTaUVB4wU/WjSBe_HtgrI/AAAAAAAAXH4/IAUI6utc4fEqKL7Vgy1AK5KOY98mOMF5wCHMYCw/s1600-h/image%255B5%255D"><img width="654" height="312" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-yzU421Faet8/WjSBf6OSbfI/AAAAAAAAXH8/tSAz2fvPj78ZEDPBTv7AX0svPIxSnMlQwCHMYCw/image_thumb%255B1%255D?imgmax=800" border="0"></a><br />
<figcaption>選擇emptytemplate</figcaption></figure><p>進來了之後,只需要加入一個powershell script的step並且指向專案裡面的build script,並且選擇<code>Save & Queue</code></p><figure><a href="https://lh3.googleusercontent.com/-vApS2e2K6yE/WjSBg9unUyI/AAAAAAAAXIA/11fO-OBYxx85shUap2HirvXJ_3H-ieaLgCHMYCw/s1600-h/image%255B8%255D"><img width="654" height="269" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-IssWNzyuSX0/WjSBiaPMLRI/AAAAAAAAXIE/MG-Ggcj1T8AT-lMUAarZg7wJf8H6wbXMwCHMYCw/image_thumb%255B2%255D?imgmax=800" border="0"></a><br />
<figcaption>設定powershell script</figcaption></figure><div class="bs-callout bs-callout-warning">這邊要注意在step前面的<code>Get Sources</code>需要設定和github連上。 </div><p>之後build就會開始,並且跑完了之後可以看到log資訊和我們在local執行的時候是一樣的內容: </p><figure><a href="https://lh3.googleusercontent.com/--EO_gAymUEY/WjSBjLn4m4I/AAAAAAAAXII/kDWO7o726X0TeLhC39CVqmEe5vR8yCYVQCHMYCw/s1600-h/image%255B11%255D"><img width="654" height="374" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-a3_3jiyYc9k/WjSBkB9A30I/AAAAAAAAXIM/H_-Cac93P-IIUALZq6P3tK3K9IJAVIjrwCHMYCw/image_thumb%255B3%255D?imgmax=800" border="0"></a><br />
<figcaption>執行完的結果</figcaption></figure></section><section><h2 id="WizKMOutline_1513390188874477">簡單總結CI Server和build script的關係</h2><p>目前為止,看了兩個CI Server:AppVeyor和VSTS。在這裡面會發現2個問題: </p><ol><li>每個CI Server設定方式都不同</li>
<li>拿不到build完的內容 - Artifact</li>
</ol><section><h3 id="WizKMOutline_1513390188874300">每個CI Server設定方式都不同</h3><p>在AppVeyor,已經幫使用者區分好build、test、deploy等等階段,只需要設定這些階段要執行什麼,AppVeyor就會建制完。 </p><p>在VSTS則是用step的概念,由使用者自己定義每一個階段要執行什麼,然後有一些已經定義好符合某些專案的template,方便快速設定。 </p><p>可以想象每一種CI Server有自己的設計理念,如果今天沒有build script要設定每一個CI Server其實很麻煩,尤其是當CI Server更新版本的時候,位置和內容可能都會不一樣,需要花時間再去研究。 </p><p>反過來說,如果把build邏輯都整合到build script,<em>不止不會被綁到某一個CI Server</em>,並且不管在哪一個CI Server只需要執行那個build script即可,並且build script在做什麼非常清楚, 不像如果依賴CI Server,不能夠肯定裡面到底執行了什麼操作。 </p></section><section><h3 id="WizKMOutline_1513390188874403">拿不到build完的內容 - Artifact</h3><p>當程式碼build完之後,一定會有一個產出,例如library會是一個dll,這種產出在CI有個名稱叫做<em><strong>Artifact</strong></em>。 </p><p>如果眼尖的朋友,會注意到,如果用CI內建的方法,<em>會產生出Artifact</em>,但是執行build script <em>會沒有</em>。 </p><figure><a href="https://lh3.googleusercontent.com/-HTF9yNAf8d8/WjSBlyZ7ttI/AAAAAAAAXIQ/i9xABTVSLhMq1lmsvrDvjlULylIkBsi_gCHMYCw/s1600-h/image%255B14%255D"><img width="654" height="285" title="image" style="margin: 0px; display: inline; background-image: none;" alt="image" src="https://lh3.googleusercontent.com/-qU-RYZc1A78/WjSBmrmKODI/AAAAAAAAXIU/UguicZz7rrMGOvnVqDFIaR3CGLw3xq-4QCHMYCw/image_thumb%255B4%255D?imgmax=800" border="0"></a><br />
<figcaption>VSTS內建template build的結果,artifact有東西</figcaption></figure><p>並且build過程有些資訊,像是測試情況、測試涵蓋率(Code Coverage)這些在自己的build script也會看不到。這是因為目前build script還沒有結合CI Server,這也是接下來需要補強的部分。 </p></section></section><section><h2 id="WizKMOutline_1513390188874907">結語</h2><p>目前build script基本已經完成了,但是如果沒辦法自動打包產出結果,對於發佈和整個CI效用就大打折扣了。 </p><p>因此,接下來將會開始進入另外一個階段,<em><strong>Package</strong></em>的階段。 </p><p>而在package裡面,有個非常重要的概念是版號(Version),因此下篇將會介紹版號的重要性。 </p></section><section> <div class="wlWriterEditableSmartContent" id="scid:77ECF5F8-D252-44F5-B4EB-D463C5396A79:cc7172eb-09ca-44fd-a0ad-a88c5c1580fa" style="margin: 0px; padding: 0px; float: none; display: inline;">標籤: <a href="http://blog.alantsai.net/search/label/%e3%80%8c%e5%be%9e.Net%e5%b7%a5%e7%a8%8b%e5%b8%ab%e7%9a%84%e8%a7%92%e5%ba%a6%e4%be%86%e7%9c%8bDevOps%e3%80%8d" rel="tag">「從.Net工程師的角度來看DevOps」</a>,<a href="http://blog.alantsai.net/search/label/%e3%80%8ciThome+%e7%ac%ac%e5%85%ab%e5%b1%86%e9%90%b5%e4%ba%ba%e8%b3%bd%e3%80%8d" rel="tag">「iThome 第八屆鐵人賽」</a>,<a href="http://blog.alantsai.net/search/label/devops" rel="tag">devops</a>,<a href="http://blog.alantsai.net/search/label/.net" rel="tag">.net</a></div></section>Alan Tsaihttp://www.blogger.com/profile/05823722492933238241noreply@blogger.com0