http://git-wip-us.apache.org/repos/asf/eagle/blob/0ecb7c1c/eagle-site/_site/js/jquery.singlePageNav.js ---------------------------------------------------------------------- diff --git a/eagle-site/_site/js/jquery.singlePageNav.js b/eagle-site/_site/js/jquery.singlePageNav.js new file mode 100755 index 0000000..f779ad0 --- /dev/null +++ b/eagle-site/_site/js/jquery.singlePageNav.js @@ -0,0 +1,183 @@ +/** + * Single Page Nav Plugin + * Copyright (c) 2013 Chris Wojcik <[email protected]> + * Dual licensed under MIT and GPL. + * @author Chris Wojcik + * @version 1.1.0 + */ + +// Utility +if (typeof Object.create !== 'function') { + Object.create = function(obj) { + function F() {} + F.prototype = obj; + return new F(); + }; +} + +(function($, window, document, undefined) { + "use strict"; + + var SinglePageNav = { + + init: function(options, container) { + + this.options = $.extend({}, $.fn.singlePageNav.defaults, options); + + this.container = container; + this.$container = $(container); + this.$links = this.$container.find('a'); + + if (this.options.filter !== '') { + this.$links = this.$links.filter(this.options.filter); + } + + this.$window = $(window); + this.$htmlbody = $('html, body'); + + this.$links.on('click.singlePageNav', $.proxy(this.handleClick, this)); + + this.didScroll = false; + this.checkPosition(); + this.setTimer(); + }, + + handleClick: function(e) { + var self = this, + link = e.currentTarget, + $elem = $(link.hash); + + e.preventDefault(); + + if ($elem.length) { // Make sure the target elem exists + + + // Prevent active link from cycling during the scroll + self.clearTimer(); + + // Before scrolling starts + if (typeof self.options.beforeStart === 'function') { + self.options.beforeStart(); + } + + self.setActiveLink(link.hash); + + self.scrollTo($elem, function() { + + if (self.options.updateHash) { + document.location.hash = link.hash; + } + + self.setTimer(); + + // After scrolling ends + if (typeof self.options.onComplete === 'function') { + self.options.onComplete(); + } + }); + } + }, + + scrollTo: function($elem, callback) { + var self = this; + var target = self.getCoords($elem).top; + var called = false; + + self.$htmlbody.stop().animate( + {scrollTop: target}, + { + duration: self.options.speed, + easing: self.options.easing, + complete: function() { + if (typeof callback === 'function' && !called) { + callback(); + } + called = true; + } + } + ); + }, + + setTimer: function() { + var self = this; + + self.$window.on('scroll.singlePageNav', function() { + self.didScroll = true; + }); + + self.timer = setInterval(function() { + if (self.didScroll) { + self.didScroll = false; + self.checkPosition(); + } + }, 250); + }, + + clearTimer: function() { + clearInterval(this.timer); + this.$window.off('scroll.singlePageNav'); + this.didScroll = false; + }, + + // Check the scroll position and set the active section + checkPosition: function() { + var scrollPos = this.$window.scrollTop(); + var currentSection = this.getCurrentSection(scrollPos); + this.setActiveLink(currentSection); + }, + + getCoords: function($elem) { + return { + top: Math.round($elem.offset().top) - this.options.offset + }; + }, + + setActiveLink: function(href) { + var $activeLink = this.$container.find("a[href='" + href + "']"); + + if (!$activeLink.hasClass(this.options.currentClass)) { + this.$links.removeClass(this.options.currentClass); + $activeLink.addClass(this.options.currentClass); + } + }, + + getCurrentSection: function(scrollPos) { + var i, hash, coords, section; + + for (i = 0; i < this.$links.length; i++) { + hash = this.$links[i].hash; + + if ($(hash).length) { + coords = this.getCoords($(hash)); + + if (scrollPos >= coords.top - this.options.threshold) { + section = hash; + } + } + } + + // The current section or the first link + return section || this.$links[0].hash; + } + }; + + $.fn.singlePageNav = function(options) { + return this.each(function() { + var singlePageNav = Object.create(SinglePageNav); + singlePageNav.init(options, this); + }); + }; + + $.fn.singlePageNav.defaults = { + offset: 0, + threshold: 120, + speed: 400, + currentClass: 'current', + easing: 'swing', + updateHash: false, + filter: '', + onComplete: false, + beforeStart: false + }; + +})(jQuery, window, document); \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/eagle/blob/0ecb7c1c/eagle-site/_site/js/modernizr.min.js ---------------------------------------------------------------------- diff --git a/eagle-site/_site/js/modernizr.min.js b/eagle-site/_site/js/modernizr.min.js new file mode 100755 index 0000000..f54037e --- /dev/null +++ b/eagle-site/_site/js/modernizr.min.js @@ -0,0 +1 @@ +window.Modernizr=function(e,t,n){function r(e,t){var n=e.charAt(0).toUpperCase()+e.substr(1),r=(e+" "+C.join(n+" ")+n).split(" ");return o(r,t)}function o(e,t){for(var r in e)if(v[e[r]]!==n)return"pfx"==t?e[r]:!0;return!1}function i(e,t){return!!~(""+e).indexOf(t)}function a(e,t){return typeof e===t}function s(e,t){return c(x.join(e+";")+(t||""))}function c(e){v.cssText=e}var l,u,f,d="2.0.6",p={},m=!0,h=t.documentElement,g=(t.head||t.getElementsByTagName("head")[0],"modernizr"),y=t.createElement(g),v=y.style,b=":)",x=(Object.prototype.toString," -webkit- -moz- -o- -ms- -khtml- ".split(" ")),C="Webkit Moz O ms Khtml".split(" "),E={},S=[],T=function(e,n,r,o){var i,a,s,c=t.createElement("div");if(parseInt(r,10))for(;r--;)s=t.createElement("div"),s.id=o?o[r]:g+(r+1),c.appendChild(s);return i=["­","<style>",e,"</style>"].join(""),c.id=g,c.innerHTML+=i,h.appendChild(c),a=n(c,e),c.parentNode.removeChild(c),!!a},w={}.hasOwnProperty;f=a(w,n)||a(w.call,n)?function(e,t){return t in e&&a(e. constructor.prototype[t],n)}:function(e,t){return w.call(e,t)};!function(e,n){var r=e.join(""),o=n.length;T(r,function(e,n){for(var r=t.styleSheets[t.styleSheets.length-1],i=r.cssRules&&r.cssRules[0]?r.cssRules[0].cssText:r.cssText||"",a=e.childNodes,s={};o--;)s[a[o].id]=a[o];p.csstransforms3d=9===s.csstransforms3d.offsetLeft,p.generatedcontent=s.generatedcontent.offsetHeight>=1,p.fontface=/src/i.test(i)&&0===i.indexOf(n.split(" ")[0])},o,n)}(['@font-face {font-family:"font";src:url("https://")}',["@media (",x.join("transform-3d),("),g,")","{#csstransforms3d{left:9px;position:absolute}}"].join(""),['#generatedcontent:after{content:"',b,'";visibility:hidden}'].join("")],["fontface","csstransforms3d","generatedcontent"]);E.flexbox=function(){function e(e,t,n,r){e.style.cssText=x.join(t+":"+n+";")+(r||"")}function n(e,t,n,r){t+=":",e.style.cssText=(t+x.join(n+";"+t)).slice(0,-t.length)+(r||"")}var r=t.createElement("div"),o=t.createElement("div");n(r,"display","box","width:42px;padding :0;"),e(o,"box-flex","1","width:10px;"),r.appendChild(o),h.appendChild(r);var i=42===o.offsetWidth;return r.removeChild(o),h.removeChild(r),i},E.rgba=function(){return c("background-color:rgba(150,255,150,.5)"),i(v.backgroundColor,"rgba")},E.hsla=function(){return c("background-color:hsla(120,40%,100%,.5)"),i(v.backgroundColor,"rgba")||i(v.backgroundColor,"hsla")},E.multiplebgs=function(){return c("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(v.background)},E.backgroundsize=function(){return r("backgroundSize")},E.borderimage=function(){return r("borderImage")},E.borderradius=function(){return r("borderRadius")},E.boxshadow=function(){return r("boxShadow")},E.textshadow=function(){return""===t.createElement("div").style.textShadow},E.opacity=function(){return s("opacity:.55"),/^0.55$/.test(v.opacity)},E.cssanimations=function(){return r("animationName")},E.csscolumns=function(){return r("columnCount")},E.cssgradients=function(){var e="background -image:",t="gradient(linear,left top,right bottom,from(#9f9),to(white));",n="linear-gradient(left top,#9f9, white);";return c((e+x.join(t+e)+x.join(n+e)).slice(0,-e.length)),i(v.backgroundImage,"gradient")},E.cssreflections=function(){return r("boxReflect")},E.csstransforms=function(){return!!o(["transformProperty","WebkitTransform","MozTransform","OTransform","msTransform"])},E.csstransforms3d=function(){var e=!!o(["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"]);return e&&"webkitPerspective"in h.style&&(e=p.csstransforms3d),e},E.csstransitions=function(){return r("transitionProperty")},E.fontface=function(){return p.fontface},E.generatedcontent=function(){return p.generatedcontent};for(var j in E)f(E,j)&&(u=j.toLowerCase(),p[u]=E[j](),S.push((p[u]?"":"no-")+u));return c(""),y=l=null,e.attachEvent&&function(){var e=t.createElement("div");return e.innerHTML="<elem></elem>",1!==e.childNodes.length}()&&function(e,t){function r(e){for(var t=-1 ;++t<c;)e.createElement(s[t])}e.iepp=e.iepp||{};var o,i=e.iepp,a=i.html5elements||"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",s=a.split("|"),c=s.length,l=new RegExp("(^|\\s)("+a+")","gi"),u=new RegExp("<(/*)("+a+")","gi"),f=/^\s*[\{\}]\s*$/,d=new RegExp("(^|[^\\n]*?\\s)("+a+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),p=t.createDocumentFragment(),m=t.documentElement,h=m.firstChild,g=t.createElement("body"),y=t.createElement("style"),v=/print|all/;i.getCSS=function(e,t){if(e+""===n)return"";for(var r,o=-1,a=e.length,s=[];++o<a;)r=e[o],r.disabled||(t=r.media||t,v.test(t)&&s.push(i.getCSS(r.imports,t),r.cssText),t="all");return s.join("")},i.parseCSS=function(e){for(var t,n=[];null!=(t=d.exec(e));)n.push(((f.exec(t[1])?"\n":t[1])+t[2]+t[3]).replace(l,"$1.iepp_$2")+t[4]);return n.join("\n")},i.writeHTML=function(){var e=-1;for(o=o||t.body;++e<c;)for(var n=t.getElementsByTagName(s[e]),r=n.lengt h,i=-1;++i<r;)n[i].className.indexOf("iepp_")<0&&(n[i].className+=" iepp_"+s[e]);p.appendChild(o),m.appendChild(g),g.className=o.className,g.id=o.id,g.innerHTML=o.innerHTML.replace(u,"<$1font")},i._beforePrint=function(){y.styleSheet.cssText=i.parseCSS(i.getCSS(t.styleSheets,"all")),i.writeHTML()},i.restoreHTML=function(){g.innerHTML="",m.removeChild(g),m.appendChild(o)},i._afterPrint=function(){i.restoreHTML(),y.styleSheet.cssText=""},r(t),r(p),i.disablePP||(h.insertBefore(y,h.firstChild),y.media="print",y.className="iepp-printshim",e.attachEvent("onbeforeprint",i._beforePrint),e.attachEvent("onafterprint",i._afterPrint))}(e,t),p._version=d,p._prefixes=x,p._domPrefixes=C,p.testProp=function(e){return o([e])},p.testAllProps=r,p.testStyles=T,h.className=h.className.replace(/\bno-js\b/,"")+(m?" js "+S.join(" "):""),p}(this,this.document),function(e,t,n){function r(e){return!e||"loaded"==e||"complete"==e}function o(){for(var e=1,t=-1;y.length-++t&&(!y[t].s||(e=y[t].r)););e&&s()}functio n i(e){var n,i=t.createElement("script");i.src=e.s,i.onreadystatechange=i.onload=function(){!n&&r(i.readyState)&&(n=1,o(),i.onload=i.onreadystatechange=null)},m(function(){n||(n=1,o())},d.errorTimeout),e.e?i.onload():h.parentNode.insertBefore(i,h)}function a(e){var n,r=t.createElement("link");if(r.href=e.s,r.rel="stylesheet",r.type="text/css",e.e||!S&&!b)r.onload=function(){n||(n=1,m(function(){o()},0))},e.e&&r.onload();else{var i=function(e){m(function(){if(!n)try{e.sheet.cssRules.length?(n=1,o()):i(e)}catch(t){1e3==t.code||"security"==t.message||"denied"==t.message?(n=1,m(function(){o()},0)):i(e)}},0)};i(r)}m(function(){n||(n=1,o())},d.errorTimeout),!e.e&&h.parentNode.insertBefore(r,h)}function s(){var e=y.shift();v=1,e?e.t?m(function(){"c"==e.t?a(e):i(e)},0):(e(),o()):v=0}function c(e,n,i,a,c,l){function u(){!p&&r(f.readyState)&&(g.r=p=1,!v&&o(),f.onload=f.onreadystatechange=null,m(function(){C.removeChild(f)},0))}var f=t.createElement(e),p=0,g={t:i,s:n,e:l};f.src=f.data=n,!x&&(f .style.display="none"),f.width=f.height="0","object"!=e&&(f.type=i),f.onload=f.onreadystatechange=u,"img"==e?f.onerror=u:"script"==e&&(f.onerror=function(){g.e=g.r=1,s()}),y.splice(a,0,g),C.insertBefore(f,x?null:h),m(function(){p||(C.removeChild(f),g.r=g.e=p=1,o())},d.errorTimeout)}function l(e,t,n){var r="c"==t?j:w;return v=0,t=t||"j",N(e)?c(r,e,t,this.i++,p,n):(y.splice(this.i++,0,e),1==y.length&&s()),this}function u(){var e=d;return e.loader={load:l,i:0},e}var f,d,p=t.documentElement,m=e.setTimeout,h=t.getElementsByTagName("script")[0],g={}.toString,y=[],v=0,b="MozAppearance"in p.style,x=b&&!!t.createRange().compareNode,C=x?p:h.parentNode,E=e.opera&&"[object Opera]"==g.call(e.opera),S="webkitAppearance"in p.style,T=S&&"async"in t.createElement("script"),w=b?"object":E||T?"img":"script",j=S?"img":w,k=Array.isArray||function(e){return"[object Array]"==g.call(e)},P=function(e){return Object(e)===e},N=function(e){return"string"==typeof e},M=function(e){return"[object Function]"==g.ca ll(e)},L=[],O={};d=function(e){function t(e){var t,n,r=e.split("!"),o=L.length,i=r.pop(),a=r.length,s={url:i,origUrl:i,prefixes:r};for(n=0;a>n;n++)t=O[r[n]],t&&(s=t(s));for(n=0;o>n;n++)s=L[n](s);return s}function r(e,r,o,i,a){var s=t(e),c=s.autoCallback;if(!s.bypass){if(r&&(r=M(r)?r:r[e]||r[i]||r[e.split("/").pop().split("?")[0]]),s.instead)return s.instead(e,r,o,i,a);o.load(s.url,s.forceCSS||!s.forceJS&&/css$/.test(s.url)?"c":n,s.noexec),(M(r)||M(c))&&o.load(function(){u(),r&&r(s.origUrl,a,i),c&&c(s.origUrl,a,i)})}}function o(e,t){function n(e){if(N(e))r(e,c,t,0,i);else if(P(e))for(o in e)e.hasOwnProperty(o)&&r(e[o],c,t,o,i)}var o,i=!!e.test,a=i?e.yep:e.nope,s=e.load||e.both,c=e.callback;n(a),n(s),e.complete&&t.load(e.complete)}var i,a,s=this.yepnope.loader;if(N(e))r(e,0,s,0);else if(k(e))for(i=0;i<e.length;i++)a=e[i],N(a)?r(a,0,s,0):k(a)?d(a):P(a)&&o(a,s);else P(e)&&o(e,s)},d.addPrefix=function(e,t){O[e]=t},d.addFilter=function(e){L.push(e)},d.errorTimeout=1e4,null==t.readyState&& t.addEventListener&&(t.readyState="loading",t.addEventListener("DOMContentLoaded",f=function(){t.removeEventListener("DOMContentLoaded",f,0),t.readyState="complete"},0)),e.yepnope=u()}(this,this.document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))}; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/eagle/blob/0ecb7c1c/eagle-site/_site/js/responsiveCarousel.min.js ---------------------------------------------------------------------- diff --git a/eagle-site/_site/js/responsiveCarousel.min.js b/eagle-site/_site/js/responsiveCarousel.min.js new file mode 100755 index 0000000..e42631b --- /dev/null +++ b/eagle-site/_site/js/responsiveCarousel.min.js @@ -0,0 +1,7 @@ +/*! responsiveCarousel.JS - v1.2.0 + * http://basilio.github.com/responsiveCarousel + * + * Copyright (c) 2013 Basilio C�ceres <[email protected]>; + * Licensed under the MIT license */ + +(function(e){"use strict";e.fn.carousel=function(t){var n,r;n={infinite:true,visible:1,speed:"fast",overflow:false,autoRotate:false,navigation:e(this).data("navigation"),itemMinWidth:0,itemEqualHeight:false,itemMargin:0,itemClassActive:"crsl-active",imageWideClass:"wide-image",carousel:true};return e(this).each(function(){r=e(this);if(e.isEmptyObject(t)===false)e.extend(n,t);if(e.isEmptyObject(e(r).data("crsl"))===false)e.extend(n,e(r).data("crsl"));n.isTouch="ontouchstart"in document.documentElement||navigator.userAgent.match(/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile/i)?true:false;r.init=function(){n.total=e(r).find(".crsl-item").length;n.itemWidth=e(r).outerWidth();n.visibleDefault=n.visible;n.swipeDistance=null;n.swipeMinDistance=100;n.startCoords={};n.endCoords={};e(r).css({width:"100%"});e(r).find(".crsl-item").css({position:"relative","float":"left",overflow:"hidden",height:"auto"});e(r).find("."+n.imageWideClass).each(function(){e(this).css({display:"block",wid th:"100%",height:"auto"})});e(r).find(".crsl-item iframe").attr({width:"100%"});if(n.carousel)e(r).find(".crsl-item:first-child").addClass(n.itemClassActive);if(n.carousel&&n.infinite&&n.visible<n.total)e(r).find(".crsl-item:first-child").before(e(".crsl-item:last-child",r));if(n.overflow===false){e(r).css({overflow:"hidden"})}else{e("html, body").css({"overflow-x":"hidden"})}e(r).trigger("initCarousel",[n,r]);r.testPreload();r.config();r.initRotate();r.triggerNavs()};r.testPreload=function(){if(e(r).find("img").length>0){var t=e(r).find("img").length,i=1;e(r).find("img").each(function(){r.preloadImage(this,i,t);i++})}else{e(r).trigger("loadedCarousel",[n,r])}};r.preloadImage=function(t,i,s){var o=new Image,u={};u.src=e(t).attr("src")!==undefined?t.src:"";u.alt=e(t).attr("alt")!==undefined?t.alt:"";e(o).attr(u);e(o).on("load",function(){if(i===1)e(r).trigger("loadingImagesCarousel",[n,r]);if(i===s)e(r).trigger("loadedImagesCarousel",[n,r])})};r.config=function(){n.itemWidth=Math.flo or((e(r).outerWidth()-n.itemMargin*(n.visibleDefault-1))/n.visibleDefault);if(n.itemWidth<=n.itemMinWidth){n.visible=Math.floor((e(r).outerWidth()-n.itemMargin*(n.visible-1))/n.itemMinWidth)===1?Math.floor(e(r).outerWidth()/n.itemMinWidth):Math.floor((e(r).outerWidth()-n.itemMargin)/n.itemMinWidth);n.visible=n.visible<1?1:n.visible;n.itemWidth=n.visible===1?Math.floor(e(r).outerWidth()):Math.floor((e(r).outerWidth()-n.itemMargin*(n.visible-1))/n.visible)}else{n.visible=n.visibleDefault}if(n.carousel){r.wrapWidth=Math.floor((n.itemWidth+n.itemMargin)*n.total);r.wrapMargin=r.wrapMarginDefault=n.infinite&&n.visible<n.total?parseInt((n.itemWidth+n.itemMargin)*-1,10):0;if(n.infinite&&n.visible<n.total&&e(r).find(".crsl-item."+n.itemClassActive).index()===0){e(r).find(".crsl-item:first-child").before(e(".crsl-item:last-child",r));r.wrapMargin=r.wrapMarginDefault=parseInt((n.itemWidth+n.itemMargin)*-1,10)}e(r).find(".crsl-wrap").css({width:r.wrapWidth+"px",marginLeft:r.wrapMargin})}else{r. wrapWidth=e(r).outerWidth();e(r).find(".crsl-wrap").css({width:r.wrapWidth+n.itemMargin+"px"});e("#"+n.navigation).hide()}e(r).find(".crsl-item").css({width:n.itemWidth+"px",marginRight:n.itemMargin+"px"});r.equalHeights();if(n.carousel){if(n.visible>=n.total){n.autoRotate=false;e("#"+n.navigation).hide()}else{e("#"+n.navigation).show()}}};r.equalHeights=function(){if(n.itemEqualHeight!==false){var t=0;e(r).find(".crsl-item").each(function(){e(this).css({height:"auto"});if(e(this).outerHeight()>t){t=e(this).outerHeight()}});e(r).find(".crsl-item").css({height:t+"px"})}return true};r.initRotate=function(){if(n.autoRotate!==false){r.rotateTime=window.setInterval(function(){r.rotate()},n.autoRotate)}};r.triggerNavs=function(){e("#"+n.navigation).delegate(".previous, .next","click",function(t){t.preventDefault();r.prepareExecute();if(e(this).hasClass("previous")&&r.testPrevious(r.itemActive)){r.previous()}else if(e(this).hasClass("next")&&r.testNext()){r.next()}else{return}})};r.prepare Execute=function(){if(n.autoRotate){clearInterval(r.rotateTime)}r.preventAnimateEvent();r.itemActive=e(r).find(".crsl-item."+n.itemClassActive);return true};r.preventAnimateEvent=function(){if(e(r).find(".crsl-wrap:animated").length>0){return false}};r.rotate=function(){r.preventAnimateEvent();r.itemActive=e(r).find(".crsl-item."+n.itemClassActive);r.next();return true};r.testPrevious=function(t){return e(".crsl-wrap",r).find(".crsl-item").index(t)>0};r.testNext=function(){return!n.infinite&&r.wrapWidth>=(n.itemWidth+n.itemMargin)*(n.visible+1)-r.wrapMargin||n.infinite};r.previous=function(){r.wrapMargin=n.infinite?r.wrapMarginDefault+e(r.itemActive).outerWidth(true):r.wrapMargin+e(r.itemActive).outerWidth(true);var t=e(r.itemActive).index();var i=e(r.itemActive).prev(".crsl-item");var s="previous";e(r).trigger("beginCarousel",[n,r,s]);e(r).find(".crsl-wrap").animate({marginLeft:r.wrapMargin+"px"},n.speed,function(){e(r.itemActive).removeClass(n.itemClassActive);e(i).addClass(n.item ClassActive);if(n.infinite){e(this).css({marginLeft:r.wrapMarginDefault}).find(".crsl-item:first-child").before(e(".crsl-item:last-child",r))}else{if(r.testPrevious(i)===false)e("#"+n.navigation).find(".previous").addClass("previous-inactive");if(r.testNext())e("#"+n.navigation).find(".next").removeClass("next-inactive")}e(this).trigger("endCarousel",[n,r,s])})};r.next=function(){r.wrapMargin=n.infinite?r.wrapMarginDefault-e(r.itemActive).outerWidth(true):r.wrapMargin-e(r.itemActive).outerWidth(true);var t=e(r.itemActive).index();var i=e(r.itemActive).next(".crsl-item");var s="next";e(r).trigger("beginCarousel",[n,r,s]);e(r).find(".crsl-wrap").animate({marginLeft:r.wrapMargin+"px"},n.speed,function(){e(r.itemActive).removeClass(n.itemClassActive);e(i).addClass(n.itemClassActive);if(n.infinite){e(this).css({marginLeft:r.wrapMarginDefault}).find(".crsl-item:last-child").after(e(".crsl-item:first-child",r))}else{if(r.testPrevious(i))e("#"+n.navigation).find(".previous").removeClass("pr evious-inactive");if(r.testNext()===false)e("#"+n.navigation).find(".next").addClass("next-inactive")}e(this).trigger("endCarousel",[n,r,s])})};var i=false,s;e(window).on("mouseleave",function(t){if(t.target)s=t.target;else if(t.srcElement)s=t.srcElement;if(e(r).attr("id")&&e(s).parents(".crsl-items").attr("id")===e(r).attr("id")||e(s).parents(".crsl-items").data("navigation")===e(r).data("navigation")){i=true}else{i=false}return false});e(window).on("keydown",function(e){if(i===true){if(e.keyCode===37){r.prepareExecute();r.previous()}else if(e.keyCode===39){r.prepareExecute();r.next()}}return});if(n.isTouch){e(r).on("touchstart",function(t){e(r).addClass("touching");n.startCoords=t.originalEvent.targetTouches[0];n.endCoords=t.originalEvent.targetTouches[0];e(".touching").on("touchmove",function(e){n.endCoords=e.originalEvent.targetTouches[0];if(Math.abs(parseInt(n.endCoords.pageX-n.startCoords.pageX,10))>Math.abs(parseInt(n.endCoords.pageY-n.startCoords.pageY,10))){e.preventDefault ();e.stopPropagation()}})}).on("touchend",function(t){t.preventDefault();t.stopPropagation();n.swipeDistance=n.endCoords.pageX-n.startCoords.pageX;if(n.swipeDistance>=n.swipeMinDistance){r.previous()}else if(n.swipeDistance<=-n.swipeMinDistance){r.next()}e(".touching").off("touchmove").removeClass("touching")})}e(r).on("loadedCarousel loadedImagesCarousel",function(){r.equalHeights()});e(window).on("carouselResizeEnd",function(){if(n.itemWidth!==e(r).outerWidth())r.config()});e(window).ready(function(){e(r).trigger("prepareCarousel",[n,r]);r.init();e(window).on("resize",function(){if(this.carouselResizeTo)clearTimeout(this.carouselResizeTo);this.carouselResizeTo=setTimeout(function(){e(this).trigger("carouselResizeEnd")},10)})});e(window).load(function(){r.testPreload();r.config()})})}})(jQuery) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/eagle/blob/0ecb7c1c/eagle-site/_site/js/svg.js ---------------------------------------------------------------------- diff --git a/eagle-site/_site/js/svg.js b/eagle-site/_site/js/svg.js new file mode 100755 index 0000000..939f301 --- /dev/null +++ b/eagle-site/_site/js/svg.js @@ -0,0 +1,24 @@ +!function(a){function b(b,d){function e(){if(w){$canvas=a('<canvas class="pg-canvas"></canvas>'),v.prepend($canvas),p=$canvas[0],q=p.getContext("2d"),f();for(var b=Math.round(p.width*p.height/d.density),c=0;b>c;c++){var e=new l;e.setStackPos(c),x.push(e)}a(window).on("resize",function(){h()}),a(document).on("mousemove",function(a){y=a.pageX,z=a.pageY}),B&&!A&&window.addEventListener("deviceorientation",function(){D=Math.min(Math.max(-event.beta,-30),30),C=Math.min(Math.max(-event.gamma,-30),30)},!0),g(),o("onInit")}}function f(){p.width=v.width(),p.height=v.height(),q.fillStyle=d.dotColor,q.strokeStyle=d.lineColor,q.lineWidth=d.lineWidth}function g(){if(w){s=a(window).width(),t=a(window).height(),q.clearRect(0,0,p.width,p.height);for(var b=0;b<x.length;b++)x[b].updatePosition();for(var b=0;b<x.length;b++)x[b].draw();E||(r=requestAnimationFrame(g))}}function h(){for(f(),i=x.length-1;i>=0;i--)(x[i].position.x>v.width()||x[i].position.y>v.height())&&x.splice(i,1);var a=Math.round(p.wid th*p.height/d.density);if(a>x.length)for(;a>x.length;){var b=new l;x.push(b)}else a<x.length&&x.splice(a);for(i=x.length-1;i>=0;i--)x[i].setStackPos(i)}function j(){E=!0}function k(){E=!1,g()}function l(){switch(this.stackPos,this.active=!0,this.layer=Math.ceil(3*Math.random()),this.parallaxOffsetX=0,this.parallaxOffsetY=0,this.position={x:Math.ceil(Math.random()*p.width),y:Math.ceil(Math.random()*p.height)},this.speed={},d.directionX){case"left":this.speed.x=+(-d.maxSpeedX+Math.random()*d.maxSpeedX-d.minSpeedX).toFixed(2);break;case"right":this.speed.x=+(Math.random()*d.maxSpeedX+d.minSpeedX).toFixed(2);break;default:this.speed.x=+(-d.maxSpeedX/2+Math.random()*d.maxSpeedX).toFixed(2),this.speed.x+=this.speed.x>0?d.minSpeedX:-d.minSpeedX}switch(d.directionY){case"up":this.speed.y=+(-d.maxSpeedY+Math.random()*d.maxSpeedY-d.minSpeedY).toFixed(2);break;case"down":this.speed.y=+(Math.random()*d.maxSpeedY+d.minSpeedY).toFixed(2);break;default:this.speed.y=+(-d.maxSpeedY/2+Math.random()*d .maxSpeedY).toFixed(2),this.speed.x+=this.speed.y>0?d.minSpeedY:-d.minSpeedY}}function m(a,b){return b?void(d[a]=b):d[a]}function n(){v.find(".pg-canvas").remove(),o("onDestroy"),v.removeData("plugin_"+c)}function o(a){void 0!==d[a]&&d[a].call(u)}var p,q,r,s,t,u=b,v=a(b),w=!!document.createElement("canvas").getContext,x=[],y=0,z=0,A=!navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry|BB10|mobi|tablet|opera mini|nexus 7)/i),B=!!window.DeviceOrientationEvent,C=0,D=0,E=!1;return d=a.extend({},a.fn[c].defaults,d),l.prototype.draw=function(){q.beginPath(),q.arc(this.position.x+this.parallaxOffsetX,this.position.y+this.parallaxOffsetY,d.particleRadius/2,0,2*Math.PI,!0),q.closePath(),q.fill(),q.beginPath();for(var a=x.length-1;a>this.stackPos;a--){var b=x[a],c=this.position.x-b.position.x,e=this.position.y-b.position.y,f=Math.sqrt(c*c+e*e).toFixed(2);f<d.proximity&&(q.moveTo(this.position.x+this.parallaxOffsetX,this.position.y+this.parallaxOffsetY),d.curvedLines?q.quadraticCur veTo(Math.max(b.position.x,b.position.x),Math.min(b.position.y,b.position.y),b.position.x+b.parallaxOffsetX,b.position.y+b.parallaxOffsetY):q.lineTo(b.position.x+b.parallaxOffsetX,b.position.y+b.parallaxOffsetY))}q.stroke(),q.closePath()},l.prototype.updatePosition=function(){if(d.parallax){if(B&&!A){var a=(s-0)/60;pointerX=(C- -30)*a+0;var b=(t-0)/60;pointerY=(D- -30)*b+0}else pointerX=y,pointerY=z;this.parallaxTargX=(pointerX-s/2)/(d.parallaxMultiplier*this.layer),this.parallaxOffsetX+=(this.parallaxTargX-this.parallaxOffsetX)/10,this.parallaxTargY=(pointerY-t/2)/(d.parallaxMultiplier*this.layer),this.parallaxOffsetY+=(this.parallaxTargY-this.parallaxOffsetY)/10}switch(d.directionX){case"left":this.position.x+this.speed.x+this.parallaxOffsetX<0&&(this.position.x=v.width()-this.parallaxOffsetX);break;case"right":this.position.x+this.speed.x+this.parallaxOffsetX>v.width()&&(this.position.x=0-this.parallaxOffsetX);break;default:(this.position.x+this.speed.x+this.parallaxOffsetX>v.wid th()||this.position.x+this.speed.x+this.parallaxOffsetX<0)&&(this.speed.x=-this.speed.x)}switch(d.directionY){case"up":this.position.y+this.speed.y+this.parallaxOffsetY<0&&(this.position.y=v.height()-this.parallaxOffsetY);break;case"down":this.position.y+this.speed.y+this.parallaxOffsetY>v.height()&&(this.position.y=0-this.parallaxOffsetY);break;default:(this.position.y+this.speed.y+this.parallaxOffsetY>v.height()||this.position.y+this.speed.y+this.parallaxOffsetY<0)&&(this.speed.y=-this.speed.y)}this.position.x+=this.speed.x,this.position.y+=this.speed.y},l.prototype.setStackPos=function(a){this.stackPos=a},e(),{option:m,destroy:n,start:k,pause:j}}var c="particleground";a.fn[c]=function(d){if("string"==typeof arguments[0]){var e,f=arguments[0],g=Array.prototype.slice.call(arguments,1);return this.each(function(){a.data(this,"plugin_"+c)&&"function"==typeof a.data(this,"plugin_"+c)[f]&&(e=a.data(this,"plugin_"+c)[f].apply(this,g))}),void 0!==e?e:this}return"object"!=typeof d&&d?void 0:this.each(function(){a.data(this,"plugin_"+c)||a.data(this,"plugin_"+c,new b(this,d))})},a.fn[c].defaults={minSpeedX:.1,maxSpeedX:.7,minSpeedY:.1,maxSpeedY:.7,directionX:"center",directionY:"center",density:1e4,dotColor:"#666666",lineColor:"#666666",particleRadius:7,lineWidth:1,curvedLines:!1,proximity:100,parallax:!0,parallaxMultiplier:5,onInit:function(){},onDestroy:function(){}}}(jQuery), + +function(){for(var a=0,b=["ms","moz","webkit","o"],c=0;c<b.length&&!window.requestAnimationFrame;++c)window.requestAnimationFrame=window[b[c]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[b[c]+"CancelAnimationFrame"]||window[b[c]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(b){var c=(new Date).getTime(),d=Math.max(0,16-(c-a)),e=window.setTimeout(function(){b(c+d)},d);return a=c+d,e}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(a){clearTimeout(a)})}(); + +$(function(){ + + $('.particles').particleground({ + minSpeedX: 0.1, + maxSpeedX: 0.7, + minSpeedY: 0.1, + maxSpeedY: 0.7, + directionX: 'center', // 'center', 'left' or 'right'. 'center' = dots bounce off edges + directionY: 'center', // 'center', 'up' or 'down'. 'center' = dots bounce off edges + density: 10000, // How many particles will be generated: one particle every n pixels + dotColor: '#eee', + lineColor: '#eee', + particleRadius: 7, // Dot size + lineWidth: 1, + curvedLines: true, + proximity: 100, // How close two dots need to be before they join + parallax: false + }); + +}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/eagle/blob/0ecb7c1c/eagle-site/_site/post/2015/10/27/apache-eagle-announce-cn.html ---------------------------------------------------------------------- diff --git a/eagle-site/_site/post/2015/10/27/apache-eagle-announce-cn.html b/eagle-site/_site/post/2015/10/27/apache-eagle-announce-cn.html new file mode 100644 index 0000000..5d87315 --- /dev/null +++ b/eagle-site/_site/post/2015/10/27/apache-eagle-announce-cn.html @@ -0,0 +1,352 @@ +<!DOCTYPE html> +<html> + + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + + <title>Eagle - Apache Eagle æ£å¼åå¸ï¼åå¸å¼å®æ¶Hadoopæ°æ®å®å ¨æ¹æ¡</title> + <meta name="description" content=" æè¦ï¼æ¥åï¼eBayå ¬å¸éé宣叿£å¼å弿ºä¸çæ¨åºå®æ¶åå¸å¼Hadoopæ°æ®å®å ¨æ¹æ¡ - Apache Eagleï¼ä½ä¸ºä¸å¥æ¨å¨æä¾é«æåå¸å¼çæµå¼çç¥å¼æï¼å¹¶éææºå¨å¦ä¹ å¯¹ç¨æ·è¡ä¸ºå»ºç«Profile以宿¶æºè½å°ä¿æ¤Hadoopçæç³»ç»ä¸å¤§æ°æ®å®å ¨çè§£å³æ¹æ¡ã"> + + <meta name="keywords" content="Eagle, Hadoop, Security, Real Time"> + <meta name="author" content="eBay Inc."> + + <meta charset="utf-8"> + <meta name="viewport" content="initial-scale=1"> + + <link rel="stylesheet" href="/css/animate.css"> + <link rel="stylesheet" href="/css/bootstrap.min.css"> + + <link rel="stylesheet" href="/css/font-awesome.min.css"> + + <link rel="stylesheet" href="/css/misc.css"> + <link rel="stylesheet" href="/css/style.css"> + <link rel="stylesheet" href="/css/styles.css"> + <link rel="stylesheet" href="/css/main.css"> + <link rel="alternate" type="application/rss+xml" title="Eagle" href="http://goeagle.io/feed.xml" /> + <link rel="shortcut icon" href="/images/favicon.png"> + + <!-- Baidu Analytics Tracking--> + <script> + var _hmt = _hmt || []; + (function() { + var hm = document.createElement("script"); + hm.src = "//hm.baidu.com/hm.js?fedc55df2ea52777a679192e8f849ece"; + var s = document.getElementsByTagName("script")[0]; + s.parentNode.insertBefore(hm, s); + })(); + </script> + + <!-- Google Analytics Tracking --> + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + ga('create', 'UA-68929805-1', 'auto'); + ga('send', 'pageview'); + </script> +</head> + <body> + <div class="topbar"> + <div class="container"> + <div class="row" > + <nav class="navbar navbar-default"> + <div class="container-fluid"> + <!-- Brand and toggle get grouped for better mobile display --> + <div class="navbar-header"> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> + <a class="navbar-brand" href="/"><img src="/images/logo2.png" height="44px" style="margin-top:-7px"></a> </div> + + <!-- Collect the nav links, forms, and other content for toggling --> + <!-- <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> + <ul class="nav navbar-nav navbar-right" id="top-menu"> + <li><a class="menu" href="/#home_page">HOME</a></li> + <li><a class="menu" href="/docs/">DOCS</a></li> + <li><a class="menu" href="/#about_page">ABOUT</a></li> + <li><a class="menu" href="/#diagram_page">ARCHITECTURE</a></li> + <li><a class="menu" href="/#modules_page">MODULES</a></li> + <li><a class="menu" href="/#usecase_page">USE CASES</a></li> + <li> + </li> + </ul> --> + </div> + </div> + <!-- /.container-fluid --> + </nav> + </div> + </div> + </div> + <div class="page-content"> + <div class="pagewrapper"> + <div class="post"> + + <header class="post-header"> + <h1 class="post-title">Apache Eagle æ£å¼åå¸ï¼åå¸å¼å®æ¶Hadoopæ°æ®å®å ¨æ¹æ¡</h1> + <p class="post-meta">Oct 27, 2015 ⢠Hao Chen, Edward Zhang, Libin Sun, Jilin Jiang, Qingwen Zhao</p> + </header> + + <article class="post-content"> + <blockquote> + <p><em>æè¦</em>ï¼æ¥åï¼eBayå ¬å¸éé宣叿£å¼å弿ºä¸çæ¨åºå®æ¶åå¸å¼Hadoopæ°æ®å®å ¨æ¹æ¡ - Apache Eagleï¼ä½ä¸ºä¸å¥æ¨å¨æä¾é«æåå¸å¼çæµå¼çç¥å¼æï¼å¹¶éææºå¨å¦ä¹ å¯¹ç¨æ·è¡ä¸ºå»ºç«Profile以宿¶æºè½å°ä¿æ¤Hadoopçæç³»ç»ä¸å¤§æ°æ®å®å ¨çè§£å³æ¹æ¡ã</p> +</blockquote> + +<p>æ¥åï¼eBayå ¬å¸éé宣叿£å¼å弿ºä¸çæ¨åºåå¸å¼å®æ¶å®å ¨çæ§æ¹æ¡ ï¼ Apache Eagle (http://goeagle.io)ï¼è¯¥é¡¹ç®å·²äº2015å¹´10æ26æ¥æ£å¼å å ¥Apache æä¸ºåµåå¨é¡¹ç®ãApache Eagleæä¾ä¸å¥é«æåå¸å¼çæµå¼çç¥å¼æï¼å ·æé«å®æ¶ãå¯ä¼¸ç¼©ãææ©å±ã交äºå好çç¹ç¹ï¼åæ¶éææºå¨å¦ä¹ å¯¹ç¨æ·è¡ä¸ºå»ºç«Profile以å®ç°æºè½å®æ¶å°ä¿æ¤Hadoopçæç³»ç»ä¸å¤§æ°æ®çå®å ¨ã</p> + +<h2 id="section">èæ¯</h2> +<p>éçå¤§æ°æ®çåå±ï¼è¶æ¥è¶å¤çæåä¼ä¸æè ç»ç»å¼å§éåæ°æ®é©±å¨åä¸çè¿ä½æ¨¡å¼ãå¨eBayï¼æä»¬æ¥ææ°ä¸åå·¥ç¨å¸ãåæå¸åæ°æ®ç§å¦å®¶ï¼ä»ä»¬æ¯å¤©è®¿é®åææ°PBçº§çæ°æ®ï¼ä»¥ä¸ºæä»¬çç¨æ·å¸¦æ¥æ ä¸ä¼¦æ¯çä½éªãå¨å ¨çä¸å¡ä¸ï¼æä»¬ä¹å¹¿æ³å°å©ç¨æµ·éå¤§æ°æ®æ¥è¿æ¥æä»¬æ°ä»¥äº¿è®¡çç¨æ·ã</p> + +<p>è¿å¹´æ¥ï¼Hadoopå·²ç»éæ¸æä¸ºå¤§æ°æ®åæé¢åæå欢è¿çè§£å³æ¹æ¡ï¼eBayä¹ä¸ç´å¨ä½¿ç¨Hadoopææ¯ä»æ°æ®ä¸ææä»·å¼ï¼ä¾å¦ï¼æä»¬éè¿å¤§æ°æ®æé«ç¨æ·çæç´¢ä½éªï¼è¯å«åä¼åç²¾åå¹¿åææ¾ï¼å 宿们ç产åç®å½ï¼ä»¥åéè¿ç¹å»æµåæä»¥çè§£ç¨æ·å¦ä½ä½¿ç¨æä»¬çå¨çº¿å¸åºå¹³å°çã</p> + +<p>ç®åï¼eBayçHadoopé群æ»èç¹æ°æ®è¶ è¿10000å¤ä¸ªï¼åå¨å®¹éè¶ è¿170PBï¼æ´»è·ç¨æ·è¶ è¿2000å¤ãç°å¨ç¸å ³è§æ¨¡è¿å¨ä¸æå¢é¿ä¸ï¼åæ¶ä¸ºäºæ¯æå¤å åéæ±ï¼æä»¬å¼å ¥è¶æ¥è¶å¤æ ·çæ°æ®åå¨ååææ¹æ¡ï¼æ¯å¦HiveãMapReduecãSpark åHBaseçï¼éä¹å¸¦æ¥ç管çåçæ§çææè¶æ¥è¶ä¸¥å³»ï¼æ°æ®å®å ¨é®é¢äº¦æ¯å ¶ä¸æéè¦çä¹ä¸ã</p> + +<p>å¤§æ°æ®æ¶ä»£ï¼å®å ¨é®é¢å¼å§åå¾ç©ºåçå ³é®ï¼ç¹å«eBayä½ä¸ºå ¨çé¢å ççµååå¡å ¬å¸ï¼æä»¬å¿ é¡»ä¿è¯Hadoopä¸ç¨æ·æ°æ®çç»å¯¹å®å ¨ãé常æä»¬çå®å ¨æªæ½æ ¹æ®å¦ä¸å ç¹ ï¼è®¿é®æ§å¶ãå®å ¨éç¦»ãæ°æ®åç±»ãæ°æ®å å¯ä»¥å宿¶æ°æ®è¡ä¸ºçæ§ï¼ç¶èç»è¿å¹¿æ³çå°è¯åç ç©¶ï¼æä»¬æè¯å°æ²¡æä»»ä½å·²ç»åå¨ç产åæè è§£å³æ¹æ¡è½å¤å åæ»¡è¶³æä»¬é¢ä¸´æµ·é宿¶æ°æ®æµåå¤å åç¨ä¾åºæ¯ä¸æ°æ®è¡ä¸ºçæ§çéæ±ã为äºé¾è¶è¿é鸿æ²ï¼eBayå³å®ä»å¤´å¼å§æå»ºEagleã</p> + +<p><img src="/images/logo_700x400.png" alt="" /></p> + +<blockquote> + <p>âEagle æ¯å¼æºåå¸å¼å®æ¶Hadoopæ°æ®å®å ¨æ¹æ¡ï¼æ¯ææ°æ®è¡ä¸ºå®æ¶çæ§ï¼è½ç«å³çæµåºå¯¹æææ°æ®çè®¿é®ææ¶æçæä½ï¼å¹¶ç«å³éååºå¯¹çæªæ½â</p> +</blockquote> + +<p>æä»¬ç¸ä¿¡Eagleå°æä¸ºHadoopæ°æ®å®å ¨é¢åçæ ¸å¿ç»ä»¶ä¹ä¸ï¼å æ¤æä»¬å³å®å°å®çåè½åäº«ç»æ´ä¸ªç¤¾åºãç®åæä»¬å·²ç»å°Eagleæèµ ç»Apache软件åºéä¼ä½ä¸ºApache åµåå¨é¡¹ç®å¼æºï¼ææè½å¤å弿ºç¤¾åºä¸ååä½å¼åï¼ä½¿å¾Eagle䏿åå±å£®å¤§ï¼å ±åæ»¡è¶³å¼æºç¤¾åºä¸æ´å¹¿æ³çéæ±ã</p> + +<p>Eagleçæ°æ®è¡ä¸ºçæ§æ¹æ¡å¯ç¨äºå¦ä¸å ç±»å ¸ååºæ¯ï¼</p> + +<ul> + <li>çæ§Hadoopä¸çæ°æ®è®¿é®æµé</li> + <li>æ£æµéæ³å ¥ä¾µåè¿åå®å ¨è§åçè¡ä¸º</li> + <li>æ£æµå¹¶é²æ¢æææ°æ®ä¸¢å¤±å访é®</li> + <li>å®ç°åºäºçç¥ç宿¶æ£æµåé¢è¦</li> + <li>å®ç°åºäºç¨æ·è¡ä¸ºæ¨¡å¼çå¼å¸¸æ°æ®è¡ä¸ºæ£æµ</li> +</ul> + +<p>Eagleå ·æå¦ä¸ç¹ç¹ï¼</p> + +<ul> + <li><strong>é«å®æ¶</strong>ï¼ æä»¬å åçè§£å®å ¨çæ§ä¸é«åº¦å®æ¶åå¿«éååºçéè¦æ§ï¼å æ¤è®¾è®¡Eagleä¹åï¼æä»¬ç«å°½å¯è½å°ç¡®ä¿è½å¨äºç§çº§å«æ¶é´å 产çåè¦ï¼ä¸æ¦ç»¼åå¤ç§å ç´ ç¡®è®¢ä¸ºå±é©æä½ï¼ç«å³éåæªæ½é»æ¢éæ³è¡ä¸ºã</li> + <li><strong>å¯ä¼¸ç¼©</strong>ï¼å¨eBay Eagle 被é¨ç½²å¨å¤ä¸ªå¤§åHadoopé群ä¸ï¼è¿äºéç¾¤æ¥ææ°ç¾PBçæ°æ®ï¼æ¯å¤©æ8亿以ä¸çæ°æ®è®¿é®æ¶é´ï¼å æ¤Eagleå¿ é¡»å ·æå¤çæµ·é宿¶æ°æ®çé«åº¦å¯ä¼¸ç¼©è½åã</li> + <li><strong>ç®åæç¨</strong>ï¼å¯ç¨æ§ä¹æ¯Eagle产åçæ ¸å¿è®¾è®¡ååä¹ä¸ãéè¿EagleçSandboxï¼ä½¿ç¨è ä» éæ°åé便å¯ä»¥è®¾ç½®å¥½ç¯å¢å¹¶å¼å§å°è¯ã为äºä½¿å¾ç¨æ·ä½éªå°½å¯è½ç®åï¼æä»¬å ç½®äºè®¸å¤å¾å¥½çä¾åï¼åªéç®åå°ç¹å»å æ¥é¼ æ ï¼ä¾¿å¯ä»¥è½»æ¾å°å®æçç¥å°åå»ºåæ·»å ã</li> + <li><strong>ç¨æ·Profile</strong>ï¼Eagle å ç½®æä¾åºäºæºå¨å¦ä¹ ç®æ³å¯¹Hadoopä¸ç¨æ·è¡ä¸ºä¹ æ¯å»ºç«ç¨æ·Profileçåè½ãæä»¬æä¾å¤ç§é»è®¤çæºå¨å¦ä¹ ç®æ³ä¾ä½ éæ©ç¨äºé对ä¸åHDFSç¹å¾éè¿è¡å»ºæ¨¡ï¼éè¿åå²è¡ä¸ºæ¨¡åï¼Eagleå¯ä»¥å®æ¶å°æ£æµå¼å¸¸ç¨æ·è¡ä¸ºå¹¶äº§çé¢è¦ã</li> + <li><strong>弿º</strong>ï¼Eagleä¸ç´æ ¹æ®å¼æºçæ åå¼åï¼å¹¶æå»ºäºè¯¸å¤å¤§æ°æ®é¢åç弿ºäº§åä¹ä¸ï¼å æ¤æä»¬å³å®ä»¥Apache许å¯è¯å¼æºEagleï¼ä»¥åé¦ç¤¾åºï¼åæ¶ä¹æå¾ è·å¾ç¤¾åºçåé¦ãåä½ä¸æ¯æã</li> +</ul> + +<h2 id="eagle">Eagleæ¦è§</h2> + +<p><img src="/images/posts/eagle-group.png" alt="" /></p> + +<h4 id="data-collection-and-storage">æ°æ®æµæ¥å ¥ååå¨ï¼Data Collection and Storageï¼</h4> +<p>Eagleæä¾é«åº¦å¯æ©å±çç¼ç¨APIï¼å¯ä»¥æ¯æå°ä»»ä½ç±»åçæ°æ®æºéæå°Eagleççç¥æ§è¡å¼æä¸ãä¾å¦ï¼å¨Eagle HDFS 审计äºä»¶ï¼Auditï¼çæ§æ¨¡åä¸ï¼éè¿Kafkaæ¥å®æ¶æ¥æ¶æ¥èªNamenode Log4j Appender æè Logstash Agent æ¶éçæ°æ®ï¼å¨Eagle Hive çæ§æ¨¡åä¸ï¼éè¿YARN API æ¶éæ£å¨è¿è¡JobçHive æ¥è¯¢æ¥å¿ï¼å¹¶ä¿è¯æ¯è¾é«çå¯ä¼¸ç¼©æ§å容鿧ã</p> + +<h4 id="data-processing">æ°æ®å®æ¶å¤çï¼Data Processingï¼</h4> + +<p><strong>æµå¤çAPIï¼Stream Processing APIï¼Eagle</strong> æä¾ç¬ç«äºç©çå¹³å°èé«åº¦æ½è±¡çæµå¤çAPIï¼ç®åé»è®¤æ¯æApache Stormï¼ä½æ¯ä¹å 许æ©å±å°å ¶ä»ä»»ææµå¤çå¼æï¼æ¯å¦Flink æè Samzaçãè¯¥å±æ½è±¡å 许å¼åè å¨å®ä¹çæ§æ°æ®å¤çé»è¾æ¶ï¼æ éå¨ç©çæ§è¡å±ç»å®ä»»ä½ç¹å®æµå¤çå¹³å°ï¼èåªééè¿å¤ç¨ãæ¼æ¥åç»è£ ä¾å¦æ°æ®è½¬æ¢ãè¿æ»¤ãå¤é¨æ°æ®Joinçç»ä»¶ï¼ä»¥å®ç°æ»¡è¶³éæ±çDAGï¼æåæ ç¯å¾ï¼ï¼åæ¶ï¼å¼åè ä¹å¯ä»¥å¾å®¹æå°ä»¥ç¼ç¨å°æ¹å¼å°ä¸å¡é»è¾æµç¨åEagle çç¥å¼ææ¡æ¶éæèµ·æ¥ãEagleæ¡æ¶å é¨ä¼å°æè¿°ä¸å¡é»è¾çDAGç¼è¯æåºå±æµå¤çæ¶æçåçåºç¨ï¼ä¾å¦Apache Storm Topology çï¼ä»äºå®ç°å¹³å°çç¬ç«ã</p> + +<p><strong>以䏿¯ä¸ä¸ªEagleå¦ä½å¤çäºä»¶ååè¦ç示ä¾ï¼</strong></p> + +<pre><code>StormExecutionEnvironment env = ExecutionEnvironmentFactory.getStorm(config); // storm env +StreamProducer producer = env.newSource(new KafkaSourcedSpoutProvider().getSpout(config)).renameOutputFields(1) // declare kafka source + .flatMap(new AuditLogTransformer()) // transform event + .groupBy(Arrays.asList(0)) // group by 1st field + .flatMap(new UserProfileAggregatorExecutor()); // aggregate one-hour data by user + .alertWithConsumer(âuserActivityâ,âuserProfileExecutorâ) // ML policy evaluation +env.execute(); // execute stream processing and alert +</code></pre> + +<p><strong>åè¦æ¡æ¶ï¼Alerting Frameworkï¼Eagle</strong>åè¦æ¡æ¶ç±æµå æ°æ®APIãçç¥å¼ææå¡æä¾APIãçç¥Partitioner API 以åé¢è¦å»éæ¡æ¶çç»æ:</p> + +<ul> + <li><strong>æµå æ°æ®API</strong> å è®¸ç¨æ·å£°æäºä»¶çSchemaï¼å æ¬äºä»¶ç±åªäºå±æ§ææãæ¯ä¸ªå±æ§çç±»åï¼ä»¥åå½ç¨æ·é ç½®çç¥æ¶å¦ä½å¨è¿è¡æ¶å¨æè§£æå±æ§çå¼çã</li> + <li><strong>çç¥å¼ææå¡æä¾API</strong> å 许å¼åè å¾å®¹æå°ä»¥æä»¶ç形弿©å±æ°ççç¥å¼æãWSO2 Siddhi CEP 弿æ¯Eagle ä¼å é»è®¤æ¯æççç¥å¼æï¼åæ¶æºå¨å¦ä¹ ç®æ³ä¹å¯ä½ä¸ºå¦ä¸ç§çç¥å¼ææ§è¡ã</li> + <li> + <p><strong>æ©å±æ§</strong> Eagleççç¥å¼ææå¡æä¾APIå è®¸ä½ æå ¥æ°ççç¥å¼æ</p> + + <pre><code> public interface PolicyEvaluatorServiceProvider { + public String getPolicyType(); // literal string to identify one type of policy + public Class<? extends PolicyEvaluator> getPolicyEvaluator(); // get policy evaluator implementation + public List<Module> getBindingModules(); // policy text with json format to object mapping + } + public interface PolicyEvaluator { + public void evaluate(ValuesArray input) throws Exception; // evaluate input event + public void onPolicyUpdate(AlertDefinitionAPIEntity newAlertDef); // invoked when policy is updated + public void onPolicyDelete(); // invoked when policy is deleted + } +</code></pre> + </li> + <li><strong>çç¥Partitioner API</strong> å 许çç¥å¨ä¸åçç©çèç¹ä¸å¹¶è¡æ§è¡ãä¹å è®¸ä½ èªå®ä¹çç¥Partitionerç±»ãè¿äºåè½ä½¿å¾çç¥åäºä»¶å®å ¨ä»¥åå¸å¼çæ¹å¼æ§è¡ã</li> + <li> + <p><strong>å¯ä¼¸ç¼©æ§</strong> Eagle éè¿æ¯æçç¥çååºæ¥å£æ¥å®ç°å¤§éççç¥å¯ä¼¸ç¼©å¹¶åå°è¿è¡</p> + + <pre><code> public interface PolicyPartitioner extends Serializable { + int partition(int numTotalPartitions, String policyType, String policyId); // method to distribute policies + } +</code></pre> + + <p><img src="/images/posts/policy-partition.png" alt="" /></p> + + <blockquote> + <p>å¯ä¼¸ç¼©çEagleçç¥æ§è¡æ¡æ¶</p> + </blockquote> + </li> +</ul> + +<p><strong>æºå¨å¦ä¹ 模å:</strong> +Eagle æ¯ææ ¹æ®ç¨æ·å¨Hadoopå¹³å°ä¸åå²ä½¿ç¨è¡ä¸ºä¹ æ¯æ¥å®ä¹è¡ä¸ºæ¨¡å¼æç¨æ·Profileçè½åãæ¥æäºè¿ä¸ªåè½ï¼ä¸éè¦å¨ç³»ç»ä¸é¢å 设置åºå®ä¸´çå¼çæ åµä¸ï¼ä¹å¯ä»¥å®ç°æºè½å°æ£æµåºå¼å¸¸çè¡ä¸ºãEagleä¸ç¨æ·Profileæ¯éè¿æºå¨å¦ä¹ ç®æ³çæï¼ç¨äºå¨ç¨æ·å½å宿¶è¡ä¸ºæ¨¡å¼ä¸å ¶å¯¹åºçå岿¨¡å模å¼åå¨ä¸å®ç¨åº¦ç差弿¶è¯å«ç¨æ·è¡ä¸ºæ¯å¦ä¸ºå¼å¸¸ãç®åï¼Eagle å ç½®æä¾ä»¥ä¸ä¸¤ç§ç®æ³æ¥æ£æµå¼å¸¸ï¼åå«ä¸ºç¹å¾å¼åè§£ï¼Eigen-Value Decompositionï¼å å¯åº¦ä¼°è®¡ï¼Density Estimationï¼ãè¿äºç®æ³ä»HDFS 审计æ¥å¿ä¸è¯»åæ°æ®ï¼å¯¹æ°æ®è¿è¡åå²ã审æ¥ã交ååæï¼å¨ææ§å°ä¸ºæ¯ä¸ªç¨æ·ä¾æ¬¡å建Profile è¡ä¸ºæ¨¡åã䏿¦æ¨¡åçæï¼Eagleç宿¶æµçç¥å¼æè½å¤è¿ä¹å®æ¶å°è¯å«åºå¼å¸¸ï¼å辨å½åç¨æ·çè¡ä¸ºå¯ççæè ä¸ä»ä»¬çåå²è¡ä¸ºæ¨¡åä¸ç¸ç¬¦ã</p> + +<p>ä¸å¾ç®åæè¿°äºç®åEagleä¸ç¨æ·Profileç离线è®ç»å»ºæ¨¡åå¨çº¿å®æ¶çæµçæ°æ®æµï¼</p> + +<p><img src="/images/posts/ml-pipeline.png" alt="" /></p> + +<blockquote> + <p>ç¨æ·Profile 离线è®ç»ä»¥åå¼å¸¸çæµæ¶æ</p> +</blockquote> + +<p>åºäºç¨æ· ProfileçEagleå¨çº¿å®æ¶å¼å¸¸çæµæ¯æ ¹æ®Eagleçéç¨çç¥æ¡æ¶å®ç°çï¼ç¨æ·Profileåªæ¯è¢«å®ä¹ä¸ºEagleç³»ç»ä¸ä¸ä¸ªçç¥èå·²ï¼ç¨æ·Profileççç¥æ¯éè¿ç»§æ¿èªEagleç»ä¸çç¥æ§è¡æ¥å£çæºå¨å¦ä¹ Evaluatoræ¥æ§è¡ï¼å ¶çç¥çå®ä¹ä¸å æ¬å¼å¸¸æ£æµè¿ç¨ä¸éè¦çç¹å¾åéçï¼å¨çº¿æ£æµä¸ç¦»çº¿è®ç»ä¿æä¸è´ï¼ã</p> + +<p>æ¤å¤ï¼Eagle æä¾èªå¨è®ç»è°åº¦å¨ï¼å¯æ ¹æ®æä»¶æè UIé ç½®çæ¶é´å¨æåç²åº¦æ¥è°åº¦è¿ä¸ªåºäºSparkç离线è®ç»ç¨åºï¼ç¨äºæ¹éåå»ºç¨æ·Profileåè¡ä¸ºæ¨¡åï¼é»è®¤è¯¥è®ç»ç³»ç»ä»¥æ¯æçé¢çæ´æ°æ¨¡åï¼æ¨¡åç²åº¦ä¸ºä¸åéã</p> + +<p>Eagle å ç½®çæºå¨å¦ä¹ ç®æ³åºæ¬ææ³å¦ä¸ï¼</p> + +<p><strong>æ ¸å¯åº¦ä¼°è®¡ç®æ³ (Density Estimation)</strong> +è¯¥ç®æ³çåºæ¬ææ³æ¯æ ¹æ®æ£æµçè®ç»æ ·æ¬æ°æ®é对æ¯ä¸ªç¨æ·è®¡ç®åºå¯¹åºçæ¦çå¯åº¦åå¸å½æ°ãé¦å ï¼æä»¬å¯¹è®ç»æ°æ®éçæ¯ä¸ªç¹å¾å弿 ååï¼æ ååå¯ä»¥ä½¿å¾æææ°æ®é转å为ç¸å尺度ãç¶åï¼å¨æä»¬çéæºå鿦çåå¸ä¼°è®¡ä¸ï¼æä»¬éç¨é«æ¯åå¸å¼å½æ°æ¥è®¡ç®æ¦çå¯åº¦ãå设任æç¹å¾å½¼æ¤ç¸äºç¬ç«ï¼é£ä¹æç»ç髿¯æ¦çå¯åº¦å°±å¯ä»¥éè¿åè§£å个ç¹å¾çæ¦çå¯åº¦è计ç®å¾å°ãå¨çº¿å®æ¶æ£æµé¶æ®µï¼æä»¬å¯ä»¥é¦å 计ç®åºæ¯ä¸ªç¨æ·å®æ¶è¡ä¸ºçæ¦çãå¦æç¨æ·åºç°å½åè¡ä¸ºçå¯è½æ§ä½äºæä¸ªä¸´çå¼ï¼æä»¬è¡¨è¯ä¸ºå¼å¸¸è¦åï¼èè¿ä¸ªä¸´çå¼å®å ¨ç±ç¦»çº¿è®ç»ç¨åºéè¿ç§°ä¸ºâ马修æ¯ç¸å ³ç³»æ°âï¼Mathews Correlation Coefficientï¼çæ¹æ³è®¡ç®èå¾ã</p> + +<p><img src="/images/posts/density-estimation.png" alt="" /></p> + +<blockquote> + <p>å±ç¤ºåä¸ç»´åº¦ä¸ç¨æ·è¡ä¸ºç´æ¹å¾</p> +</blockquote> + +<p><strong>ç¹å¾å¼åè§£ç®æ³ï¼Eigen-Value Decompositionï¼</strong> +è¯¥ç®æ³ä¸ï¼æä»¬è®¤ä¸ºçæç¨æ·Profileç主è¦ç®çæ¯ä¸ºäºä»ä¸åç°æä»·å¼çç¨æ·è¡ä¸ºæ¨¡å¼ã为äºå®ç°è¿ä¸ªç®çï¼æä»¬å¯ä»¥èè对ç¹å¾ä¾æ¬¡è¿è¡ç»åï¼ç¶åè§å¯ä»ä»¬ç¸äºä¹é´æ¯å¦ä½å½±åçã彿°æ®éé常巨大æ¶ï¼æ£å¦é常æä»¬æéå°çåºæ¯ï¼ç±äºæ£å¸¸æ¨¡å¼çæ°éé常ä¹å¤ï¼ä»¥è³äºç¹å¾éçå¼å¸¸ç模å¼å¾å®¹æè¢«å¿½è§ãç±äºæ£å¸¸çè¡ä¸ºæ¨¡å¼é常å¤äºé常ä½ç»´çå空é´å ï¼å æ¤æä»¬ä¹è®¸å¯ä»¥éè¿é使°æ®éçç»´åº¦æ¥æ´å¥½ççè§£ç¨æ·ççæ£çè¡ä¸ºæ¨¡å¼ãè¯¥æ¹æ³åæ ·å¯ä»¥å¯¹äºè®ç»æ°æ®éè¿è¡éåªãæ ¹æ®å¯¹å¤§éç¨æ·ç¹å¾æ°æ®æ¹å·®çè¿è¡è¿ç®ï¼é叏卿们çç¨ä¾åºæ¯ä¸éåæ¹å·®ä¸º95%ä½ä¸ºåºåï¼æä»¬å¯ä»¥å¾å°æ¹å·®ä¸º95%ç主æåçæ°é为kï¼å æ¤æä»¬å°åk个主æå认为æ¯ç¨æ·çæ£å¸¸å空é´ï¼èå©ä¸ç(n-k)个主æåå被è§ä¸ºå¼å¸¸å空é´ã</p> + +<p>å½çº¿å®æ¶å¼å¸¸æ£æµæ¶ï¼å¦æç¨æ·è¡ä¸ºæ¨¡å¼ä½äºæ£å¸¸å空é´éè¿ï¼å认为该è¡ä¸ºæ£å¸¸ï¼å¦åï¼å¦æç¨æ·è¡ä¸ºæ¨¡å¼ä½äºå¼å¸¸å空é´éè¿ï¼åä¼ç«å³æ¥è¦ï¼å 为æä»¬ç¸ä¿¡éå¸¸ç¨æ·è¡ä¸ºä¸è¬åºè¯¥ä½äºæ£å¸¸å空é´å ãè³äºå¦ä½è®¡ç®ç¨æ·å½åè¡ä¸ºæ¥è¿æ£å¸¸è¿æ¯å¼å¸¸å空é´ï¼æä»¬éç¨çæ¯æ¬§æ°è·ç¦»æ³ï¼Euclidian distance methodï¼ã</p> + +<p><img src="/images/posts/eigen-decomposition.png" alt="" /></p> + +<blockquote> + <p>å±ç¤ºéè¦çç¨æ·è¡ä¸ºæ¨¡å¼æå</p> +</blockquote> + +<p><strong>Eagle æå¡</strong></p> + +<p><strong>çç¥ç®¡çå¨</strong> Eagleçç¥ç®¡ç卿ä¾äº¤äºå好çç¨æ·çé¢åREST API ä¾ç¨æ·è½»æ¾å°å®ä¹å管ççç¥ï¼ä¸ååªéå æ¬¡é¼ æ ç¹å»èå·²ãEagleçç¨æ·çé¢ä½¿å¾çç¥ç管çãææå æ°æ®çæ è¯åå¯¼å ¥ãHDFSæHive çèµæºæµè§ä»¥åé¢è¦ä»ªè¡¨çåè½é½é常æäºä½¿ç¨ã</p> + +<p>Eagle çç¥å¼æé»è®¤æ¯æWSO2çSiddhi CEPå¼æåæºå¨å¦ä¹ 弿ï¼ä»¥ä¸æ¯å 个åºäºSiddi CEPççç¥ç¤ºä¾</p> + +<ul> + <li> + <p>åä¸äºä»¶æ§è¡çç¥ï¼ç¨æ·è®¿é®Hiveä¸çæææ°æ®åï¼</p> + + <pre><code> from hiveAccessLogStream[sensitivityType=='PHONE_NUMBER'] select * insert into outputStream; +</code></pre> + </li> + <li> + <p>åºäºçªå£ççç¥ï¼ç¨æ·å¨10åéå 访é®ç®å½ /tmp/private å¤ä½ 5次ï¼</p> + + <pre><code> hdfsAuditLogEventStream[(src == '/tmp/private')]#window.externalTime(timestamp,10 min) select user, count(timestamp) as aggValue group by user having aggValue >= 5 insert into outputStream; +</code></pre> + </li> +</ul> + +<p><strong>æ¥è¯¢æå¡ï¼Query Serviceï¼</strong> Eagle æä¾ç±»SQLçREST APIç¨æ¥å®ç°éå¯¹æµ·éæ°æ®éç综å计ç®ãæ¥è¯¢ååæçè½åï¼æ¯æä¾å¦è¿æ»¤ãèåãç´æ¹è¿ç®ãæåºãtopãç®æ¯è¡¨è¾¾å¼ä»¥åå页çãEagleä¼å æ¯æHBase ä½ä¸ºå ¶é»è®¤æ°æ®åå¨ï¼ä½æ¯åæ¶ä¹æ¯æåºJDBCçå ³ç³»åæ°æ®åºãç¹å«æ¯å½éæ©ä»¥HBaseä½ä¸ºå卿¶ï¼Eagle便åçæ¥æäºHBaseåå¨åæ¥è¯¢æµ·éçæ§æ°æ®çè½åï¼Eagle æ¥è¯¢æ¡æ¶ä¼å°ç¨æ·æä¾çç±»SQLæ¥è¯¢è¯æ³æç»ç¼è¯æä¸ºHBase åççFilter 对象ï¼å¹¶æ¯æéè¿HBase Coprocessorè¿ä¸æ¥æåååºé度ã</p> + +<pre><code>query=AlertDefinitionService[@dataSource="hiveQueryLog"]{@policyDef}&pageSize=100000 +</code></pre> + +<h2 id="eagleebay">Eagleå¨eBayç使ç¨åºæ¯</h2> +<p>ç®åï¼Eagleçæ°æ®è¡ä¸ºçæ§ç³»ç»å·²ç»é¨ç½²å°ä¸ä¸ªæ¥æ2500å¤ä¸ªèç¹çHadoopé群ä¹ä¸ï¼ç¨ä»¥ä¿æ¤æ°ç¾PBæ°æ®çå®å ¨ï¼å¹¶æ£è®¡åäºä»å¹´å¹´åºä¹åæ©å±å°å ¶ä»ä¸å个Hadoopé群ä¸ï¼ä»èè¦çeBay ææä¸»è¦Hadoopç10000å¤å°èç¹ã卿们çç产ç¯å¢ä¸ï¼æä»¬å·²é对HDFSãHive çé群ä¸çæ°æ®é ç½®äºä¸äºåºç¡çå®å ¨çç¥ï¼å¹¶å°äºå¹´åºä¹å䏿å¼å ¥æ´å¤ççç¥ï¼ä»¥ç¡®ä¿éè¦æ°æ®çç»å¯¹å®å ¨ãç®åï¼Eagleççç¥æ¶µçå¤ç§æ¨¡å¼ï¼å æ¬ä»è®¿é®æ¨¡å¼ãé¢ç¹è®¿é®æ°æ®éï¼é¢å®ä¹æ¥è¯¢ç±»åãHive 表ååãHBase 表以ååºäºæºå¨å¦ä¹ 模åçæçç¨æ·Profileç¸å ³çææçç¥çãåæ¶ï¼æä»¬ä¹æå¹¿æ³ççç¥æ¥é²æ¢æ°æ®çä¸¢å¤±ãæ°æ®è¢«æ·è´å°ä¸å®å ¨å°ç¹ãæææ°æ®è¢«æªææåºå访é®çãEagleçç¥å®ä¹ä¸æå¤§ççµæ´»æ§åæ©å±æ§ä½¿å¾æä»¬æªæ¥å¯ä»¥è½»æå°ç»§ç»æ©å±æ´å¤æ´å¤æççç¥ä»¥æ¯ææ´å¤å¤å åç ç¨ä¾åºæ¯ã</p> + +<h2 id="section-1">åç»è®¡å</h2> +<p>è¿å»ä¸¤å¹´ä¸ï¼å¨eBay é¤äºè¢«ç¨äºæ°æ®è¡ä¸ºçæ§ä»¥å¤ï¼Eagle æ ¸å¿æ¡æ¶è¿è¢«å¹¿æ³ç¨äºçæ§èç¹å¥åº·ç¶åµãHadoopåºç¨æ§è½ææ ãHadoop æ ¸å¿æå¡ä»¥åæ´ä¸ªHadoopé群çå¥åº·ç¶åµç诸å¤é¢åãæä»¬è¿å»ºç«ä¸ç³»åçèªå¨åæºå¶ï¼ä¾å¦èç¹ä¿®å¤çï¼å¸®å©æä»¬å¹³å°é¨é¨æå¤§å¾èçäºæä»¬äººå·¥å³åï¼å¹¶ææå°æåäºæ´ä¸ªéç¾¤èµæºå°å©ç¨çã</p> + +<p>以䏿¯æä»¬ç®åæ£å¨å¼åä¸å°ä¸äºç¹æ§ï¼</p> + +<ul> + <li>æ©å±æºå¨å¦ä¹ 模å对HiveåHBaseæ¯æ</li> + <li>æä¾é«åº¦å¯æ©å±çAPIï¼ä»¥æ¹ä¾¿éç®åä¸ç广æ³ä½¿ç¨çå ¶ä»çæ§é¢è¦å¹³å°æè å·¥å ·ï¼å¦GangliaåNagiosçï¼åæ¶æ¯ææææ°æ®çå¯¼å ¥ï¼å¦ä¸Dataguise éæçã</li> + <li>æ¤å¤ï¼æä»¬æ£å¨ç§¯ææ´çå ¶ä»Hadoop éç¾¤çæ§æ¨¡åï¼ææå¨åç»åå¸ä¸å¼æºç»ç¤¾åºï¼ä¾å¦ + <ul> + <li>HBase çæ§</li> + <li>Hadoop ä½ä¸æ§è½çæ§</li> + <li>Hadoop èç¹çæ§</li> + </ul> + </li> +</ul> + +<h2 id="section-2">å ³äºä½è </h2> +<p><a href="https://github.com/haoch">éæµ©</a>ï¼Apache Eagle Committer å PMC æåï¼eBay åæå¹³å°åºç¡æ¶æé¨é¨é«çº§è½¯ä»¶å·¥ç¨å¸ï¼è´è´£Eagleç产åè®¾è®¡ãææ¯æ¶æãæ ¸å¿å®ç°ä»¥å弿ºç¤¾åºæ¨å¹¿çã</p> + +<p>æè°¢ä»¥ä¸æ¥èªApache Eagle社åºåeBayå ¬å¸çèåä½è ä»¬å¯¹æ¬æçè´¡ç®ï¼</p> + +<ul> + <li><a href="https://github.com/yonzhang">å¼ å</a>ï¼Apache Eagle CommitteråPMCï¼eBay èµæ·±æ¶æå¸</li> + <li><a href="https://github.com/sunlibin">åç«æ</a>ï¼Apache Eagle CommitteråPMCï¼eBay 软件工ç¨å¸</li> + <li><a href="https://github.com/zombiej">èåéº</a>ï¼Apache Eagle CommitteråPMCï¼eBay 软件工ç¨å¸</li> + <li><a href="https://github.com/qingwen220">èµµæ´é¯</a>ï¼Apache Eagle CommitteråPMCï¼eBay 软件工ç¨å¸</li> +</ul> + +<p>eBay åæå¹³å°åºç¡æ¶æé¨ï¼Analytics Data Infrastructureï¼æ¯eBayçå ¨çæ°æ®ååæåºç¡æ¶æé¨é¨ï¼è´è´£eBay卿°æ®åºãæ°æ®ä»åºãHadoopãå塿ºè½ä»¥åæºå¨å¦ä¹ çåä¸ªæ°æ®å¹³å°å¼åã管çç,æ¯æeBayå ¨çåé¨é¨è¿ç¨é«ç«¯çæ°æ®åæè§£å³æ¹æ¡ä½åºåæ¶ææçä½ä¸å³çï¼ä¸ºéå¸å ¨ççä¸å¡ç¨æ·æä¾æ°æ®åæè§£å³æ¹æ¡ã</p> + +<h2 id="section-3">åèèµæ</h2> + +<ul> + <li>Apache Eagle ææ¡£ï¼<a href="http://goeagle.io">http://goeagle.io</a></li> + <li>Apache Eagle æºç ï¼<a href="http://github.com/apache/incubator-eagle">http://github.com/apache/incubator-eagle</a></li> + <li>Apache Eagle 项ç®ï¼<a href="http://incubator.apache.org/projects/eagle.html">http://incubator.apache.org/projects/eagle.html</a></li> +</ul> + +<h2 id="section-4">å¼ç¨é¾æ¥</h2> +<ul> + <li><strong>CSDN</strong>: <a href="http://www.csdn.net/article/2015-10-29/2826076">http://www.csdn.net/article/2015-10-29/2826076</a></li> + <li><strong>OSCHINA</strong>: <a href="http://www.oschina.net/news/67515/apache-eagle">http://www.oschina.net/news/67515/apache-eagle</a></li> + <li><strong>China Hadoop Summit</strong>: <a href="http://mp.weixin.qq.com/s?__biz=MzA4MTkyODIzMA==&mid=400298495&idx=1&sn=954031ba8065481c31a3464e2c8a26a5&scene=1&srcid=1102zgGQzedckCmNrfRwounA&uin=MjYyNzgwNDQwMA%3D%3D&key=04dce534b3b035efe14d53fcf6e7062a63179003551e59fad5cf8584703fcaa38779cc4c93cbf931c25f6b34cb2d7653&devicetype=iMac+MacBookPro11%2C3+OSX+OSX+10.10.5+build(14F1021)&version=11020201&lang=en&pass_ticket=TC%2Bod2ZeFnhmci%2Bi4%2BxTTVD6moUrNFX8RXppzoQSa%2BXO3C7evUDs6njeYbsYyCFD">http://mp.weixin.qq.com/s?â¦</a></li> + <li><strong>Apache Kylin</strong>: <a href="http://mp.weixin.qq.com/s?__biz=MzAwODE3ODU5MA==&mid=400287781&idx=1&sn=343b2b29a37f8ed53a7ecb0465faf515&scene=0&uin=MjYyNzgwNDQwMA%3D%3D&key=04dce534b3b035ef73f964362ac4c43d452ab1b208eb357c488dfcd7d69209e060cfe01e9b146752517d2096f6751370&devicetype=iMac+MacBookPro11%2C3+OSX+OSX+10.10.5+build(14F1021)&version=11020201&lang=en&pass_ticket=TC%2Bod2ZeFnhmci%2Bi4%2BxTTVD6moUrNFX8RXppzoQSa%2BXO3C7evUDs6njeYbsYyCFD">http://mp.weixin.qq.com/s?â¦</a></li> +</ul> + +<hr /> + +<p><em>æ¬ææ¥èªApache Eagleç½ç«ï¼<a href="http://goeagle.io">http://goeagle.io</a>ï¼è½¬è½½è¯·æ³¨æåºå¤åæ¥æºã</em></p> + + </article> +</div> + + </div> + </div> + <!-- footer start --> +<div class="footerwrapper"> + <div class="container"> + <div class="row"> + <div class="col-md-12"><div style="margin-left:auto; margin-right:auto; text-align:center;font-size: 12px"> +<div> +</div> +<div> +<a href="http://www.apache.org"> +<img id="asf-logo" alt="Apache Software Foundation" src="/images/apache-logo-small.gif"> +</a> +</div> +<div> +Copyright © 2015 <a href="http://www.apache.org">The Apache Software Foundation</a>, Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>. +</div> +<div> +Apache Eagle, Eagle, Apache Hadoop, Hadoop, Apache HBase, HBase, Apache Hive, Hive, Apache Ambari, Ambari, Apache Spark, Spark, Apache Kafka, Kafka, Apache Storm, Storm, Apache Maven, Maven, Apache Tomcat, Tomcat, Apache Derby, Derby, Apache Cassandra, Cassandra, Apache ZooKeeper, ZooKeeper, Apache, the Apache feather logo, and the Apache project logo are trademarks of The Apache Software Foundation. +</div> + </div></div> + </div> + </div> +</div> +<!-- footer end --> + +<!-- JavaScripts --> +<script src="/js/jquery-1.11.1.min.js"></script> +<script src="/js/jquery.singlePageNav.js"></script> +<script src="/js/jquery.flexslider.js"></script> +<script src="/js/modernizr.min.js"></script> +<script src="/js/svg.js"></script> +<script> + /************** FlexSlider *********************/ + $('.flexslider').flexslider({ + animation: "fade", + directionNav: false + }); +</script> + </body> +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/eagle/blob/0ecb7c1c/eagle-site/about.md ---------------------------------------------------------------------- diff --git a/eagle-site/about.md b/eagle-site/about.md new file mode 100644 index 0000000..fca4517 --- /dev/null +++ b/eagle-site/about.md @@ -0,0 +1,11 @@ +--- +layout: page +title: About +permalink: /about/ +--- + +This is the base Jekyll theme. You can find out more info about customizing your Jekyll theme, as well as basic Jekyll usage documentation at [jekyllrb.com](http://jekyllrb.com/) + +You can find the source code for the Jekyll new theme at: [github.com/jglovier/jekyll-new](https://github.com/jglovier/jekyll-new) + +You can find the source code for Jekyll at [github.com/jekyll/jekyll](https://github.com/jekyll/jekyll) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/eagle/blob/0ecb7c1c/eagle-site/ambari-plugin-install.md ---------------------------------------------------------------------- diff --git a/eagle-site/ambari-plugin-install.md b/eagle-site/ambari-plugin-install.md new file mode 100644 index 0000000..f5d1df7 --- /dev/null +++ b/eagle-site/ambari-plugin-install.md @@ -0,0 +1,51 @@ +--- +layout: doc +title: "Install Apache Eagle Ambari Plugin" +permalink: /docs/ambari-plugin-install.html +--- + +Assume Apache Eagle (called Eagle in the following) package has been copied and exacted under /usr/hdp/current/eagle. + +> **WARNING**: the following instructions work in sandbox currently. + + +### Pre-requisites + +1. Create a Kafka[^KAFKA] topic if you have not. Here is an example command. + + $ /usr/hdp/current/kafka-broker/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic sandbox_hdfs_audit_log + +2. Stream HDFS log data to Kafka, and refer to [here](/docs/import-hdfs-auditLog.html) on how to do it . + +### Installation Steps + +1. Start dependent services Storm[^STORM], Spark[^SPARK], HBase[^HBASE] & Kafka via Ambari[^AMBARI]. + +2. Install Eagle Ambari plugin + + $ /usr/hdp/current/eagle/bin/eagle-ambari.sh install + +3. Restart [Ambari](http://127.0.0.1:8000/) click on disable and enable Ambari back. + +4. Add Eagle Service to Ambari. Click on "Add Service" on Ambari Main page + +  +  + +5. Add Policies and meta data required by running the below script. + + $ cd <eagle-home> + $ examples/sample-sensitivity-resource-create.sh + $ examples/sample-policy-create.sh + + + +--- + +#### *Footnotes* + +[^HBASE]:*Apache HBase.* +[^AMBARI]:*All mentions of "ambari" on this page represent Apache Ambari.* +[^SPARK]:*Apache Spark.* +[^KAFKA]:*All mentions of "kafka" on this page represent Apache Kafka.* +[^STORM]:*Apache Storm.* http://git-wip-us.apache.org/repos/asf/eagle/blob/0ecb7c1c/eagle-site/application-configuration.md ---------------------------------------------------------------------- diff --git a/eagle-site/application-configuration.md b/eagle-site/application-configuration.md new file mode 100644 index 0000000..5619e2a --- /dev/null +++ b/eagle-site/application-configuration.md @@ -0,0 +1,85 @@ +--- +layout: doc +title: "Application Configuration" +permalink: /docs/configuration.html +--- + +Apache Eagle (called Eagle in the following) requires you to create a configuration file under `$EAGLE_HOME/conf/` for each application. Basically, there are some common properties shared, e.g., envContextConfig, eagleProps, and dynamicConfigSource. While dataSourceConfig differs from application to application. + +In this page we take the following two application as examples + +* HDFS Audit Log Configuration +* Hive[^HIVE] Query Log Configuration + + +### HDFS Audit Log Configuration +--- + + Class ||| Property Name ||| Description + -----------------||| ------------- ||| ----------- + envContextConfig ||| env ||| currently only Storm[^STORM] is supported. + ||| mode ||| local or cluster + ||| topologyName ||| in the format {site}-{topology-name} + ||| stormConfigFile ||| a storm configuration file for overriding some Storm properties + ||| parallelismConfig ||| parallelism for both Kafka[^KAFKA] consumer and alert executors +dataSourceConfig ||| **topic** ||| Kafka topic for audit log streaming, make sure it exists + ||| **zkConnection*** |||ZooKeeper[^ZOOKEEPER] connection string, you can also specify multiple hosts in the form hostname1:port1,hostname2:port2, ... + |||zkConnectionTimeoutMS ||| zookeeper connection timeout + ||| fetchSize ||| kafka maximal message fetching size, default value is 1048586 + ||| deserializerClass ||| org.apache.eagle.security.auditlog.HdfsAuditLogKafkaDeserializer + ||| transactionZKServers ||| ZooKeeper servers, you can also specify multiple hosts in the form hostname1,hostname2,hostname3 + ||| transactionZKPort ||| ZooKeeper connection port + ||| transactionZKRoot ||| ZooKeeper chroot path for Eagle + ||| consumerGroupId ||| only for hdfsAuditLog + ||| transactionStateUpdateMS ||| default is 2000 +alertExecutorConfigs ||| parallelism ||| default is 1 + ||| partitioner ||| default value is eagle.alert.policy.DefaultPolicyPartitioner + ||| needValidation ||| true or false +eagleProps ||| **site*** ||| site name, such as sandbox, datacenter1, datacenter2 + ||| dataSource ||| hdfsAuditLog + ||| dataJoinPollIntervalSec ||| time interval for retrieving data from HBase[^HBASE] + ||| **mailHost*** ||| SMTP server + ||| **mailSmtpPort*** ||| SMTP server port, default is 25 + ||| mailDebug ||| true or false + ||| eagleService.host ||| Tomcat[^TOMCAT] server host, default is localhost + ||| eagleService.port ||| 9099 + ||| eagleService.username ||| admin + ||| eagleService.password ||| secret + dynamicConfigSource ||| enabled ||| true or false, default is true + ||| initDelayMillis ||| default is 0 + ||| delayMillis ||| default is 30000 + + +<br /> + +### Hive Query Log Configuration +--- + + Class ||| Property Name ||| Description + -----------------||| ------------- ||| ----------- + envContextConfig ||| same as HDF ||| + dataSourceConfig ||| flavor ||| stormrunning + ||| **zkQuorum*** ||| ZooKeeper connection string, you can also specify multiple hosts in the form hostname1:port1,hostname2:port2,hostname3:port3 + ||| **zkRoot*** ||| ZooKeeper chroot path for Eagle to store data, default is /jobrunning + ||| zkSessionTimeoutMs ||| ZooKeeper session timeout, default is 15000 + ||| zkRetryTimes ||| ZooKeeper retry times, default is 3 + ||| zkRetryInterval ||| default is 2000 + ||| **RMEndPoints*** ||| yarn.resourcemanager.webapp.address. Default value is http://localhost:8088/ + ||| **HSEndPoint*** ||| mapreduce.jobhistory.webapp.address. Default values is http://localhost:19888/ + ||| partitionerCls ||| eagle.job.DefaultJobPartitionerImpl + alertExecutorConfigs ||| same as HDFS ||| + eagleProps ||| same as HDFS ||| + dynamicConfigSource ||| same as HDFS ||| + +<br /> + +--- + +#### *Footnotes* + +[^HBASE]:*Apache HBase.* +[^HIVE]:*All mentions of "hive" on this page represent Apache Hive.* +[^KAFKA]:*All mentions of "kafka" on this page represent Apache Kafka.* +[^STORM]:*All mentions of "storm" on this page represent Apache Storm.* +[^TOMCAT]:*Apache Tomcat.* +[^ZOOKEEPER]:*All mentions of "zookeeper" on this page represent Apache ZooKeeper.* http://git-wip-us.apache.org/repos/asf/eagle/blob/0ecb7c1c/eagle-site/cloudera-integration.md ---------------------------------------------------------------------- diff --git a/eagle-site/cloudera-integration.md b/eagle-site/cloudera-integration.md new file mode 100644 index 0000000..52e0eda --- /dev/null +++ b/eagle-site/cloudera-integration.md @@ -0,0 +1,166 @@ +--- +layout: doc +title: "Cloudera Integration" +permalink: /docs/cloudera-integration.html +--- + +*Since Eagle 0.4.0* + +Configuring Apache Eagle on Cloudera is very similar to configuring it on Hortonworks, but still there are some difference. +This tutorial is to address these issues before you continue to follow the tutorials originally prepared for Hortonworks. + +### Prerequisites + +To get Apache Eagle works on Cloudera, we need: + +* Zookeeper (installed through Cloudera Manager) +* Kafka (installed through Cloudera Manager) +* Storm (``0.9.x`` or ``0.10.x``, installed manually) +* Logstash (``2.X``, installed manually on NameNode) + + +### Kafka + +#### Configuration + +There are two configurations needed to be mentioned: + +* Open Cloudera Manager and open "kafka" configuration, then set ``âzookeeper Rootâ`` to ``â/â``. + +* If Kafka cannot be started successfully, check kafkaâs log. If stack trace shows: ``âjava.lang.OutOfMemoryError: Java heap spaceâ``. Increase heap size by setting ``"KAFKA_HEAP_OPTS"``in ``/bin/kafka-server-start.sh``. + +Example: + +~~~ + export KAFKA_HEAP_OPTS="-Xmx2G -Xms2G" +~~~ + + + +#### Verification + +- Step1: create a kafka topic (here I created a topic called âtestâ, which will be used in logstash configuration file to receive hdfsAudit log messages from Cloudera. + +~~~ +bin/kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --replication-factor 1 --partitions 1 --topic test +~~~ + +- Step2: check if topic has been created successfully. + +~~~ +bin/kafka-topics.sh --list --zookeeper 127.0.0.1:2181 +~~~ + +this command will show all created topics. + +- Step3: open two terminals, start âproducerâ and âconsumerâ separately. + +~~~ +/usr/bin/kafka-console-producer --broker-list hostname:9092 --topic test +/usr/bin/kafka-console-consumer --zookeeper hostname:2181 --topic test +~~~ + +- Step4: type in some message in producer. If consumer can receive the messages sent from producer, then kafka is working fine. Otherwise please check the configuration and logs to identify the root cause of issues. + + + +### Logstash + +#### Installation + +You can follow [logstash online doc](https://www.elastic.co/downloads/logstash) to download and install logstash on your machine: + +Or you can install it through ``yum`` if you are using centos: + +- download and install the public signing key: + +~~~ +rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch +~~~ + +- Add the following lines in ``/etc/yum.repos.d/`` directory in a file with a ``.repo`` suffix, for example ``logstash.repo``. + +~~~ +[logstash-2.3] +name=Logstash repository for 2.3.x packages +baseurl=https://packages.elastic.co/logstash/2.3/centos +gpgcheck=1 +gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch +enabled=1 +~~~ + +- Then install it using ``yum``: + +~~~ +yum install logstash +~~~ + +#### Create conf file + +Follow [Apache Eagle online documentation](https://github.com/apache/incubator-eagle/blob/branch-0.4/eagle-assembly/src/main/docs/logstash-kafka-conf.md) to create logstash configuration file for Apache Eagle. + +#### Start logstash + +~~~ +bin/logstash -f conf/first-pipeline.conf +~~~ + +#### Verification + +Open a terminal and start a kafka consumer to see if it can receive the messages sent by logstash, if there is no message, double check the configuration parameters in conf file. Otherwise logstash is all set. + +### Apache Storm +As Apache Storm is not in Clouderaâs stack, we need to install Storm manually. + +#### Installation + +Download Apache Storm from [here](http://storm.apache.org/downloads.html), the version you choose should be ``0.10.x`` or ``0.9.x`` release. +Then follow [Apache Storm online doc](http://storm.apache.org/releases/0.10.0/Setting-up-a-Storm-cluster.html)) to install Apache Storm on your cluster. + +In ``/etc/profile``, add this: + +~~~ +export PATH=$PATH:/opt/apache-storm-0.10.1/bin/ +~~~ + +save the profile and then type: + +~~~ +source /etc/profile +~~~ + +to make it work. + +#### Configuration + +In ``storm/conf/storm.yaml``, change the hostname to your own host. + +#### Start Apache Storm + +In Termial, type: + +~~~ +$: storm nimbus +$: storm supervisor +$: storm UI +~~~ + +#### Verification + +Open storm UI in your browser, default URL is : ``http://hostname:8080/index.html``. + +### Apache Eagle + +To download and install Apache Eagle, please refer to [Get Started with Sandbox.](http://eagle.incubator.apache.org/docs/quick-start.html) . + +One thing need to mention is: in ``â/bin/eagle-topology.shâ``, line 102: + +~~~ + storm_ui=http://localhost:8080 +~~~ + +If you are not using the default port number, change this to your own Storm UI url. + +I know it takes time to finish these configuration, but now it is time to have fun! +Just try ``HDFS Data Activity Monitoring`` with ``Demo`` listed in [HDFS Data Activity Monitoring.](http://eagle.incubator.apache.org/docs/hdfs-data-activity-monitoring.html) + http://git-wip-us.apache.org/repos/asf/eagle/blob/0ecb7c1c/eagle-site/community.md ---------------------------------------------------------------------- diff --git a/eagle-site/community.md b/eagle-site/community.md new file mode 100644 index 0000000..0ea6358 --- /dev/null +++ b/eagle-site/community.md @@ -0,0 +1,95 @@ +--- +layout: doc +title: "Apache Eagle Community" +permalink: /docs/community.html +--- +### Mailing Lists + +|Name|||||Email|||||Subscribe|Unsubscribe|Archive| +|----|||||-----|||||---------|-----------|-------| +| User Mailling List|||||[[email protected]](mailto:[email protected])|||||[subscribe](mailto:[email protected])|[unsubscribe](mailto:[email protected])| [eagle-user](http://mail-archives.apache.org/mod_mbox/eagle-user/)| +| Dev Mailling List|||||[[email protected]](mailto:[email protected])|||||[subscribe](mailto:[email protected])|[unsubscribe](mailto:[email protected])| [eagle-dev](http://mail-archives.apache.org/mod_mbox/eagle-dev/)| +| Issues Mailling List|||||[[email protected]](mailto:[email protected])|||||[subscribe](mailto:[email protected])|[unsubscribe](mailto:[email protected])| [eagle-issues](http://mail-archives.apache.org/mod_mbox/eagle-issues/)| +| Commits Mailling List|||||[[email protected]](mailto:[email protected])|||||[subscribe](mailto:[email protected])|[unsubscribe](mailto:[email protected])| [eagle-commits](http://mail-archives.apache.org/mod_mbox/eagle-commits/)| + + +### Issue Tracker + +[https://issues.apache.org/jira/browse/EAGLE](https://issues.apache.org/jira/browse/EAGLE) + +### Eagle Team + +#### PMC Members + +* [Edward Zhang (å¼ å)](https://github.com/yonzhang) +* [Hao Chenï¼é浩ï¼](https://github.com/haoch) +* [Libin Sunï¼åç«æï¼](https://github.com/sunlibin) +* [Jilin Jiangï¼å°åéºï¼](https://github.com/zombiej) +* [Qingwen Zhaoï¼èµµæ´é¯ï¼](https://github.com/qingwen220) +* [Hemanth Dendukuri](https://github.com/hdendukuri) +* [Senthil Kumar](https://github.com/senthilec566) +* [Arun Manoharan](https://github.com/armanoharan) +* [Adunuthula, Seshu](https://github.com/seshuad) +* [Michael Wu (æ¦åæ¬)](https://github.com/anyway1021) + +#### Commiters + +* [Edward Zhang (å¼ å)](https://github.com/yonzhang) +* [Hao Chenï¼é浩ï¼](https://github.com/haoch) +* [Chaitali Gupta](https://github.com/chaitaligupta) +* [Libin Sunï¼åç«æï¼](https://github.com/sunlibin) +* [Jilin Jiangï¼å°åéºï¼](https://github.com/zombiej) +* [Qingwen Zhaoï¼èµµæ´é¯ï¼](https://github.com/qingwen220) +* [Hemanth Dendukuri](https://github.com/hdendukuri) +* [Senthil Kumar](https://github.com/senthilec566) +* [Arun Manoharan](https://github.com/armanoharan) +* [Adunuthula, Seshu](https://github.com/seshuad) +* [Liangfei Su (èè¯é£)](https://github.com/RalphSu) +* [Daniel Zhou (å¨è¾¾)](https://github.com/DadanielZ) +* [Michael Wu (æ¦åæ¬)](https://github.com/anyway1021) +* [Jinhu Wu (å´éè)](https://github.com/wujinhu) +* [Jijun Tang](https://github.com/r7raul1984) + +#### Contributors + +* [Prasad Mujumdar](https://github.com/pmujumdar) +* [Jaspaul Chahal](https://github.com/Jashchahal) +* [Huizhi Lu](https://github.com/pkuwm) +* [Jing Ge](https://github.com/JingGe) +* [boscodurai](https://github.com/boscodurai) +* [Ju He](https://github.com/joe-hj) +* [Chang Chen](https://github.com/baibaichen) +* [Huizhi Lu](https://github.com/pkuwm) +* [koone](https://github.com/koone) +* [qinzhaokun](https://github.com/qinzhaokun) +* [mizeng](https://github.com/mizeng) +* [chitin](https://github.com/chitin) + +### Project History + +* **Oct 20th, 2015** Eagle was officially open sourced by [eBay Inc.](http://www.ebay.com). + +### Credits + +* Thanks [eBay Inc.](http://www.ebay.com) to donated this project to open source community, first announement at [eBay Techblog](http://www.ebaytechblog.com/2015/10/23/eagle-is-your-hadoop-data-secured/). + +### Social Network + +* **Twitter**: [@TheApacheEagle](https://twitter.com/TheApacheEagle) +* **Wechat**: Apache_Eagle + +### Events and Meetups[^HADOOP] + +**Conferences** + +* [**IEEE BigData 2015**](http://cci.drexel.edu/bigdata/bigdata2015/): [Eagle: User Profile-based Anomaly Detection in Hadoop Clusters](http://cci.drexel.edu/bigdata/bigdata2015/APaper.html) by [Chaitali Gupta](https://github.com/chaitaligupta) and [Edward Zhang](https://github.com/yonzhang) on Oct 29 - Nov 01, 2015 at [Santa Clara, CA, USA](https://www.google.com/maps/place/Santa+Clara,+CA) +* [**China Hadoop Summit 2015**](http://www.chinahadoop.com/english): [Hadoop Eagle - Real Time Monitoring Platform](http://www.slideshare.net/haoch/hadoop-eaglev4) by [Hao Chen](https://github.com/haoch) on July 23 - 24, 2015 at [Shanghai, China](https://www.google.com/maps/place/Shanghai,+China) +* [**Hadoop Summit 2015**](http://2015.hadoopsummit.org/san-jose/): [Hadoop Eagle - Real Time Monitoring Framework for eBay Hadoop](http://www.slideshare.net/Hadoop_Summit/hadoop-eagle-real-time-monitoring) by [Edward Zhand](https://github.com/yonzhang) and [Hao Chen](https://github.com/haoch) on June 9 - 11, 2015 at [San Jose, CA, USA](https://www.google.com/maps/place/San+Jose,+CA) +<br/> + + +--- + +#### *Footnotes* + +[^HADOOP]:*All mentions of "hadoop" on this page represent Apache Hadoop.*
