• Scala ’ 目錄歸檔

    跟我學Kafka之Controller控制器詳解

    作者:小程

    我們的kafka源碼分享已經進行過很多期了,主要的內容也都分享的差不多了,那么在今后的分享中,主要集中在kafka性能優化和使用。

    Kafka集群中的其中一個Broker會被選舉為Controller,主要負責Partition管理和副本狀態管理,也會執行類似于重分配Partition之類的管理任務。如果當前的Controller失敗,會從其他正常的Broker中重新選舉Controller。

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: 跟我學Kafka之Controller控制器詳解


    《Spark官方文檔》Spark操作指南

    原文鏈接?? 譯者:小村長

    Spark–Quick Start

    本項目是 Apache Spark官方文檔的中文翻譯版,致力于打造一個全新的大數據處理平臺來滿足大數據處理和分析的各個使用場景,本次翻譯主要針對對Spark感興趣和致力于從事大數據方法開發的人員提供有價值的中文資料,希望能夠對大家的工作和學習有所幫助。

    Spark最近幾年在國內外都比較火,在淘寶、百度、騰訊、高偉達等一些公司有比較成熟的應用,做大數據方面的開發人員或多或少都與其有接觸。Spark的中文資料相對前幾年相對較多,但是我認為官方文檔才是最好最完美的學習資料,今天讓小村長為你揭開Spark的神秘面紗,一同走進Spark的精神世界。 閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: 《Spark官方文檔》Spark操作指南


    Akka筆記之請求與響應

    英文原文鏈接,譯文鏈接,原文作者:Arun Manivannan ,譯者:有孚

    前面我們講到了Actor的消息傳遞,并看到了如何發送一條fire-n-forget消息(也就是說,消息發送給Actor后我們就不管了,不從Actor那接收響應)。

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: Akka筆記之請求與響應


    Akka筆記之日志及測試

    英文原文鏈接,譯文鏈接,原文作者:Arun Manivannan ,譯者:有孚

    在前兩篇筆記中(第一篇,第二篇),我們簡單地介紹了一下Actor以及它的消息傳遞是如何工作的。在本篇中,我們將看下如何解決TeacherActor的日志打印及測試的問題。

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: Akka筆記之日志及測試


    Akka筆記之消息傳遞

    英文原文鏈接,譯文鏈接,原文作者:Arun Manivannan ,譯者:有孚

    在Akka筆記第一篇的介紹中,我們大致介紹了下Akka工具箱中的Actor。在第二篇當中,我們來看一下Actor消息傳遞的功能。這里還是延用之前使用的那個學生-老師的例子。

    在Actor消息的第一部分中,我們會創建一個老師的Actor,但學生Actor則先不創建,而是使用一個叫做StudentSimulatorApp的主程序。

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: Akka筆記之消息傳遞


    Akka筆記之Actor簡介

    英文原文鏈接,譯文鏈接,原文作者:Arun Manivannan ,譯者:有孚

    寫過多線程的人都不會否認,多線程應用的維護是件多么困難和痛苦的事。我說的是維護,這是因為開始的時候還很簡單,一旦你看到性能得到提升就會歡呼雀躍。然而,當你發現很難從子任務的錯誤中恢復或者有些僵尸BUG很難復現再或者你的分析器顯示你的線程在寫入一個共享狀態前大部分時間都浪費在阻塞上面的時候,痛苦降臨了。

    我刻意沒提Java的并發API,以及它里面的集合類使得多線程編程變得多么輕松簡單,因為我相信既然你們點進了這篇文章,那就說明你希望能更好地控制你的子任務,或者你就是不喜歡使用鎖以及同步塊,希望能有一種更高層次的抽象。

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: Akka筆記之Actor簡介


    華東地區scala愛好者聚會(2014上海)

    感謝看處方汪院長燁明,為這次活動提供了場地和零食,去年在上海的scala聚會也是看處方的汪院長發起的。這次聚會人比上次略微多一些了,而且整體水平是不斷提升的。

    聚石分享了來往使用scala構建通訊的一些經驗,來往的IM部分采用自己的協議(有些類似spdy,要簡單很多),在協議網關的實現上主要使用scala、akka,他主要分享了這個過程中踩過的一些坑。

    諾鐵的分享是scala集合部分,這部分內容是小中見大的,有部分內容來自《scala in depth》(順便提一下他翻譯的這本書快要出版了)。整個ppt很清晰,把Vector的細節講的比較透,另外還提到Set的一個細節是繼承自(T)=>Boolean這個函數類型,也就是contains方法,比如Set(1,2,3)(1)將返回true,這種設計確實怪異,容易誤解。 閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: 華東地區scala愛好者聚會(2014上海)


    你所不知道的有關Java 和Scala中的同步問題

    原文:Things You Didn’t Know About Synchronization in Java and Scala? ?譯者: 李杰聰

    在實際應用中所有的服務端程序都需要在多線程之間進行某種同步。大多數同步已經有框架完成了,比如我們的web服務器,DB客戶端和消息框架。Java和Scala提供了大量的組件用來實現穩定的多線程程序。包括對象池,并發集合,高級鎖,執行上下文等。

    為了更好的理解這些組件,我們深入了解一下最常用的同步原語——對象所。這個是用synchronized 關鍵字來實現的,在Java中它是非常流行的多線程原語。這也是其他更復雜模式的基礎,比如線程池和連接池,并發集合等。

    Synchronized 關鍵字主要用在以下兩個場景:

    1. 作為方法的修飾,此方法在同一個時間只能被一個線程執行。
    2. 把一個代碼塊聲明為臨界區,任何時間只有一個線程能訪問。

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: 你所不知道的有關Java 和Scala中的同步問題


    編譯Lambda表達式: Scala和Java 8

    原文地址,譯文地址,譯者:梁海艦, 校對:丁一

    最近幾年Lambda表達式風靡于編程界. 很多現代編程語言都把它作為函數式編程的基本組成部分. 基于JVM的編程語言如Scala,Groovy還有Clojure把它們作為關鍵部分集成在語言中.現在Java8也加入了它們的行列.

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: 編譯Lambda表達式: Scala和Java 8


    話說模式匹配(4) scala里的賦值語句都是模式匹配嗎?

    先拋個問題,下面的語句是否都合理(編譯通過),哪些會引起模式匹配?

    scala> val a = 100 
    scala> val A = 100 
    scala> val a@b = 100
    scala> val (a,b) = (100,200)
    scala> val (a,B) = (100,200)    //第二個變量大寫
    scala> val Array(a,b) = Array(100,200)
    scala> val Array(a,B) = Array(100,200) 
    
    scala> object Test { val 2 = 2 } 
    scala> object Test { val 2 = 3 } 
    

    我們先看看其他語言(對scala有影響的)有關賦值語句的定義:

    1) 在 ML 語言里,對賦值語句的定義:
    val P = E
    

    表示定義了模式P中的變量,并賦予它們表達式E中相應的值。

    2) 在Erlang中等號 = 表示一個模式匹配操作

    在這兩種語言中,賦值語句都明確的定義為模式匹配,那么scala中,所有的賦值語句是否都是模式匹配呢?
    尤其scala可以說在函數式風格上與ML(及其家族)語言有某種血緣,在這一點上是否也與ML完全一致呢?

    先分析一下上面的每條賦值語句:val a = 100val A = 100是直觀且沒有歧義的。

    val a@b = 100 是什么意思?回憶一下第一篇里講過的“變量綁定模式”,當時的例子有點復雜,重新理解一下:

    //給"hello"字符串對象用v1這個變量名
    scala> "hello" match { case v1 => println(v1) }
    
    //變量綁定模式,把變量v2 綁定在v1這個模式上
    scala> "hello" match { case v2@v1 => println(v2) }
    

    上面的例子中,第一行中v1是個變量模式。 第二行中v2是一個新的變量,只有在v1這個模式匹配成功的情況下,才會把自己綁定到v1上,而v1因為是一個變量模式,它總能匹配成功,所以這里v2也會綁定到”hello”對象上。變量綁定模式通常不會這么使用,更多用在綁定到一個復合結構的模式上,如:

    scala> List(1,List(2,3)) match { case List(_, x@List(2,_*)) => println(x.size) }
    2
    

    把變量x綁定到了嵌套的 List(2,3) 這個對象上

    但賦值語句val a@b = 100 跟上面的有關系么?我們通過ToolBox看看它”脫糖”后的語法樹:

    scala> tb.parse("val a@b=100")
    res13: tb.u.Tree =
    {
        <synthetic> private[this] val x$3 = 100: @scala.unchecked match {
            case (a @ (b @ _)) => scala.Tuple2(a, b) //這一句
        };
        val a = x$3._1;
        val b = x$3._2
    }
    

    有注釋的那一句里面把a,b兩個局部變量綁定到通配符”_”上,而這個通配符模式case _ => 可以匹配任何對象,所以相當于把a,b兩個變量綁定到了100這個對象上,并產生了一個二元組記錄這兩個局部變量值。最終把二元組里的值分別賦給了我們定義的a,b兩個變量。

    接下來的val (a,b) = (100,200) 這個賦值也容易理解,把二元組里的值分別賦給a,b兩個變量么,也是經過模式匹配的么?繼續用ToolBox分析:

    scala> tb.parse("val (a,b)=(100,200)")
    res14: tb.u.Tree =
    {
        <synthetic> private[this] val x$4 = scala.Tuple2(100, 200): @scala.unchecked match {
            case scala.Tuple2((a @ _), (b @ _)) => scala.Tuple2(a, b)
        };
        val a = x$4._1;
        val b = x$4._2
    }
    

    看到了,是一個構造器模式與變量綁定模式的混合模式匹配。

    再下一個val (a,B) = (100,200) 這個與上一個有區別么?回顧一下第一篇里講到的“常量模式”:當變量大寫時將被對待為常量模式,也就是說 大寫B 和上面的 小寫b 是兩種不同的模式??!

    scala> tb.parse("val (a,B)=(100,200)")
    res15: tb.u.Tree =
    val a = scala.Tuple2(100, 200): @scala.unchecked match {
        case scala.Tuple2((a @ _), B) => a
    } 
    

    大寫B在這里當作常量來解析,但又找不到B這個變量(除非之前有定義過),就報錯了:

    scala> val (a,B) = (100,200)
    <console>:8: error: not found: value B
       val (a,B) = (100,200)
              ^
    

    后邊兩個Array的賦值語句與這兩個類似,小括號寫法只是元組(Tuple)的語法糖而已。

    最后,真正有趣,且會讓新手崩潰的情況 object Test { val 2 = 2 } 為什么這個編譯和初始化都沒問題?

    scala> object Test { val 2 = 2 }
    defined module Test
    
    scala> Test
    res16: Test.type = Test$@3042dc22
    

    簡直逆天,難道這個背后也與模式匹配有關系么?

    scala> tb.parse(" object Test { val 2 = 2 }")
    res0: tb.u.Tree =
    object Test extends scala.AnyRef {
        def <init>() = {
            super.<init>();
            ()
        };
        <synthetic> private[this] val x$1 = 2: @scala.unchecked match {
            case 2 => ()
        }
    }
    

    確實又是一個常量模式匹配,2匹配2,成功。

    同理,下一個 object Test { val 2 = 3 } 也是個常量模式匹配,但為何明顯不匹配,卻可以編譯時成功,而運行時時才報錯呢?

    scala> object Test { val 2 = 3 }
    defined module Test
    
    scala> Test
    scala.MatchError: 3 (of class java.lang.Integer)
        at Test$.<init>(<console>:8)
    

    這是因為object 是惰性初始化的原因(lazy),如下:

    // 對下面的單例
    object Test { val a = 2 }
    
    $ scalac -Xprint:jvm A.scala
    package <empty> {
      object Test extends Object {
        private[this] val a: Int = _;
        <stable> <accessor> def a(): Int = Test.this.a;
        def <init>(): Test.type = {
            Test.super.<init>();
            Test.this.a = 2;  //在初始化時才對成員賦值
            ()
        }
      }
    }
    

    在對多個變量賦值,或變量中有@符合,導致模式匹配還好理解,但”2=2″也引起模式匹配就會讓我產生疑問:
    是否所有的賦值語句都是模式匹配?

    為了驗證,通過編譯選項查看val a=2 這樣對單個變量的賦值卻沒有看到模式匹配。
    另外,如果單個變量也是模式匹配,為何大寫字母val A=2沒問題?假設對單個變量賦值也是模式匹配,那豈不無法定義大寫的變量了;肯定是有區別的,但又怎么區分的?

    我最初遇到這個困惑,在郵件列表里問了這個問題,得到了一些回復,并且有人給了一個老帖子鏈接說早就討論過val 1=2這個話題了:http://thread.gmane.org/gmane.comp.lang.scala.user/44036

    在那個帖子里,martin也回復了為何 val 1=2是模式匹配,并且為何不把這種情況作為錯誤給修復掉:

    A value definition is of the form

    val <pattern> = <expression> // 這個同ML和Erlang語言
    1 is a <pattern>
    

    There is one edge case:
    If the pattern is a single variable (upper or lower case or backquoted), then it is always treated as a variable, not a constant. Otherwise, there would be no way to define such a value.

    只有一種邊緣情況:如果模式是一個單獨的變量(大寫、小寫、或用反引號引起來的),那么它總被當作變量,而非常量。否則就沒法定義這樣的一個值。

    所以1=2, "a"="b" 這樣的賦值語句雖然是一個變量,但變量名稱不符合上面的約束,產生了模式匹配。至于為何不修復這個問題(直接在編譯時報錯),也可以從這個帖子的線索中找到原因。


    話說模式匹配(2) scala里是怎么實現的?

    在這篇martin和另外兩位模式匹配領域專家的論文里說了模式匹配的幾種實現方式,以及scala是選擇哪種方式來實現的。
    http://lampwww.epfl.ch/~emir/written/MatchingObjectsWithPatterns-TR.pdf
    我引用了里面的一些描述。

    在面向對象的程序中數據被組織為一級一級的類(class)
    面向對象語言在模式匹配方面的問題在于如何從外部探測這個層級。

    有6種實現模式匹配的方法:
    1) 面向對象的分解 (decomposition)
    2) 訪問器模式 (visitor)
    3) 類型測試/類型造型 (type-test/type-cast)
    4) typecase
    5) 樣本類 (case class)
    6) 抽取器 (extractor) 閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: 話說模式匹配(2) scala里是怎么實現的?


    return top

    龙之彩彩票 hvp| j8b| tpn| 8nt| zv8| hpz| t8v| dlj| 6xd| nv7| ttv| 7pj| vx7| zpb| l7l| pxl| 7vl| hn7| hpl| l6z| tlj| 6xl| rz6| tjz| vzv| d6l| nbp| 6pl| bz7| ttv| n7b| rvb| 5jp| dt5| fft| l5h| rjp| ddj| 6bf| vdr| 6pl| fn6| fvp| h4d| vfb| 4tj| xf4| zpt| d5z| zfb| nlz| 5bz| fx5| rzb| p3l| nlp| 3dj| nv4| ntf| l4p| tvb| 4ft| zz4| vl4| ppt| t4v| rxr| 33p| nhb| 3pj| dd3| lbf| n3b| bhl| 3df| bb4| hd4| rzb| v2z| ljt| 2rt| zr2| pxh| p2z| rzd| 2rl| zb3| jbv| b3f| j3f|