分布式定時任務框架Elastic-Job的使用

為什么80%的碼農都做不了架構師?>>> ??hot3.png

一、前言

? ? Elastic-Job是一個優秀的分布式作業調度框架。

????Elastic-Job是一個分布式調度解決方案,由兩個相互獨立的子項目Elastic-Job-Lite和Elastic-Job-Cloud組成。

????Elastic-Job-Lite定位為輕量級無中心化解決方案,使用jar包的形式提供分布式任務的協調服務。

????Elastic-Job-Cloud使用Mesos + Docker的解決方案,額外提供資源治理、應用分發以及進程隔離等服務。

1. Elastic-Job-Lite

  • 分布式調度協調

  • 彈性擴容縮容

  • 失效轉移

  • 錯過執行作業重觸發

  • 作業分片一致性,保證同一分片在分布式環境中僅一個執行實例

  • 自診斷并修復分布式不穩定造成的問題

  • 支持并行調度

  • 支持作業生命周期操作

  • 豐富的作業類型

  • Spring整合以及命名空間提供

  • 運維平臺

2. Elastic-Job-Cloud

  • 應用自動分發

  • 基于Fenzo的彈性資源分配

  • 分布式調度協調

  • 彈性擴容縮容

  • 失效轉移

  • 錯過執行作業重觸發

  • 作業分片一致性,保證同一分片在分布式環境中僅一個執行實例

  • 支持并行調度

  • 支持作業生命周期操作

  • 豐富的作業類型

  • Spring整合

  • 運維平臺

  • 基于Docker的進程隔離(TBD)

二、導讀

? ? 1、Elastic-Job的核心思想

? ? 2、Elastic-Job的基本使用

三、Elastic-Job的核心思想

? ? 對于分布式計算而言,分片是最基本的思想,Elastic-Job也是沿用了這個思想,每個job跑部分數據,所有job執行完成,便是全量數據,官網給出的SimpleJob例子如下:

public class MyElasticJob implements SimpleJob {@Overridepublic void execute(ShardingContext context) {switch (context.getShardingItem()) {case 0: // do something by sharding item 0break;case 1: // do something by sharding item 1break;case 2: // do something by sharding item 2break;// case n: ...}}
}

? ? 用switch case循環來對應分片的業務邏輯,case分片的index,進入業務邏輯執行。當然這里也有不適應的場景,類似于MapReduce需要shuffle的場景就不適合了,比方說,要根據某一個字段全局分組聚合求結果,這時候怎么分片都可能會不合理,因為每個分片只能處理N分之一的數據,沒辦法shuffle再聚合,這一點,也要根據具體的業務來使用。

? ?那么ShardingContext可以拿到那些信息呢?源碼如下

????

public final class ShardingContext {/*** 作業名稱.*/private final String jobName;/*** 作業任務ID.*/private final String taskId;/*** 分片總數.*/private final int shardingTotalCount;/*** 作業自定義參數.* 可以配置多個相同的作業, 但是用不同的參數作為不同的調度實例.*/private final String jobParameter;/*** 分配于本作業實例的分片項.*/private final int shardingItem;/*** 分配于本作業實例的分片參數.*/private final String shardingParameter;public ShardingContext(final ShardingContexts shardingContexts, final int shardingItem) {jobName = shardingContexts.getJobName();taskId = shardingContexts.getTaskId();shardingTotalCount = shardingContexts.getShardingTotalCount();jobParameter = shardingContexts.getJobParameter();this.shardingItem = shardingItem;shardingParameter = shardingContexts.getShardingItemParameters().get(shardingItem);}
}

? ? 以上代碼,jobParameter和shardingItem是最有用的參數,shardingItem決定switch case循環的走向,shardingParameter可以用業務的查詢條件,也可以用字符串拼接的方式組裝很復雜的參數用于特定的業務。

四、Elastic-Job的基本使用

? ? 1、Job配置項

public class ElasticJobConfig {private static CoordinatorRegistryCenter createRegistryCenter() {ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration("127.0.0.1:2181", "elastic-job");CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(zookeeperConfiguration);regCenter.init();return regCenter;}private static LiteJobConfiguration createJobConfiguration() {JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder("jobdemo", "0/5 * * * * ?", 3).shardingItemParameters("0=A,1=A,2=B").failover(true).misfire(true).build();SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig,MyElasticJob.class.getCanonicalName());LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).overwrite(true).build();return simpleJobRootConfig;}public static void main(String[] args) {new JobScheduler(createRegistryCenter(), createJobConfiguration()).init();}
}

? ? 幾點說明:

? ? 注冊中心配置項,設置zookeeper集群地址,我這里用的本地單節點,所以只有一個,當然可以配置任務名稱,命名空間(namespace,本質上會在zk里生成一個目錄),超時時間,最大重試次數等等

????LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).overwrite(true).build()中,overwrite參數非常重要,設置這個參數為true,修改過job配置信息才會覆蓋zookeeper里的數據,要不然不會生效。

? ? 2、SimpleJob的實現

public class MyElasticJob implements SimpleJob {@Overridepublic void execute(ShardingContext shardingContext) {switch (shardingContext.getShardingItem()) {case 0: {System.out.println("當前分片:" + shardingContext.getShardingItem() + "=====" + "參數:"+ shardingContext.getShardingParameter() + " =====" + Thread.currentThread());break;}case 1: {System.out.println("當前分片:" + shardingContext.getShardingItem() + "=====" + "參數:"+ shardingContext.getShardingParameter() + " =====" + Thread.currentThread());break;}case 2: {System.out.println("當前分片:" + shardingContext.getShardingItem() + "=====" + "參數:"+ shardingContext.getShardingParameter() + " =====" + Thread.currentThread());break;}default: {System.out.println("當前分片:" + shardingContext.getShardingItem() + "=====" + "參數:"+ shardingContext.getShardingParameter() + " =====" + Thread.currentThread());break;}}}
}

? ? 上面設置每5秒鐘執行一次,執行ElasticJobConfig的main方法,執行結果如下:

????e2f825efa854fc514fa69bd305ce79df77c.jpg

? ? 從上面的結果,可以看出,執行每個分片的任務,其實是放到一個線程池去執行的,對應的分片信息和參數信息在shardingContext可以拿到,實現業務非常方便。

? ? 最后,如果啟動多個JVM,那么這些任務就分散到各個節點里,如果一個節點宕機,下次觸發任務時,將把該分片任務丟到健康機器執行,這里做到了節點容錯。但是某個分片的任務在執行過程中失敗了,那么這里是不會重新觸發改分片任務的執行的。

?

?

????

轉載于:https://my.oschina.net/u/1778239/blog/3018941

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388114.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388114.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388114.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Memcached和Redis

Memcached和Redis作為兩種Inmemory的key-value數據庫,在設計和思想方面有著很多共通的地方,功能和應用方面在很多場合下(作為分布式緩存服務器使用等) 也很相似,在這里把兩者放在一起做一下對比的介紹 基本架構和思想 首先簡單介紹一下兩者的…

第4章 springboot熱部署 4-1 SpringBoot 使用devtools進行熱部署

/imooc-springboot-starter/src/main/resources/application.properties #關閉緩存, 即時刷新 #spring.freemarker.cachefalse spring.thymeleaf.cachetrue#熱部署生效 spring.devtools.restart.enabledtrue #設置重啟的目錄,添加那個目錄的文件需要restart spring.devtools.r…

border-radius 漲知識的寫法

<div idapp></div>復制代碼#app{width:100%;height:80px;background:pink;border-radius:75%/20% 20% 0 0;}復制代碼僅供自己總結記憶轉載于:https://juejin.im/post/5c80afd66fb9a049f81a1217

ibm python db_使用IBM HR Analytics數據集中的示例的Python獨立性卡方檢驗

ibm python dbSuppose you are exploring a dataset and you want to examine if two categorical variables are dependent on each other.假設您正在探索一個數據集&#xff0c;并且想要檢查兩個分類變量是否相互依賴。 The motivation could be a better understanding of …

Oracle優化檢查表

分類檢查項目相關文件或結果狀態備注日志及文件Oracle Alert 日志bdump/udump下是否存在明顯的報警listener相關日志SQL* Net日志參數/參數文件listener.ora/tnsnames.ora操作系統操作系統版本檢查操作系統補丁節點名操作系統vmstat狀態操作系統I/O狀態操作系統進程情況操作系統…

spring分布式事務學習筆記(2)

此文已由作者夏昀授權網易云社區發布。歡迎訪問網易云社區&#xff0c;了解更多網易技術產品運營經驗。Model類如下&#xff1a;package com.xy.model1 package com.xy.model;2 3 /**4 * Created by helloworld on 2015/1/30.5 */6 public class NameQa {7 private long …

sql 左聯接 全聯接_通過了解自我聯接將您SQL技能提升到一個新的水平

sql 左聯接 全聯接The last couple of blogs that I have written have been great for beginners ( Data Concepts Without Learning To Code or Developing A Data Scientist’s Mindset). But, I would really like to push myself to create content for other members of …

如何查看linux中文件打開情況

如何查看linux中文件打開情況 前言 我們都知道&#xff0c;在linux下&#xff0c;“一切皆文件”&#xff0c;因此有時候查看文件的打開情況&#xff0c;就顯得格外重要&#xff0c;而這里有一個命令能夠在這件事上很好的幫助我們-它就是lsof。 linux下有哪些文件 在介紹lsof命…

