存儲實時數據,Spark+TDengine 在中國電信電力測功系統監控平臺上的應用實踐

小 T 導讀:電力測功系統監控平臺,是基於中國電信上海理想信息產業(集團)有限公司的,設備數據採集和設備銀行V2.0應用進行設計和開發的。採集到的設備的實時數據,都是存儲在TDengine中的。

應用背景
電力測功系統監控平臺,是基於中國電信上海理想信息產業(集團)有限公司的,設備數據採集和設備銀行V2.0應用,進行開發和設計的,軟件是電力測功系統監控平臺的核心,是實現數據匯聚、數據處理、可視化展示以及測功試驗的重要部分,根據電力測功系統集控界面功能需求,可將整個電力測功系統監控平臺架構分爲四部分:設備層、網絡層、平臺層以及展示層。整體架構如下圖:

實時數據是存儲在TDengine數據庫之中的,和設備銀行之間進行通信,數據流程如下:

設備銀行主要負責模版、設備和報警信息的管理,其可視化界面如下:

Spark+TDengine使用過程

1. TDengine的安裝

請參考官方文檔:www.taosdata.com/cn/document…

2. 在TDengine中建立測試庫和測試表

taos> create database test;
taos>use test;
#這裏我們創建一個和tdengine自帶庫log中log表結構一致的表,後提直接從log.log讀數據存儲到test.log_cp
taos> create table log_cp(
   ->  ts TIMESTAMP,
   ->  level TINYINT,
   ->  content BINARY(80),
   ->  ipaddr BINARY(15)
   -> )

3. Spark讀取TDengine

TDengine雖未提供Spark調用的DataSource,但TDengine本身也支持JDBC,因此,這裏使用spark-jdbc來讀取TDengine,最新版本可以到官網下載,我這裏用的是如下版本:

<dependency>
        <groupId>com.taosdata.jdbc</groupId>
        <artifactId>taos-jdbcdriver</artifactId>
        <version>1.0.3</version>
    </dependency>

關於JDBC的使用,官網有如下提示

由於TDengine是使用C語言開發的,使用taos-jdbcdriver驅動包時需要依賴系統對應的本地函數庫。

1. libtaos.so在Linux系統中成功安裝TDengine後,依賴的本地函數庫libtaos.so文件會被自動拷貝至/usr/lib/libtaos.so,該目錄包含在Linux自動掃描路徑上,無需單獨指定。

2.taos.dll在windows系統中安裝完客戶端之後,驅動包依賴的taos.dll文件會自動拷貝到系統默認搜索路徑C:/Windows/System32下,同樣無需要單獨指定。

第一次使用時,爲了保證機器上有libtaos.so或taos.dll,需要在本地安裝TDengine客戶端(客戶端請至TDengine官網下載) ,Spark的讀取代碼如下:

    val jdbccdf = spark
      .read
      .format("jdbc")
      .option("url", "jdbc:TAOS://192.168.1.151:6030/log")
      .option("driver", "com.taosdata.jdbc.TSDBDriver")
      .option("dbtable", "log")
      .option("user", "root")
      .option("password", "taosdata")
      .option("fetchsize", "1000")
      .load()

4. Spark存TDengine

因爲在讀TDengine的時候,第一個字段ts會被轉換爲decimal,但是存儲時直接存decimal tdengine是不認的,所以需要將ts進行類型轉換

jdbccdf.select(($"ts" / 1000000).cast(TimestampType).as("ts"), $"level", $"content", $"ipaddr")
      .write.format("jdbc")
      .option("url", "jdbc:TAOS://192.168.1.151:6030/test?charset=UTF-8&locale=en_US.UTF-8")
      .option("driver", "com.taosdata.jdbc.TSDBDriver")
      .option("dbtable", "log2")
      .option("user", "root")
      .option("password", "taosdata")
      .mode(SaveMode.Append)
      .save()

5. Spark yarn模式運行TDengine

上面的測試都是基於maser爲local測試的,如果以yarn模式運行,則在每個節點上都安裝TDengine客戶端是不現實的,查看taos-jdbcdriver的代碼,發現,driver會執行System.load(“taos”),也就是說只要java.library.path中存在 libtaos.so,程序就可正常運行,不必安裝TDengine的客戶端,因爲java.library.path是在jvm啓動時就設置好的,要更改它的值,可以採用動態加載,採用如下方法解決了加載libtaos.so的問題:

(1) 將driver端libtaos.so發送到各個executor

spark.sparkContext.addFile("/path/to/libtaos.so")

(2) 重寫Spark中JdbcUtils類中的createConnectionFactory方法,添加

loadLibrary(new File(SparkFiles.get("libtaos.so")).getParent)

進行java.library.path的動態加載

def createConnectionFactory(options: JDBCOptions): () => Connection = {
    val driverClass: String = options.driverClass
    () => {
      loadLibrary(new File(SparkFiles.get("libtaos.so")).getParent)
      DriverRegistry.register(driverClass)
      val driver: Driver = DriverManager.getDrivers.asScala.collectFirst {
        case d: DriverWrapper if d.wrapped.getClass.getCanonicalName == driverClass => d
        case d if d.getClass.getCanonicalName == driverClass => d
      }.getOrElse {
        throw new IllegalStateException(
          s"Did not find registered driver with class $driverClass")
      }
      driver.connect(options.url, options.asConnectionProperties)
    }
  }

(3) loadLibrary方法如下

 def loadLibrary(libPath: String): Unit = {
    var lib = System.getProperty("java.library.path")
    val dirs = lib.split(":")
    if (!dirs.contains(libPath)) {
      lib = lib + s":${libPath}"
      System.setProperty("java.library.path", lib)
      val fieldSysPath = classOf[ClassLoader].getDeclaredField("sys_paths")
      fieldSysPath.setAccessible(true)
      fieldSysPath.set(null, null)
    }
  }

在yarn模式下一定要給url設置charset和locale,如

charset=UTF-8&locale=en_US.UTF-8

否則container可能會異常退出。

6. libtaos.so其他加載方式

本來還嘗試了jna加載libtaos.so的方式,此方式只需將libtaos.so放入項目resources中,程序變回自動搜索到so文件,奈何不會改tdengine中c的代碼。

作者簡介董鴻飛,大數據開發工程師,2015年加入上海理想大數據實施部,工作至今。目前主要負責公司數據總線產品設計和開發。

公司簡介:中國電信上海理想信息產業(集團)有限公司,成立於1999年,註冊資本7000萬元,是上海市投資規模較大的信息技術企業之一。通過整合公司內各事業部多年大型項目實施的整體實力,公司着力鍛造大型信息化項目諮詢規劃和頂層設計能力,構建“智慧社區”、“智慧園區”及“智慧政務”、“智慧醫療”、“智慧物流”等各類智慧行業應用等整體解決方案,可提供IT外包服務和網絡監控運維管理一站式安全解決方案,逐步形成“智慧城市”專業領域產品研發積累和項目交付與平臺運營經驗,鍛造了整體科研隊伍和項目實施團隊的綜合實力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章