Spark 如何寫入HBase/Redis/MySQL/Kafka
這篇文章是給Spark初學者寫的,老手就不要看了。文章談及如何和HBase/Redis/MySQL/Kafka等進行互動的方法,主要是為了讓大家明白其內部機制
一些概念
一個partition 對應一個task,一個task 必定存在於一個Executor,一個Executor 對應一個JVM.
Partition 是一個可迭代資料集合
Task 本質是作用於Partition的執行緒
問題
Task 裡如何使用Kafka Producer 將資料傳送到Kafaka呢。 其他譬如HBase/Redis/MySQL 也是如此。
解決方案
直觀的解決方案自然是能夠在Executor(JVM)裡有個Prodcuer Pool(或者共享單個Producer例項),但是我們的程式碼都是
現在Driver端執行,然後將一些函式序列化到Executor端執行,這裡就有序列化問題,正常如Pool,Connection都是無法序列化的。
一個簡單的解決辦法是定義個Object 類,
譬如
object SimpleHBaseClient { private val DEFAULT_ZOOKEEPER_QUORUM = "127.0.0.1:2181" private lazy val (table, conn) = createConnection def bulk(items:Iterator) = { items.foreach(conn.put(_)) conn.flush.... } ...... }
然後保證這個類在map,foreachRDD等函式下使用,譬如:
dstream.foreachRDD{ rdd => rdd.foreachPartition{iter=> SimpleHBaseClient.bulk(iter) } }
為什麼要保證放到foreachRDD /map 等這些函式里呢?
Spark的機制是先將使用者的程式作為一個單機執行(執行者是Driver),Driver透過序列化機制,將對應運算元規定的函式傳送到Executor進行執行。這裡,foreachRDD/map 等函式都是會傳送到Executor執行的,Driver端並不會執行。裡面引用的object 類 會作為一個stub 被序列化過去,object內部屬性的的初始化其實是在Executor端完成的,所以可以避過序列化的問題。
Pool也是類似的做法。然而我們並不建議使用pool,因為Spark 本身已經是分散式的,舉個例子可能有100個executor,如果每個executor再搞10個connection
的pool,則會有100*10 個連結,Kafka也受不了。一個Executor 維持一個connection就好。
關於Executor掛掉丟資料的問題,其實就看你什麼時候flush,這是一個效能的權衡。
作者:祝威廉
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/855/viewspace-2818918/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- spark 批次寫入redis控制SparkRedis
- Mysql增量寫入Hdfs(一) --將Mysql資料寫入Kafka TopicMySqlKafka
- FlinkSQL寫入Kafka/ES/MySQL示例-JAVAKafkaMySqlJava
- Spark拉取Kafka的流資料,轉插入HBase中SparkKafka
- 17-Flink消費Kafka寫入MysqlKafkaMySql
- spark與hbaseSpark
- kafka+storm+hbaseKafkaORM
- HBase實操:HBase-Spark-Read-Demo 分享Spark
- 利用flink從kafka接收訊息,統計結果寫入mysql,訊息寫入hiveKafkaMySqlHive
- spark寫入hive資料SparkHive
- Flink 1.9 實戰:使用 SQL 讀取 Kafka 並寫入 MySQLKafkaMySql
- HBase2實戰:HBase Flink和Kafka整合Kafka
- spark structed streaming 寫入hudi表SparkStruct
- HBase BulkLoad批量寫入資料實戰
- spark讀取hbase的資料Spark
- 實戰|使用Spark Streaming寫入HudiSpark
- 每秒570000的寫入,MySQL如何實現?MySql
- MySQL 每秒 570000 的寫入,如何實現?MySql
- MapReduce和Spark讀取HBase快照表Spark
- spark與kafaka整合workcount示例 spark-stream-kafkaSparkKafka
- go kafka 單機寫入 50wGoKafka
- kafka:spark-project專案的kafka和scala配置KafkaSparkProject
- 《從0到1學習Flink》—— Flink 讀取 Kafka 資料批量寫入到 MySQLKafkaMySql
- CDH版Hadoop-zookeeper-hbase-spark安裝文件HadoopSpark
- 實時數倉之Flink消費kafka訊息佇列資料入hbaseKafka佇列
- spark sql與mysql 資料載入與匯出資料到mysqlSparkMySql
- HBase入門教程
- 探索Redis與MySQL的雙寫問題RedisMySql
- Spark Streaming,Flink,Storm,Kafka Streams,Samza:如何選擇流處理框架SparkORMKafka框架
- Spark Streaming 之 Kafka 偏移量管理SparkKafka
- Flink從Kafka取數WordCount後TableApi寫入ESKafkaAPI
- Logstash讀取Kafka資料寫入HDFS詳解Kafka
- Kafka和Redis如何解決流處理挑戰KafkaRedis
- 【重製版】全網最詳細ubuntu虛擬機器搭建hadoop+spark+zookeeper+hbase+kafka大資料環境Ubuntu虛擬機HadoopSparkKafka大資料
- Windows 下 MySQL 資料匯入 RedisWindowsMySqlRedis
- kafka及redis基礎KafkaRedis
- python excel 內容寫入mysqlPythonExcelMySql
- Debezium結合Kafka Connect實時捕獲MySQL變更事件寫入Elasticsearch實現搜尋流程KafkaMySql事件Elasticsearch