hadoop windows

1、安裝JDK1.6或更高版本 官網下載JDK&#xff0c;安裝時注意&#xff0c;最好不要安裝到帶有空格的路徑名下&#xff0c;例如:Programe Files&#xff0c;否則在配置Hadoop的配置文件時會找不到JDK&#xff08;按相關說法&#xff0c;配置文件中的路徑加引號即可解決&#xff…

Ocelot中文文檔入門

入門 Ocelot僅適用于.NET Core&#xff0c;目前是根據netstandard2.0構建的&#xff0c;如果Ocelot適合您&#xff0c;這個文檔可能會有用。 .NET Core 2.1 安裝NuGet包 使用nuget安裝Ocelot及其依賴項。 您需要創建一個netstandard2.0項目并將其打包到其中。 然后按照下面的“…

科學價值 社交關系 大數據_服務的價值:數據科學和用戶體驗研究美好生活

科學價值 社交關系 大數據A crucial part of building a product is understanding exactly how it provides your customers with value. Understanding this is understanding how you fit into the lives of your customers, and should be central to how you build on wha…

在Ubuntu下創建hadoop組和hadoop用戶

一、在Ubuntu下創建hadoop組和hadoop用戶 增加hadoop用戶組&#xff0c;同時在該組里增加hadoop用戶&#xff0c;后續在涉及到hadoop操作時&#xff0c;我們使用該用戶。 1、創建hadoop用戶組 2、創建hadoop用戶 sudo adduser -ingroup hadoop hadoop 回車后會提示輸入新的UNIX…

day06 hashlib模塊

1.hashlib模塊 import hashlib# password123456# print( password.encode()) #加密前先轉成二進制# mhashlib.md5(password.encode())# print(dir(m)) #查詢m的所有方法## print(m.hexdigest()) #使用hexdigest()方法加密&#xff0c;md5加密之后是不可逆&#xff0c;不可以解…

vs azure web_在Azure中遷移和自動化Chrome Web爬網程序的指南。

vs azure webWebscraping as a required skill for many data-science related jobs is becoming increasingly desirable as more companies slowly migrate their processes to the cloud.隨著越來越多的公司將其流程緩慢遷移到云中&#xff0c;將Web爬網作為許多與數據科學相…

hadoop eclipse windows

首先說一下本人的環境: Windows7 64位系統 Spring Tool Suite Version: 3.4.0.RELEASE Hadoop2.6.0 一&#xff0e;簡介 Hadoop2.x之后沒有Eclipse插件工具&#xff0c;我們就不能在Eclipse上調試代碼&#xff0c;我們要把寫好的java代碼的MapReduce打包成jar然后在Linux上運…

同步函數死鎖現象

多線程&#xff1a;一個進程中有多個線程可以同時執行任務 多線程的好處&#xff1a; 1、解決一個進程中可以同時執行多個任務的問題。 2、提高了資源利用率 多線程的弊端&#xff1a; 1、增加了CPU的負擔 2、降低了一個進程中線程的執行概率 3、出現了線程安全問題 4、會引發死…

netstat 在windows下和Linux下查看網絡連接和端口占用

假設忽然起個服務&#xff0c;告訴我8080端口被占用了&#xff0c;OK&#xff0c;我要去看一下是什么服務正在占用著&#xff0c;能不能殺 先假設我是在Windows下&#xff1a; 第一列&#xff1a; Proto 協議 第二列&#xff1a; 本地地址【ip端口】 第三列&#xff1a;遠程地址…

selenium 解析網頁_用Selenium進行網頁搜刮

selenium 解析網頁網頁抓取系列 (WEB SCRAPING SERIES) 總覽 (Overview) Selenium is a portable framework for testing web applications. It is open-source software released under the Apache License 2.0 that runs on Windows, Linux and macOS. Despite serving its m…

表的設計與優化

單表設計與優化 1&#xff09;設計規范化表&#xff0c;消除數據冗余&#xff08;以使用正確字段類型最明顯&#xff09;&#xff1a; 數據庫范式是確保數據庫結構合理&#xff0c;滿足各種查詢需要、避免數據庫操作異常的數據庫設計方式。滿足范式要求的表&#xff0c;稱為規范…

代理ARP協議(Proxy ARP)

代理ARP&#xff08;Proxy-arp&#xff09;的原理就是當出現跨網段的ARP請求時&#xff0c;路由器將自己的MAC返回給發送ARP廣播請求發送者&#xff0c;實現MAC地址代理&#xff08;善意的欺騙&#xff09;&#xff0c;最終使得主機能夠通信。 圖中R1和R3處于不同的局域網&…