spark-streaming任務提交遇到的坑

來源:互聯網
上載者:User

標籤:即時   sql   update   asi   配置資訊   cut   get   統計   文章   

一、背景

  基本所有公司互連網公司都會有離線和即時任務,達到即時的目的手段據個人瞭解有storm、spark-streaming、flink。今天來探討一下spark-streaming任務的開發到上線過程中遇到的問題。

  公司領導最近提了一個即時展示使用者、產品各方面統計資料的需求,對於資料埋點需要有一套針對性的計劃。因此需要我們大資料平台對資料進行即時接收、清洗、匯入....的內容。詳細內容不再介紹。下面介紹在開發中spark on yarn遇到的坑。

 

二、代碼坑

1.maven項目中,resource目錄是一個classpath目錄,設定檔所在地

通過ConfigFactory.load("application.properties")來擷取properties的配置資訊,比如application.properties和log4j.propertoes

logger = LoggerFactory.getLogger(this.getClass)來擷取logger

2.case class範例類

特點有:不用new;toString漂亮;實現了hashcode和equal;可用case匹配;預設可序列化等

所以如果只是用來儲存一個具有多個屬性的對象,那再好不過了

3.結果批量插入batch

conn.setAutoCommit(false)

一個迴圈ps.addBatch()

一個ps.executeBatch()

conn.commit()

注意,insert update delete操作不能用executeQuery(),只能是select是query

4.資料庫連接池

雖然設定上都差不多,但是實現上還需要更加格式化的代碼,每次調用,都是先擷取串連池,再擷取connection

5.StreamingContext中含有SparkContext函數來擷取sc,所以不用再去建立sc

但是需要注意,在整個spark代碼中無論是sc還是ssc還是sqlContext都不能調用.stop()方法,不然會中值進程

注意:別忘了調用ssc.start()

6.動態建立對象

Class.forName().newInstance().asInstanceOf[]通過這種方式可以有選擇的建立對應的類的對象

7.rdd.collect()

返回的是一個數組Array,注意:rdd的lazy性質

[email protected]

該註解表示該變數的修改代碼不能被進行執行順序最佳化,以及修改引用即時性,但是不保證同步安全性。同步的三個特性保證兩個,安全性實際上並不需要,因為@volatile的目的是我修改你即時查看,並不是多線程多並發的共同修改

9.Option[Type]

功能太強大,Option的子類有Some()和None,表示儘可能返回給你你想要的,如果存在那麼結果就在Some(....)中的....。...就是結果,如果不存在就返回None,所以很多時候的用法是匹配:

def show(x: Option[String]) = x match {

      case Some(s) => s

      case None => "?"

   }

存在的話怎麼樣,不存在的話怎麼樣

11.正則方法

"""(\d+\.\d+\.\d+\.\d+).*?logger.php\?(.*?) HTTP.*""".r,用””.r表示正則對象

也可以用 new Regex(....)的方法

有方法如下findAllIn;findFirstIn;findPrefixOf;replaceFirstIn,replaceAllIn.

我想說的是另外一個關於分組的問題()

python中是.group(index)

scala中是直接val regexobject(變數1,變數2,...) = “字串”

其中變數1 2就是正則中()所包含的分組

val logRegex(ip, query) = logStr這個例子就是吧logStr用logRegex匹配,把(\d+\.\d+\.\d+\.\d+)作為ip變數的值,把(.*?)作為query變數的值。,一口氣定義並初始化兩個變數

 

三、分布式任務的坑

 

1.簽名問題

 

引入的各種包存在簽名,當submit執行的時候會不信任!!!,所以需要刪除jar包中的檔案zip -d ***.jar ‘META-INF/*DSA‘ ‘META-INF/*.RSA‘ ‘META-INF/*SF‘

 

2.讀取檔案問題

在程式中除了設定檔還有一個檔案用來把ip解析成城市資訊,但是每次提交上去之後發現讀取這個檔案失敗,根本找不到這個檔案,但是jar包中確實是存在的!!!

這就是一個分布式啟動並執行問題,如果在本地沒問題,放在classpath中或者絕對路徑都可以,此時說一下到底那些代碼是是appmaster中執行,那些代碼在worker中執行。

 

    appmaster:main中開始到rdd操作之前

 

    worker:從rdd操作開始到結束

可以看出,我們最好是把需要共用的資訊在rdd操作之前讀入然後傳入rdd的應用函數參數中

3.資料共用、變數共用

 

當然這個問題的根本原因還是appmaster和worker的分布式運行原因。

 

問題一:object和class的問題,object是一個靜態東西,可以人為object在每台機器上都是一個對象,而且各不相同!一定要注意,但是如果我們在appmaster中建立一個class的對象,在worker中調用這個對象的屬性,那麼這個屬性不是多個,而是唯一的一個!!!!!!!!!!!!!!!!!!!!!!!!!!!

所以我們不能通過在object中定義大家都需要的變數!

 

問題二:序列化問題。當我使用class來共用資料以及變數的時候,報錯task can not seriablzable.........,問題在於serializable的class條件是類中的類變數都是可以序列化的!!!!請自行檢查。

 

本文僅僅是列出了出現的問題以及解決辦法,具體問題的詳細解析後續文章中介紹。

參考連結:

https://www.cnblogs.com/dolphin0520/p/3920373.html

 

spark-streaming任務提交遇到的坑

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.