2018年4月27日 星期五

[Spark 學習小筆記] 如何使用Java 實作 vectorization (1)


Vectorization 的重要性


還記得上Anfrew Ng 的deep-learning課程前幾堂課就講到vectorization的重要性,以及對於效能會有怎樣的影響,對於矩陣運算,最直覺的反應就是寫個for loop,然後針對每個emlement 去做運算,但是其實CPU&GPU 有專門的指令集可以用來平行化專門處理這種運算,於是透過 vectorization 就可以得到顯著的效能改善,下圖就是老師上課時用python 的範例,相差了400多倍!?

2018年4月24日 星期二

Apache Spark 學習三部曲:學會他,除錯他,寫好他



最近密集的在寫Spark 程式,感覺到終於該開始往下個階段邁進了,其實就像學習任何程式語言和Framework,Spark 學習也分三個步驟:
  1. 如何寫
  2. 如何調教/錯誤排除
  3. 如何寫的好

學會如何寫,網路上有不少的範例,不過大多是Scala和Python,如果要翻成Java版還需要額外花點功夫,等到開始寫一些程式丟到spark 上面跑,又會開始遇到一堆奇奇怪怪的錯誤訊息,比如說:
  • Futures timed out after [300 seconds]
  • This timeout is controlled by spark.executor.heartbeatInterval
  • cannot assign instance of java.lang.invoke.SerializedLambda to field org.apache.spark.sql.UDFRegistration$$anonfun$27.f
  • Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory


這時候就要開始學習怎麼調教系統參數和錯誤排除,下面這個網站整理的蠻不錯的,把Spark performance tuning 分成幾大塊,分別是:
  • Data Serialization
  • Memory Tuning
  • Memory Managemnt
  • Data Structure Tuning
  • Garbage Collection Tuning




最後就是程式都會動了,但是怎麼要跑那麼久?這時候就應該開始瞭解Spark 許多底層的運作原理,要怎麼寫才是正確的,怎樣寫才會有比較好的效能,下面收一些在學習spark 時收集到的不錯資訊:



其它網路文章:


最後要提醒自己:

先求有,再求好,等到程式會動了,確定結果是大家想要的,有符合商業價值了,再來調教也不遲!

2018年4月17日 星期二

[筆記] 要如使用Unicode Range 濾掉文章的特殊字元


最近在實作文章(中文)抽詞,斷詞的程式,其中要做的一件事就是把一些符號和標點符號濾掉,在網路上google 都會搜尋到五花八門的範例,常見的regular expression如下:
  • !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
  • ['?:!.,;]*([a-z]+)['?:!.,;]*

如果沒有好好去瞭解,其實都會被這些眼花繚亂的符號所迷惑,其實很多多東西在Java的文件裡面都有定義好了,只是從來都沒有好好去研究 (遮臉)。參考Java Pattern的文件其實很輕易的就可以列舉出所有的符號:

POSIX character classes (US-ASCII only)
\p{Lower} A lower-case alphabetic character: [a-z]
\p{Upper} An upper-case alphabetic character:[A-Z]
\p{ASCII} All ASCII:[\x00-\x7F]
\p{Alpha} An alphabetic character:[\p{Lower}\p{Upper}]
\p{Digit} A decimal digit: [0-9]
\p{Alnum} An alphanumeric character:[\p{Alpha}\p{Digit}]
\p{Punct} Punctuation: One of !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph} A visible character: [\p{Alnum}\p{Punct}]
\p{Print} A printable character: [\p{Graph}\x20]
\p{Blank} A space or a tab: [ \t]
\p{Cntrl} A control character: [\x00-\x1F\x7F]
\p{XDigit} A hexadecimal digit: [0-9a-fA-F]
\p{Space} A whitespace character: [ \t\n\x0B\f\r]


但是真實世界往往不只這樣,除了一般ASCII符號外,其實現在越來越多怪異的 Unicode 符號也會出現在文章中,比如說:
  • "─" U+2500 Box Drawings Light Horizontal Unicode Character
  • "⋯" U+22EF Midline Horizontal Ellipsis Unicode Character - Compart
  • "䶵" U+4DB5  cjk Ideograph Extension A, Last
甚至最近連emoji 也非常常出現:
到底emoji 需不需要濾掉呢?這個問題我也不知道,不過至少確定許多符號都應該要濾掉,為了方便使用就把要濾掉的特殊字元整理如下:



有興趣的歡迎取用~