/*! jQuery UI - v1.10.1 - 2013-03-08
* http://jqueryui.com
* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.menu.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js, jquery.ui.effect.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js
* Copyright (c) 2013 jQuery Foundation and other contributors Licensed MIT */
(function ($, undefined) {
var uuid = 0,
runiqueId = /^ui-id-\d+$/;
// prevent duplicate loading
// this is only a problem because we proxy existing functions
// and we don't want to double proxy them
$.ui = $.ui || {};
if ($.ui.version) {
return;
}
$.extend($.ui, {
version: "1.10.1",
keyCode: {
BACKSPACE: 8,
COMMA: 188,
DELETE: 46,
DOWN: 40,
END: 35,
ENTER: 13,
ESCAPE: 27,
HOME: 36,
LEFT: 37,
NUMPAD_ADD: 107,
NUMPAD_DECIMAL: 110,
NUMPAD_DIVIDE: 111,
NUMPAD_ENTER: 108,
NUMPAD_MULTIPLY: 106,
NUMPAD_SUBTRACT: 109,
PAGE_DOWN: 34,
PAGE_UP: 33,
PERIOD: 190,
RIGHT: 39,
SPACE: 32,
TAB: 9,
UP: 38
}
});
// plugins
$.fn.extend({
_focus: $.fn.focus,
focus: function (delay, fn) {
return typeof delay === "number" ? this.each(function () {
var elem = this;
setTimeout(function () {
$(elem).focus();
if (fn) {
fn.call(elem);
}
}, delay);
}) : this._focus.apply(this, arguments);
},
scrollParent: function () {
var scrollParent;
if (($.ui.ie && (/(static|relative)/).test(this.css("position")))
|| (/absolute/).test(this.css("position"))) {
scrollParent = this.parents().filter(function () {
return (/(relative|absolute|fixed)/).test($.css(this, "position"))
&& (/(auto|scroll)/).test($.css(this, "overflow") + $.css(this,
"overflow-y") + $.css(this, "overflow-x"));
}).eq(0);
} else {
scrollParent = this.parents().filter(function () {
return (/(auto|scroll)/).test($.css(this, "overflow") + $.css(this,
"overflow-y") + $.css(this, "overflow-x"));
}).eq(0);
}
return (/fixed/).test(this.css("position")) || !scrollParent.length ? $(
document) : scrollParent;
},
zIndex: function (zIndex) {
if (zIndex !== undefined) {
return this.css("zIndex", zIndex);
}
if (this.length) {
var elem = $(this[0]), position, value;
while (elem.length && elem[0] !== document) {
// Ignore z-index if position is set to a value where z-index is ignored by the browser
// This makes behavior of this function consistent across browsers
// WebKit always returns auto if the element is positioned
position = elem.css("position");
if (position === "absolute" || position === "relative" || position
=== "fixed") {
// IE returns 0 when zIndex is not specified
// other browsers return a string
// we ignore the case of nested elements with an explicit value of 0
// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
value = parseInt(elem.css("zIndex"), 10);
if (!isNaN(value) && value !== 0) {
return value;
}
}
elem = elem.parent();
}
}
return 0;
},
uniqueId: function () {
return this.each(function () {
if (!this.id) {
this.id = "ui-id-" + (++uuid);
}
});
},
removeUniqueId: function () {
return this.each(function () {
if (runiqueId.test(this.id)) {
$(this).removeAttr("id");
}
});
}
});
// selectors
function focusable(element, isTabIndexNotNaN) {
var map, mapName, img,
nodeName = element.nodeName.toLowerCase();
if ("area" === nodeName) {
map = element.parentNode;
mapName = map.name;
if (!element.href || !mapName || map.nodeName.toLowerCase() !== "map") {
return false;
}
img = $("img[usemap=#" + mapName + "]")[0];
return !!img && visible(img);
}
return ( /input|select|textarea|button|object/.test(nodeName)
? !element.disabled : "a" === nodeName ? element.href
|| isTabIndexNotNaN : isTabIndexNotNaN) &&
// the element and all of its ancestors must be visible
visible(element);
}
function visible(element) {
return $.expr.filters.visible(element) &&
!$(element).parents().addBack().filter(function () {
return $.css(this, "visibility") === "hidden";
}).length;
}
$.extend($.expr[":"], {
data: $.expr.createPseudo ? $.expr.createPseudo(function (dataName) {
return function (elem) {
return !!$.data(elem, dataName);
};
}) : // support: jQuery <1.8
function (elem, i, match) {
return !!$.data(elem, match[3]);
},
focusable: function (element) {
return focusable(element, !isNaN($.attr(element, "tabindex")));
},
tabbable: function (element) {
var tabIndex = $.attr(element, "tabindex"),
isTabIndexNaN = isNaN(tabIndex);
return ( isTabIndexNaN || tabIndex >= 0 ) && focusable(element,
!isTabIndexNaN);
}
});
// support: jQuery <1.8
if (!$("<a>").outerWidth(1).jquery) {
$.each(["Width", "Height"], function (i, name) {
var side = name === "Width" ? ["Left", "Right"] : ["Top", "Bottom"],
type = name.toLowerCase(),
orig = {
innerWidth: $.fn.innerWidth,
innerHeight: $.fn.innerHeight,
outerWidth: $.fn.outerWidth,
outerHeight: $.fn.outerHeight
};
function reduce(elem, size, border, margin) {
$.each(side, function () {
size -= parseFloat($.css(elem, "padding" + this)) || 0;
if (border) {
size -= parseFloat($.css(elem, "border" + this + "Width")) || 0;
}
if (margin) {
size -= parseFloat($.css(elem, "margin" + this)) || 0;
}
});
return size;
}
$.fn["inner" + name] = function (size) {
if (size === undefined) {
return orig["inner" + name].call(this);
}
return this.each(function () {
$(this).css(type, reduce(this, size) + "px");
});
};
$.fn["outer" + name] = function (size, margin) {
if (typeof size !== "number") {
return orig["outer" + name].call(this, size);
}
return this.each(function () {
$(this).css(type, reduce(this, size, true, margin) + "px");
});
};
});
}
// support: jQuery <1.8
if (!$.fn.addBack) {
$.fn.addBack = function (selector) {
return this.add(
selector == null ? this.prevObject : this.prevObject.filter(selector)
);
};
}
// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
if ($("<a>").data("a-b", "a").removeData("a-b").data("a-b")) {
$.fn.removeData = (function (removeData) {
return function (key) {
if (arguments.length) {
return removeData.call(this, $.camelCase(key));
} else {
return removeData.call(this);
azkaban-web-server
需积分: 0 78 浏览量
更新于2023-11-10
收藏 55.83MB GZ 举报
**Azkaban Web Server 4.0.0:分布式任务调度平台详解**
Azkaban Web Server 是一个开源的、基于Web的作业调度系统,主要用于大数据处理工作流的管理和执行。在4.0.0版本中,它提供了更稳定、高效和易用的特性,旨在帮助用户更方便地管理复杂的数据处理流程。
### **1. 分布式架构**
Azkaban Web Server 的核心特性之一是其分布式架构。它允许将工作负载分散到多个节点上,以提高执行效率和容错能力。分布式设计使得Azkaban能够处理大规模的工作流,并确保即使在单个节点故障的情况下也能继续运行,提高了系统的整体可用性。
### **2. 作业与工作流**
在Azkaban中,作业(Job)是执行的基本单元,可以是一个简单的命令、脚本或Hadoop作业。工作流(Workflow)是由一系列按特定顺序执行的作业组成的逻辑单元。Azkaban支持条件分支和循环,使用户能够构建复杂的依赖关系网络,实现灵活的任务调度。
### **3. 用户界面与权限管理**
Azkaban Web Server 提供了一个直观的Web界面,用于创建、编辑和管理工作流。用户可以通过界面上传作业、定义工作流依赖,并进行调度。此外,Azkaban还支持用户和角色的权限管理,允许管理员对不同用户分配不同的操作权限,保证数据安全和操作规范。
### **4. 安全与认证**
Azkaban 4.0.0 版本增强了安全性和认证机制。通过整合Kerberos、LDAP等认证方式,可以更好地保护系统资源,确保只有授权用户才能访问和操作。
### **5. 监控与日志**
监控是Azkaban的重要组成部分,它提供了详细的作业执行状态和工作流历史记录。用户可以实时查看作业的运行情况,包括进度、耗时、输出等信息。同时,完善的日志系统可以帮助排查问题,优化性能。
### **6. 集成与扩展**
Azkaban与多种大数据工具如Hadoop、Spark、Pig等有良好的集成,可以直接调度这些工具的作业。此外,Azkaban还提供API和插件机制,方便用户根据实际需求进行扩展和定制。
### **7. 调度策略**
Azkaban 支持多种调度策略,如定时调度、依赖触发、手动触发等。用户可以根据业务需求设置调度规则,例如设定在特定时间执行,或者在前一个作业成功后自动启动下一个作业。
### **8. 持久化存储**
Azkaban使用数据库来持久化工作流定义和作业状态,这确保了在系统重启或故障后,工作流和作业信息不会丢失。4.0.0版本可能进一步优化了数据存储和检索的性能。
### **9. 事件触发与通知**
Azkaban允许配置作业执行完成后的通知,如邮件、短信或Slack消息,确保团队及时了解任务执行结果。
Azkaban Web Server 4.0.0是一个功能强大的分布式任务调度平台,它简化了大数据处理工作流的管理,提供了高可用性、可扩展性和安全性,是企业级大数据项目理想的作业调度解决方案。通过深入理解和运用这些特性,用户可以更有效地组织和执行复杂的计算任务。
爱喝可乐的老王
- 粉丝: 584
- 资源: 3