CINXE.COM
Traitements Big Data avec Apache Spark - 1ère partie : Introduction - InfoQ
<!DOCTYPE html> <html lang="fr" xmlns="http://www.w3.org/1999/xhtml"> <head> <!-- Google Optimize Anti-flicker snippet (recommended) --> <style>.async-hide { opacity: 0 !important} </style> <style>.promo{background:#222528;position:fixed;z-index:1001!important;left:0;top:0;right:0;max-height:48px;min-height:48px;padding-top:0!important;padding-bottom:0!important}.promo,.promo p{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.promo p{font-size:.8125rem;line-height:1rem;color:#fff;margin-bottom:0;margin-top:0;margin:0 auto;display:-webkit-box;display:-ms-flexbox;display:flex;font-weight:700}@media only screen and (max-width:650px){.promo p{font-size:.6875rem}}.promo span{overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}.promo a{color:#fff!important;text-decoration:underline!important}.promo a.btn{background:#d0021b;padding:7px 20px;text-decoration:none!important;font-weight:700;margin-left:10px;margin-right:10px;white-space:nowrap;border-radius:5px}@media only screen and (max-width:650px){.promo a.btn{font-size:.6875rem;padding:7px 10px}}.promo.container{padding-top:8px;padding-bottom:8px}@media only screen and (min-width:1050px){.promo.container{padding-top:0;padding-bottom:0}}.promo .actions{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.promo .actions__left{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.promo .actions__right{-ms-flex-preferred-size:40px;flex-basis:40px;margin-top:0;margin-bottom:0;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.promo.hidden{display:none}.promo.show{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.promo.show .container__inner{-webkit-box-flex:1;-ms-flex:1;flex:1}.promo.fixed{position:fixed}.promo.show+header.header{margin-top:48px}.header{background:#fff;-webkit-box-shadow:0 1px 0 #dde2e5;box-shadow:0 1px 0 #dde2e5}.header .actions__left,.header__bottom__events{max-width:100%!important;margin:0}.header .header__events-all{margin:0;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.header .header__events-all .header__event-slot{-webkit-box-flex:1;-ms-flex:1 100%;flex:1 100%;border-right:1px solid #dde2e5;margin-top:3px;margin-bottom:3px;padding-left:15px;text-align:left;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-right:5px;min-width:300px}.header .header__events-all .header__event-slot:hover{text-decoration:none!important}.header .header__events-all .header__event-slot img{min-width:40px;height:40px}.header .header__events-all .header__event-slot div{margin-left:10px}.header .header__events-all .header__event-slot span{font-weight:700!important;font-size:.75rem;margin-bottom:0!important;margin-top:0;display:block;line-height:1.125rem;text-align:left}.header .header__events-all .header__event-slot p{font-weight:400;font-size:.625rem;line-height:130%!important;color:#495057!important;margin:0}@media only screen and (min-width:1050px){.header .header__events-all .header__event-slot p{font-size:.625rem}}.header .header__events-all .header__event-slot:first-child{padding-left:0}.header .header__events-all .header__event-slot:last-child{padding-right:0;border-right:0}@media only screen and (min-width:1050px){.header__bottom,.header__middle,.header__top{position:relative;white-space:nowrap}}.header__top{padding:10px 0}@media only screen and (min-width:800px){.header__top{padding:5px 0}}.header__bottom{padding:5px 0;z-index:29;max-width:100%}.header__bottom a{font-size:.8125rem}.header__bottom .trending{margin-left:0;margin-right:0}.header__bottom .actions{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.header__bottom .actions__left{max-width:calc(100% + 8px)}@media only screen and (min-width:800px){.header__bottom .actions__left{max-width:calc(100% + 24px)}}.header__bottom .actions__right{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;display:none}@media only screen and (min-width:1050px){.header__bottom .actions__right{display:-webkit-box;display:-ms-flexbox;display:flex}}.header__middle{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}@media only screen and (min-width:1050px){.header__middle{-ms-flex-wrap:nowrap;flex-wrap:nowrap}}.header__top .actions__left{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:center;align-content:center}@media only screen and (min-width:1050px){.header__top .actions__right{max-width:430px}}.no-style.header__nav li:nth-child(3){font-weight:700}.no-style.header__nav li:nth-child(3) a{color:#0e5ef1!important}.header__bottom__events::after{background:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,0)),to(#fff));background:linear-gradient(90deg,rgba(255,255,255,0) 0,#fff 100%);content:'';position:absolute;height:60px;right:10px;width:25px}@media only screen and (min-width:1050px){.header__bottom__events::after{display:none}}.contribute-link{font-weight:400;font-size:.6875rem;color:#000!important;position:relative;padding-left:10px}.contribute-link:hover{color:#00791d!important;text-decoration:none!important}.contribute-link::before{content:'';width:1px;height:12px;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background:rgba(0,0,0,.1);left:-1px}.my-0{margin-top:0!important;margin-bottom:0!important}.header__desc.my-0{margin-left:0}.header__bottom__events .actions__left{max-width:100%!important;overflow-x:scroll;-ms-overflow-style:none;scrollbar-width:none;display:block;scroll-behavior:smooth;min-width:100%}.header__bottom__events .actions__left::-webkit-scrollbar{display:none}.header__bottom__events .actions__left:-webkit-scrollbar-thumb{background:#fff}.logo{line-height:1rem}.header{position:relative;z-index:41;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.header .input:focus,.header input[type=password]:focus,.header input[type=text]:focus{border:1px solid #00791d}.header a:not(.button):not(.login__action):not(.active){text-decoration:none;color:#222}.header a:not(.button):not(.login__action):not(.active):hover{text-decoration:underline;color:#222}.header__items{display:none;-ms-flex-wrap:wrap;flex-wrap:wrap}@media only screen and (min-width:1050px){.header__items{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.header__items nav{position:relative;background:0 0;padding:0;left:0;top:0;line-height:inherit;display:block;-webkit-box-shadow:none;box-shadow:none;max-width:100%;max-height:80px}}.header__items>div{width:100%;margin-bottom:32px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column nowrap;flex-flow:column nowrap}@media only screen and (min-width:552px){.header__items>div:not(:nth-last-child(-n+2)){margin-bottom:32px}}@media only screen and (min-width:552px) and (max-width:1050px){.header__items>div{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:calc(99.7% * 1/2 - (32px - 32px * 1/2));flex-basis:calc(99.7% * 1/2 - (32px - 32px * 1/2));max-width:calc(99.7% * 1/2 - (32px - 32px * 1/2));width:calc(99.7% * 1/2 - (32px - 32px * 1/2))}.header__items>div:nth-child(1n){margin-right:32px;margin-left:0}.header__items>div:last-child{margin-right:0}.header__items>div:nth-child(2n){margin-right:0;margin-left:auto}}@media only screen and (min-width:800px) and (max-width:1050px){.header__items>div{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:calc(99.7% * 1/4 - (32px - 32px * 1/4));flex-basis:calc(99.7% * 1/4 - (32px - 32px * 1/4));max-width:calc(99.7% * 1/4 - (32px - 32px * 1/4));width:calc(99.7% * 1/4 - (32px - 32px * 1/4))}.header__items>div:nth-child(1n){margin-right:32px;margin-left:0}.header__items>div:last-child{margin-right:0}.header__items>div:nth-child(4n){margin-right:0;margin-left:auto}}@media only screen and (min-width:1050px){.header__items>div{margin-bottom:0!important;margin-right:0!important;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}}.header__items .language__switcher{display:none}.header__items .language__switcher .li-nav.active>a,.header__items .language__switcher>li.active>a{color:#fff!important}.header__items .language__switcher .li-nav.active>a:hover,.header__items .language__switcher>li.active>a:hover{color:#fff!important;background:#0e5ef1}.header__items .language__switcher .li-nav:hover>a,.header__items .language__switcher>li:hover>a{color:#fff}.header+main{display:block;min-height:210px;-webkit-transition:margin .15s ease;transition:margin .15s ease;margin-top:0!important}.header--hide .header+main{margin-top:50px}.header--hide .header__toggle{opacity:0;top:20px;visibility:hidden}.header--hide .header__logo{max-height:0}.header--hide .header__middle,.header--hide .header__top{max-height:0;overflow:hidden;padding-top:0;padding-bottom:0;border-color:transparent}.header--hide .header__bottom .vue-portal-target{top:3px;right:0;bottom:auto;left:auto;position:absolute}.header__middle,.header__top{-webkit-transition:all .15s ease;transition:all .15s ease}.header__middle{border-bottom:1px solid rgba(0,0,0,.1);z-index:33}.header__middle .vue-portal-target{width:100%}@media only screen and (min-width:1050px){.header__middle .vue-portal-target{display:none}}@media only screen and (min-width:1050px){.header__middle{line-height:5.75rem;text-align:left;padding:0;z-index:30}.header__middle .widget__heading{display:none}}.header__top>.actions__left{display:none}@media only screen and (min-width:1050px){.header__top>.actions__left{display:-webkit-box;display:-ms-flexbox;display:flex}}.header__top>.actions__right{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin-right:0;margin-top:0;margin-bottom:0;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.header__top>.actions__right .dropdown__holder{width:calc(100vw - 16px);max-height:80vh}@media only screen and (min-width:600px){.header__top>.actions__right .dropdown__holder{width:auto}}.header__top>.actions__right>*{margin:0}.header__top>.actions__right .search{display:none}@media only screen and (min-width:1050px){.header__top>.actions__right>*{display:-webkit-box;display:-ms-flexbox;display:flex;white-space:nowrap}.header__top>.actions__right .search{display:block}}.header__top .user__login{display:block}.header__top .user__login>.button,.header__top .user__login>button{border-top-right-radius:0;border-bottom-right-radius:0}@media only screen and (min-width:1050px){.header__top{position:relative;right:auto;width:100%}}.header__logo{max-width:165px;position:absolute;top:8px;overflow:hidden;-webkit-transition:all .1s ease;transition:all .1s ease;z-index:32;line-height:2.25rem;height:36px;width:100px;margin-left:50px;-ms-flex-preferred-size:190px;flex-basis:190px}@media only screen and (min-width:800px){.header__logo{top:4px}}@media only screen and (min-width:1050px){.header__logo{position:relative;top:0;overflow:visible;margin-right:20px;margin-left:0;line-height:3.125rem;height:50px}.header__logo>*{width:165px}}@media only screen and (min-width:1280px){.header__logo{margin-right:30px}}.header__desc,.header__more>button{text-transform:capitalize;color:#666;letter-spacing:0;font-size:0;font-weight:400;line-height:1.5rem;vertical-align:top;font-smoothing:antialiased;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI Variable","Segoe UI",system-ui,ui-sans-serif,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-transition:font-size .15s ease-in-out;transition:font-size .15s ease-in-out}@media only screen and (min-width:1050px){.header__desc,.header__more>button{font-size:.6875rem}}.header__desc{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;position:relative;width:auto}.header__topics{white-space:nowrap;float:right;position:relative}.header__topics *{display:inline-block;vertical-align:top}.header__topics a{font-size:.8125rem}@media only screen and (min-width:1050px){.header__topics{float:none}}.header__more{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:top}.header__more:before{left:-12px}.header__more:after,.header__more:before{content:'';width:1px;height:12px;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background:rgba(0,0,0,.1)}.header__more:after{right:-12px}.header__more:hover{cursor:pointer;color:rgba(0,0,0,.75)}.header__user{display:inline-block;vertical-align:top;white-space:nowrap;margin-left:8px}@media only screen and (min-width:1050px){.header__user{margin-left:0}}.header__user>div{display:inline-block;vertical-align:top}.header__user-nav a:not(.button){text-transform:uppercase;font-size:.75rem;font-weight:600}.header__user-nav a:not(.button):not(.active){opacity:.5}.header__user-nav a:not(.button):not(.active):hover{opacity:.75}.header__user-nav a:not(.button):hover{text-decoration:none}.header__user-nav a:not(.button).active{color:#222;cursor:default;text-decoration:none}.header__user-nav a:not(.button):before{margin-right:0}.header__user-nav a:not(.button):not(:last-child){margin-right:16px}@media only screen and (min-width:1050px){.header__user-nav a:not(.button):not(:last-child){margin-right:32px}}@media only screen and (min-width:1050px){.header__user-nav+.header__topics{margin-left:56px}}.header__search{display:none;vertical-align:top;margin-right:0}@media only screen and (min-width:1050px){.header__search{display:inline-block}}.header__search,.header__user{line-height:inherit}.header__nav{border-bottom:1px solid rgba(0,0,0,.1)}@media only screen and (min-width:800px){.header__nav{border-bottom:0}}.header__nav .button{margin-left:0}.header__nav .button__more{margin-right:20px}.header__nav .li-nav,.header__nav>li{-webkit-transition:all .15s ease;transition:all .15s ease}@media only screen and (min-width:1050px){.header__nav .li-nav,.header__nav>li{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;position:static;border:none;min-height:65px}.header__nav .li-nav:hover.has--subnav .nav .li-nav,.header__nav .li-nav:hover.has--subnav .nav>li,.header__nav>li:hover.has--subnav .nav .li-nav,.header__nav>li:hover.has--subnav .nav>li{white-space:normal}.header__nav .li-nav:hover.has--subnav .nav__subnav,.header__nav>li:hover.has--subnav .nav__subnav{opacity:1;top:100%;visibility:visible;-webkit-transition-delay:.25s;transition-delay:.25s}.header__nav .li-nav:hover.has--subnav .nav__category,.header__nav>li:hover.has--subnav .nav__category{width:100%}.header__nav .li-nav:hover.has--subnav .nav__category:after,.header__nav .li-nav:hover.has--subnav .nav__category:before,.header__nav>li:hover.has--subnav .nav__category:after,.header__nav>li:hover.has--subnav .nav__category:before{-webkit-transition-delay:.25s;transition-delay:.25s;opacity:1}}@media only screen and (min-width:1080px){.header__nav .li-nav:not(:last-child),.header__nav>li:not(:last-child){margin-right:23px;margin-left:23px}}@media only screen and (min-width:1280px){.header__nav .li-nav:not(:last-child),.header__nav>li:not(:last-child){margin-right:23px;margin-left:23px}}@media only screen and (min-width:1338px){.header__nav .li-nav:not(:last-child),.header__nav>li:not(:last-child){margin-right:23px;margin-left:23px}}.header__nav .li-nav>a,.header__nav>li>a{font-size:.875rem;line-height:1.5rem;padding:12px 0;color:#000;display:inline-block;max-width:100%;position:relative;z-index:61;white-space:normal}@media only screen and (min-width:1050px){.header__nav .li-nav>a,.header__nav>li>a{padding:8px 0 0;font-weight:700}}.header__nav .li-nav>a:after,.header__nav .li-nav>a:before,.header__nav>li>a:after,.header__nav>li>a:before{content:'';position:absolute;bottom:-1px;left:50%;width:0;height:0;opacity:0;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-style:solid;border-width:0 5px 5px 5px;-webkit-transition:opacity .15s ease-in-out;transition:opacity .15s ease-in-out;border-color:transparent transparent #fff transparent}.header__nav .li-nav>a:before,.header__nav>li>a:before{left:50%;bottom:0;border-width:0 6px 6px 6px;border-color:transparent transparent #f5f7f8 transparent}@media only screen and (min-width:1050px){.header__nav .li-nav>a,.header__nav>li>a{font-size:1rem}}@media only screen and (min-width:1800px){.header__nav .li-nav>a,.header__nav>li>a{font-size:1.125rem}}.header--open{overflow:hidden}@media only screen and (min-width:600px){.header--open{overflow:visible}}.header--open .content-items{max-height:215px;margin:12px 0 24px}.header--open .search{margin-top:16px;display:block}.header--open .header__toggle:before{z-index:10}.header--open .header__toggle>span:nth-child(1){top:50%;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.header--open .header__toggle>span:nth-child(2){opacity:0}.header--open .header__toggle>span:nth-child(3){top:50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.header--open .header__items,.header--open .header__items .language__switcher{display:-webkit-box;display:-ms-flexbox;display:flex}.header--open .header__top{z-index:100;position:absolute;left:0;right:8px;background:#fff}@media only screen and (min-width:800px){.header--open .header__top{right:20px}}.header--open .header__top .search{display:none}.header--open .header__logo{z-index:101}.header--open .header__middle{padding-top:60px}.header--open .header__bottom{display:none}.header--open .header__container{max-height:90vh;overflow-x:hidden;overflow-y:auto}@media only screen and (min-width:1050px){.header--open .header__container{overflow:visible}}.header .subnav{position:absolute;-webkit-box-shadow:0 5px 25px 1px rgba(0,0,0,.15);box-shadow:0 5px 25px 1px rgba(0,0,0,.15);background:#fff;visibility:hidden;line-height:1.75rem;max-width:100%;width:100%;left:0;opacity:0;overflow:hidden;border:1px solid #f5f7f8;border-radius:2px;-webkit-transition:all .15s ease-in-out;transition:all .15s ease-in-out;top:105%;z-index:60;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.header .subnav .subnav__categories{-webkit-box-flex:0;-ms-flex:0 1 280px;flex:0 1 280px;padding:24px 0;background:#f5f7f8;margin-right:0!important}.header .subnav .subnav__categories>li{display:block;font-size:.9375rem;padding:2px 48px 2px 24px}.header .subnav .subnav__categories>li a{display:block;font-weight:700}.header .subnav .subnav__categories>li:hover{background:#e1e1e1}.header .subnav .subnav__heading{margin-bottom:20px}.header .subnav .subnav__content{position:relative;-ms-flex-item-align:start;align-self:flex-start;padding:24px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}@media only screen and (min-width:1050px){.header .subnav .subnav__content{padding-left:32px;padding-right:32px;margin:0 auto;-webkit-box-flex:1;-ms-flex:1 1 600px;flex:1 1 600px}}.header .subnav .subnav__content .heading__container{-ms-flex-preferred-size:100%;flex-basis:100%}.header .subnav .subnav__content:before{content:'';position:absolute;left:0;top:0;bottom:-100%;width:1px;background:rgba(0,0,0,.1)}.languagesEdition .active{font-weight:700}.header__more.dropdown:after{content:'';display:inline-block;vertical-align:middle;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;background-repeat:no-repeat;background-position:center;margin-bottom:2px;width:7px;height:7px;-webkit-transition:-webkit-transform .15s ease;transition:-webkit-transform .15s ease;transition:transform .15s ease;transition:transform .15s ease,-webkit-transform .15s ease;background-color:#fff!important;background-size:contain}.header__more.dropdown button{color:#000!important;margin-right:-20px;padding-right:20px;z-index:1000}.header__more.dropdown .dropdown__holder{width:165px}.header__more.dropdown .dropdown__content{padding:13px;padding-top:5px;padding-bottom:5px}.header__more.dropdown .languagesEdition li{border-bottom:1px solid #e6e6e6}.header__more.dropdown .languagesEdition li:last-child{border:0}.logo__data{display:none;color:#666;font-size:.6875rem}@media only screen and (min-width:1050px){.logo__data{display:block;line-height:.8125rem}}.container{padding-left:12px;padding-right:12px;margin:0 auto;min-width:320px;-webkit-transition:padding .15s ease-in-out;transition:padding .15s ease-in-out}@media only screen and (min-width:600px){.container{padding-left:16px;padding-right:16px}}@media only screen and (min-width:800px){.container{padding-left:20px;padding-right:20px}}@media only screen and (min-width:1250px){.container{padding-left:60px;padding-right:60px}}@media only screen and (min-width:1400px){.container{padding-left:20px;padding-right:20px}}.container.white{background:#fff}.container__inner{max-width:1290px;margin:0 auto;-webkit-transition:max-width .15s ease-out;transition:max-width .15s ease-out}.search{display:block;position:relative;z-index:33;width:100%;max-width:100%;margin:0}.search:before{position:absolute;top:50%;right:24px;-webkit-transform:translateY(-50%);transform:translateY(-50%);margin-right:0;z-index:34}.search__bar{display:block;border-radius:2px;position:relative;z-index:33}.search__bar #search{margin-bottom:0;max-width:100%;background:#fff}.search__go{top:50%;right:0;bottom:0;left:auto;position:absolute;-webkit-transform:translateY(-50%);transform:translateY(-50%);z-index:32;-webkit-appearance:none;-moz-appearance:none;appearance:none;width:36px;height:36px;line-height:2.25rem;-webkit-box-shadow:none;box-shadow:none;display:block;background:0 0;border:0;font-size:0}@media only screen and (min-width:600px){.search__go{z-index:35}}.header #search,.search__go:hover{cursor:pointer}.header #search{height:36px;position:relative;max-width:100%;background-color:#f5f7f8!important}@media only screen and (min-width:600px){.header #search{font-size:.8125rem;min-width:165px;max-width:100%;opacity:1}}.header #search:hover{cursor:auto}@media only screen and (min-width:1050px){.header #search{margin-left:auto;border-top-right-radius:0;border-bottom-right-radius:0;border-right:0}.header #search:focus{min-width:215px}}.header #search:focus{cursor:auto}.header #search .field__desc{display:none}.header #searchForm{width:100%;margin-top:8px}.header #searchForm:before{right:8px}@media only screen and (min-width:600px){.header #searchForm{margin-top:16px}}@media only screen and (min-width:1050px){.header #searchForm{margin-top:0}}</style> <script>(function(a,s,y,n,c,h,i,d,e){s.className+=' '+y;h.start=1*new Date; h.end=i=function(){s.className=s.className.replace(RegExp(' ?'+y),'')}; (a[n]=a[n]||[]).hide=h;setTimeout(function(){i();h.end=null},c);h.timeout=c; })(window,document.documentElement,'async-hide','dataLayer',4000, {'GTM-W9GJ5DL':true});</script> <script type="text/javascript"> var loggedIn = false; if (loggedIn) { var userCountryId = ''; } </script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('config', 'G-VMVPD4D2JY'); //CookieControl tool recomendation // Call the default command before gtag.js or Tag Manager runs to // adjust how the tags operate when they run. Modify the defaults // per your business requirements and prior consent granted/denied, e.g.: gtag('consent', 'default', { 'ad_storage': 'denied', 'ad_user_data': 'denied', 'ad_personalization': 'denied', 'analytics_storage': 'denied' }); if((typeof loggedIn != "undefined") && loggedIn){ window.dataLayer.push({'logged_in': 'true'}); } else { window.dataLayer.push({'logged_in': 'false'}); } window.dataLayer.push({'show_queryz': ''}); </script> <!-- Google Tag Manager --> <script> var gtmProfile="GTM-W9GJ5DL"; (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer', gtmProfile);</script> <!-- End Google Tag Manager --> <title>Traitements Big Data avec Apache Spark - 1ère partie : Introduction - InfoQ</title> <link rel="canonical" href="https://www.infoq.com/fr/articles/apache-spark-introduction/"/> <link rel="alternate" href="https://www.infoq.com/fr/articles/apache-spark-introduction/" hreflang="fr"/> <link rel="alternate" href="https://www.infoq.com/articles/apache-spark-introduction/" hreflang="en" /> <link rel="alternate" href="https://www.infoq.com/fr/articles/apache-spark-introduction/" hreflang="x-default" /> <meta http-equiv="pragma" content="no-cache" /> <meta http-equiv="cache-control" content="private,no-cache,no-store,must-revalidate" /> <meta http-equiv="expires" content="0" /> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <meta name="copyright" content="© 2006 C4Media" /> <meta name="google-site-verification" content="0qInQx_1WYOeIIbxnh7DnXlw1XOxNgAYakO2k4GhNnY" /> <meta name="msapplication-TileColor" content="#ffffff"/> <meta name="msapplication-TileImage" content="/styles/static/images/logo/logo.jpg"/> <meta property="wb:webmaster" content="3eac1729a8bbe046" /> <meta content="width=device-width,initial-scale=1" name="viewport"> <meta http-equiv="X-UA-Compatible" content="IE=10, IE=edge"> <link rel="stylesheet" type="text/css" media="screen" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/style.css"/> <link rel="stylesheet" type="text/css" media="print" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/print.css"/> <link rel="preload" type="text/css" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/style_fr.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> <link rel="preload" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/icons.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> <link rel="preload" type="text/css" media="screen" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/style_extra.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> <noscript> <link rel="stylesheet" type="text/css" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/style_fr.css"/> <link rel="stylesheet" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/icons.css"> <link rel="stylesheet" type="text/css" media="screen" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/style_extra.css"/> </noscript> <link rel="stylesheet" type="text/css" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/fonts/font.css"/> <link rel="shortcut icon" href="https://cdn.infoq.com/statics_s2_20250228123450/favicon.ico" type="image/x-icon" /> <link rel="apple-touch-icon" href="https://cdn.infoq.com/statics_s2_20250228123450/apple-touch-icon.png"/> <script type="text/javascript"> var device='desktop'; var InfoQConstants = {}; InfoQConstants.language = 'fr'; InfoQConstants.countryCode = '/fr'; InfoQConstants.pageUrl = (typeof window.location != 'undefined' && window.location && typeof window.location.href != 'undefined' && window.location.href) ? window.location.href : "URL_UNAVAILABLE"; InfoQConstants.cet='2QAP3HqxPJi7MPlU'; InfoQConstants.userDetectedCountryCode = 'SG'; InfoQConstants.bpadb = 'oCOjWmPC4BS3qhTDkqXP'; </script> <script type="text/javascript" src="https://cdn.infoq.com/statics_s2_20250228123450/scripts/combinedJs.min.js"></script> <script type="text/javascript"> var JSi18n = JSi18n || {}; // define only if not already defined JSi18n.error='Erreur'; JSi18n.login_unverifiedAccount='Compte non vérifié'; JSi18n.contentSummary_showPresentations_1=''; JSi18n.contentSummary_showPresentations_2=''; JSi18n.contentSummary_showPresentations_3=''; JSi18n.contentSummary_showInterviews_1=''; JSi18n.contentSummary_showInterviews_2=''; JSi18n.contentSummary_showInterviews_3=''; JSi18n.contentSummary_showMinibooks_1=''; JSi18n.contentSummary_showMinibooks_2=''; JSi18n.login_sendingRequest='Envoi de la requête ...'; JSi18n.bookmark_saved='<q> Enregistré </q>'; JSi18n.bookmark_error='<q style=color:black;> Erreur </q>'; JSi18n.categoryManagement_showpopup_viewAllLink_viewAllPrefix='Voir tout'; JSi18n.categoryManagement_showpopup_viewAllLink_viewAllSuffix=''; JSi18n.categoryManagement_showpopup_includeExcludeLink_Exclude='Exclure'; JSi18n.categoryManagement_showpopup_includeExcludeLink_Include='Inclure'; JSi18n.login_invalid_email='Veuillez indiquer une adresse email valide'; JSi18n.login_email_not_found = 'Aucun utilisateur trouvé pour cette adresse email'; JSi18n.content_datetime_format='dd MMM yyyy'; // used by frontend JSi18n.FE = { labels: { follow: "Suivre", followTopic: "SUIVRE LE SUJET", unfollow: "Se désabonner", unfollowTopic: "NE PLUS SUIVRE LE SUJET", following: "Abonnements", followers: "Abonnés", like: "J'aime", liked: "a aimé", authors: "Pairs", users : "Lecteurs", topics: "Sujets", hide: "Masquer l’élément", hidden: "%s était masqué sur votre profil.", undo: "Annuler", showLess: "Voir moins", showMore: "En savoir plus", moreAuthors: "Et %s de plus", bookmarked: "Content Bookmarked", unbookmarked: "Content Unbookmarked", characterLimit: "Caractère(s) restant(s)" } } var usersInPage = JSON.parse('[{\"id\":\"42047785\",\"ref\":\"author-Julien-Delhomme\",\"url\":\"\/fr\/profile\/Julien-Delhomme\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Julien Delhomme\",\"bio\":\"Julien est un d\u00E9veloppeur, architecte pragmatique, passionn\u00E9 par les architectures Web et distribu\u00E9es. Il utilise DDD, DevOps, diff\u00E9rents paradigmes de programmation et de persistence ou encore l'analyse de l'utilisabilit\u00E9 comme vecteurs de r\u00E9ussite des projets. Si son exp\u00E9rience est fortement marqu\u00E9e par les environnements .NET au sens large, il a eu l'occasion de travailler avec Erlang, node.js et Scala. Julien est actuellement CTO chez BEYABLE.\",\"followers\":4,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/rMP6Kw37MKA1cqdbB42WAOXM7U4tLGYN.jpg\"},{\"id\":\"66520046\",\"ref\":\"author-St\u00E9phane-Wojewoda\",\"url\":\"\/fr\/profile\/St\u00E9phane-Wojewoda\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"St\u00E9phane Wojewoda\",\"bio\":\"Ma passion : rester \u00E0 la pointe des tendances tech et culture.\\r\\nMa mission : aider les individus et leurs entreprises \u00E0 grandir \u00E0 un rythme soutenable.\\r\\nMon sourire : quand les \u00E9quipes que j'accompagne comprennent pourquoi elles font ce qu'elles font, et parviennent \u00E0 bien faire les bonnes choses au bon moment avec un effort just suffisant.\\r\\nCe qui me rend encore plus heureux : voir le sourire de ma fille qui grandit. Et elle le fait plus vite que les entreprises\",\"followers\":41,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/TUUHjvThQOkY6KLs9avFZ2o8XvgB53Ab.png\"},{\"id\":\"101756701\",\"ref\":\"author-Brice-Leporini\",\"url\":\"\/fr\/profile\/Brice-Leporini\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Brice Leporini\",\"bio\":\"\",\"followers\":16,\"imgSrc\":\"\"},{\"id\":\"89014\",\"ref\":\"author-Srini-Penchikala\",\"url\":\"\/fr\/profile\/Srini-Penchikala\",\"followedByCurrentUser\":false,\"minibio\":\"Senior Software Architect\",\"name\":\"Srini Penchikala\",\"bio\":\"Srini Penchikala currently works as Senior Software Architect in Austin, Texas. He is also the Lead Editor for AI\/ML\/Data Engineering community at InfoQ (http:\/\/www.infoq.com\/author\/Srini-Penchikala). Srini has over 22 years of experience in software architecture, design and development. He is the author of "Big Data Processing with Apache Spark. He is also the co-author of "Spring Roo in Action" book (http:\/\/www.manning.com\/SpringRooinAction) from Manning Publications. Srini has presented at conferences like Big Data Conference, Enterprise Data World, JavaOne, SEI Architecture Technology Conference (SATURN), IT Architect Conference (ITARC), No Fluff Just Stuff, NoSQL Now and Project World Conference. He also published several articles on software architecture, security and risk management, and NoSQL databases on websites like InfoQ, The ServerSide, OReilly Network (ONJava), DevX Java, java.net and JavaWorld.\\r\\n\",\"followers\":335,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/bSCxRNPB08BGNJQnlSuZ4VayHvQrXUVZ.jpg\"},{\"id\":\"21186991\",\"ref\":\"author-Slim-Ouertani\",\"url\":\"\/fr\/profile\/Slim-Ouertani\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Slim Ouertani\",\"bio\":\"Slim OUERTANI est un architecte logiciel avec une exp\u00E9rience dans le monde t\u00E9l\u00E9coms, IoT et syst\u00E8mes d\u2019information. Il a particip\u00E9 \u00E0 la construction et la mise en place de plusieurs solutions notamment au sein de multinationales. Formateur certifi\u00E9 en Big Data Science, Cloud et SOA, Slim est \u00E9galement certifi\u00E9 Togaf, Archimate, PMP, IT4IT, SABSA, SOA Architect, Cloud Architect, Big Data engineer, Java, Spring, ITIL, Cmmi et MongoDB, Slim est passionn\u00E9 par Scala et JEE. Vous pouvez en savoir plus sur ses r\u00E9cents travaux <a href=\\\"http:\/\/ouertani.github.io\/\\\" rel=\\\"nofollow\\\">sur son blog<\/a> et le suivre sur Twitter : <a href=\\\"https:\/\/twitter.com\/ouertani\\\" rel=\\\"nofollow\\\">@ouertani<\/a>.\",\"followers\":19,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/CyyeDmzyWtAxeZfcEFcSBmSxJ0MIouej.jpg\"},{\"id\":\"50270429\",\"ref\":\"author-Nicolas-Frankel\",\"url\":\"\/fr\/profile\/Nicolas-Frankel\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Nicolas Frankel\",\"bio\":\"Nicolas Frankel est architecte logiciel dans le monde Java, Java EE et l\'\u00E9cosyst\u00E8me OpenSource qui l\'entoure. Il est particuli\u00E8rement int\u00E9ress\u00E9 par les probl\u00E9matiques touchant le *build*, la qualit\u00E9 et l\'interface utilisateur. Nicolas intervient en tant qu\'orateur dans des conf\u00E9rences \u00E0 travers l\'Europe et est \u00E9galement auteur des ouvrages Learning Vaadin et Learning Vaadin 7.\",\"followers\":20,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/xUqi1zrkwIXYdzv6XvAiYGdM8BBYrKtu.jpg\"},{\"id\":\"110207\",\"ref\":\"author-Charles-Humble\",\"url\":\"\/fr\/profile\/Charles-Humble\",\"followedByCurrentUser\":false,\"minibio\":\"Techie, podcaster, editor, author and consultant\",\"name\":\"Charles Humble\",\"bio\":\"Charles Humble is a former software engineer, architect and CTO who has worked as a senior leader and executive of both technology and content groups. He was InfoQ\u2019s editor-in-chief from 2014-2020, and was chief editor for Container Solutions from 2020-2023. He writes regularly for The New Stack and other publications, is a highly experienced content strategist, and has spoken at multiple international conferences including GOTO (keynote), Devoxx, WTF is SRE and QCon. His primary areas of interest are how we build software better, including sustainability and ethics, cloud computing, remote working, diversity and inclusion, and inspiring the next generation of developers. Charles is also a keyboard player, and half of the ambient techno band Twofish.\",\"followers\":2014,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/lCB_2ocIPJA40tWqjmkSLeVd5ZhJQlt_.jpg\"}]'); var topicsInPage = JSON.parse('[{\"name\":\"Kanban\",\"id\":\"11712\",\"followers\":155,\"url\":\"\/fr\/Kanban\",\"followedByCurrentUser\":false},{\"name\":\"Lean\",\"id\":\"10563\",\"followers\":149,\"url\":\"\/fr\/lean\",\"followedByCurrentUser\":false},{\"name\":\"Base de donn\u00E9es\",\"id\":\"10665\",\"followers\":7,\"url\":\"\/fr\/Database\",\"followedByCurrentUser\":false},{\"name\":\"Domain Driven Design\",\"id\":\"11081\",\"followers\":176,\"url\":\"\/fr\/domain-driven-design\",\"followedByCurrentUser\":false},{\"name\":\"DevOps\",\"id\":\"12234\",\"followers\":48,\"url\":\"\/fr\/Devops\",\"followedByCurrentUser\":false},{\"name\":\"Infrastructure\",\"id\":\"12333\",\"followers\":4,\"url\":\"\/fr\/Infrastructure\",\"followedByCurrentUser\":false},{\"name\":\"Architecture Entreprise\",\"id\":\"11150\",\"followers\":16,\"url\":\"\/fr\/enterprise-architecture\",\"followedByCurrentUser\":false},{\"name\":\"Microservices\",\"id\":\"15758\",\"followers\":200,\"url\":\"\/fr\/micro\",\"followedByCurrentUser\":false},{\"name\":\"D\u00E9veloppement\",\"id\":\"12691\",\"followers\":41,\"url\":\"\/fr\/development\",\"followedByCurrentUser\":false},{\"name\":\"Architecture & Design\",\"id\":\"12692\",\"followers\":66,\"url\":\"\/fr\/architecture-design\",\"followedByCurrentUser\":false},{\"name\":\"Architecture\",\"id\":\"11317\",\"followers\":38,\"url\":\"\/fr\/architecture\",\"followedByCurrentUser\":false},{\"name\":\"LegacyClub\",\"id\":\"17429\",\"followers\":53,\"url\":\"\/fr\/lagacyclub\",\"followedByCurrentUser\":false},{\"name\":\"Culture & M\u00E9thodes\",\"id\":\"12693\",\"followers\":90,\"url\":\"\/fr\/culture-methods\",\"followedByCurrentUser\":false},{\"name\":\"Agile\",\"id\":\"10520\",\"followers\":281,\"url\":\"\/fr\/agile\",\"followedByCurrentUser\":false},{\"name\":\"Data Science\",\"id\":\"15900\",\"followers\":28,\"url\":\"\/fr\/ai-ml-data-eng\",\"followedByCurrentUser\":false},{\"name\":\"NoSQL\",\"id\":\"12201\",\"followers\":4,\"url\":\"\/fr\/NoSQL\",\"followedByCurrentUser\":false},{\"name\":\"Spark\",\"id\":\"12310\",\"followers\":1,\"url\":\"\/fr\/Spark\",\"followedByCurrentUser\":false},{\"name\":\"Big Data\",\"id\":\"12390\",\"followers\":7,\"url\":\"\/fr\/bigdata\",\"followedByCurrentUser\":false},{\"name\":\"Data Management\",\"id\":\"13042\",\"followers\":0,\"url\":\"\/fr\/DataMgt\",\"followedByCurrentUser\":false}]'); var userContentLikesInPage = []; var userCommentsLikesInPage = []; var currentUserId = 2; </script> <script type="application/ld+json"> { "@context": "http://schema.org", "@type": "NewsArticle", "mainEntityOfPage": { "@type": "WebPage", "@id": "https://www.infoq.com/fr/articles/apache-spark-introduction/" }, "headline": "Traitements Big Data avec Apache Spark - 1ère partie : Introduction", "image": ["https://res.infoq.com/articles/apache-spark-introduction/fr/smallimage/logo2.png" ], "datePublished": "2015-03-03", "dateModified": "2015-03-03", "author": [ { "@type": "Person", "name": "Srini Penchikala" } ], "publisher": { "@type": "Organization", "name": "InfoQ", "logo": { "@type": "ImageObject", "url": "https://assets.infoq.com/resources/en/infoQ-logo-big.jpg" } }, "description": "Voyons comment le framework Apache Spark aide dans le domaine des traitements et des analyses big data et comment Spark se positionne par rapport aux implémentations MapReduce traditionnelles." } </script> <meta name="ifq:pageType" content="ARTICLE_PAGE"/> <script type="text/javascript"> InfoQConstants.pageType = 'ARTICLE_PAGE'; </script> <meta property="og:type" content="website" /> <meta property="og:image" content="https://res.infoq.com/articles/apache-spark-introduction/fr/smallimage/logo2.png"/> <meta property="twitter:image" content="https://res.infoq.com/articles/apache-spark-introduction/fr/smallimage/logo2.png"/> <meta property="og:title" content="Traitements Big Data avec Apache Spark - 1ère partie : Introduction "/> <meta property="og:description" content="Apache Spark est un framework de traitements Big Data open source construit pour effectuer des analyses sophistiquées. Dans cet article, Srini Penchikala explique comment le framework Apache Spark aide dans le domaine des traitements et des analyses big data avec son API standard et explique comment Spark se positionne par rapport aux implémentations MapReduce traditionnelles comme Apache Hadoop." /> <meta property="og:site_name" content="InfoQ"/> <meta property="og:url" content="https://www.infoq.com/fr/articles/apache-spark-introduction/"/> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:title" content="Traitements Big Data avec Apache Spark - 1ère partie : Introduction "/> <meta name="twitter:description" content="Apache Spark est un framework de traitements Big Data open source construit pour effectuer des analyses sophistiquées. Dans cet article, Srini Penchikala explique comment le framework Apache Spark aide dans le domaine des traitements et des analyses big data avec son API standard et explique comment Spark se positionne par rapport aux implémentations MapReduce traditionnelles comme Apache Hadoop." /> <link rel="image_src" href="https://res.infoq.com/articles/apache-spark-introduction/fr/smallimage/logo2.png"/> <link rel="stylesheet" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/prism.css"/> <meta name="keywords" content="apache spark introduction,Développement,Architecture & Design,DevOps,Data Science,Big Data,NoSQL,Data Management,Architecture Entreprise,Infrastructure,Spark,Base de données,Architecture,"/> <meta name="description" content="Voyons comment le framework Apache Spark aide dans le domaine des traitements et des analyses big data et comment Spark se positionne par rapport aux implémentations MapReduce traditionnelles."/> <meta name="tprox" content="1425372300000" /> <script type="text/javascript"> $(function() { var box = $('.related_sponsors'); if (box.length === 0) { return; } var nextSibling = $(box).next(); if ($('#lowerFullwidthVCR').length === 0) { moveLowerInThePage(box); return; } if (blockElement(nextSibling)) { moveLowerInThePage(box); return; } while (!blockElement($(nextSibling).next())) { nextSibling = $(nextSibling).next(); if (firstLowerThanSecond(nextSibling, box)) { return; } } moveLowerInThePage(box); function blockElement(elem) { if ($(elem).prop('tagName') === 'BLOCKQUOTE' || $(elem).prop('tagName') === 'IMG' || $(elem).prop('tagName') === 'PRE' || ($(elem).prop('tagName') === 'P' && $(elem).children().length === 1 && $(elem).children('img').length === 1)) { return true; } return false; } function firstLowerThanSecond(elem1, elem2) { var elem1BottomYCoordinate = $(elem1).offset().top + $(elem1).height() var elem2BottomYCoordinate = $(elem2).offset().top + $(elem2).height(); if (elem1BottomYCoordinate > elem2BottomYCoordinate) { return true; } return false; } function moveLowerInThePage(box) { if ($('#lowerFullwidthVCR').length !== 0) { $('#lowerFullwidthVCR').replaceWith(box); } $(box).removeClass('stacked'); } }); </script> <script type="text/javascript" src="https://cdn.infoq.com/statics_s2_20250228123450/scripts/relatedVcr.min.js"></script> <script type="application/javascript"> var communityIds = "2497,2498,1893,4523"; var topicIds = "2088,1853,3030,704,2012,1982,171,876"; VCR.loadAllVcrs(communityIds, topicIds); </script> <script type="text/javascript" src="https://cdn.infoq.com/statics_s2_20250228123450/scripts/infoq.js"></script> <script type="text/javascript"> document.addEventListener('DOMContentLoaded', function() { if (!window || !window.infoq) return infoq.init() }) </script> </head> <body > <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-W9GJ5DL" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <div class="intbt"> <a href="/int/bt/" title="bt">BT</a> </div> <script type="text/javascript"> var allCountries = [{"id":3,"name":"Afghanistan"},{"id":244,"name":"Åland"},{"id":6,"name":"Albania"},{"id":61,"name":"Algeria"},{"id":13,"name":"American Samoa"},{"id":1,"name":"Andorra"},{"id":9,"name":"Angola"},{"id":5,"name":"Anguilla"},{"id":11,"name":"Antarctica"},{"id":4,"name":"Antigua and Barbuda"},{"id":12,"name":"Argentina"},{"id":7,"name":"Armenia"},{"id":16,"name":"Aruba"},{"id":15,"name":"Australia"},{"id":14,"name":"Austria"},{"id":17,"name":"Azerbaijan"},{"id":31,"name":"Bahamas"},{"id":24,"name":"Bahrain"},{"id":20,"name":"Bangladesh"},{"id":19,"name":"Barbados"},{"id":35,"name":"Belarus"},{"id":21,"name":"Belgium"},{"id":36,"name":"Belize"},{"id":26,"name":"Benin"},{"id":27,"name":"Bermuda"},{"id":32,"name":"Bhutan"},{"id":29,"name":"Bolivia"},{"id":254,"name":"Bonaire, Sint Eustatius, and Saba"},{"id":18,"name":"Bosnia and Herzegovina"},{"id":34,"name":"Botswana"},{"id":33,"name":"Bouvet Island"},{"id":30,"name":"Brazil"},{"id":104,"name":"British Indian Ocean Territory"},{"id":28,"name":"Brunei Darussalam"},{"id":23,"name":"Bulgaria"},{"id":22,"name":"Burkina Faso"},{"id":25,"name":"Burundi"},{"id":114,"name":"Cambodia"},{"id":46,"name":"Cameroon"},{"id":37,"name":"Canada"},{"id":52,"name":"Cape Verde"},{"id":121,"name":"Cayman Islands"},{"id":40,"name":"Central African Republic"},{"id":207,"name":"Chad"},{"id":45,"name":"Chile"},{"id":47,"name":"China"},{"id":53,"name":"Christmas Island"},{"id":38,"name":"Cocos (Keeling) Islands"},{"id":48,"name":"Colombia"},{"id":116,"name":"Comoros"},{"id":39,"name":"Congo (Democratic Republic)"},{"id":41,"name":"Congo (People\u0027s Republic)"},{"id":44,"name":"Cook Islands"},{"id":49,"name":"Costa Rica"},{"id":43,"name":"Cote D\u0027Ivoire"},{"id":97,"name":"Croatia"},{"id":51,"name":"Cuba"},{"id":253,"name":"Curaçao"},{"id":54,"name":"Cyprus"},{"id":55,"name":"Czech Republic"},{"id":58,"name":"Denmark"},{"id":57,"name":"Djibouti"},{"id":59,"name":"Dominica"},{"id":60,"name":"Dominican Republic"},{"id":213,"name":"East Timor"},{"id":62,"name":"Ecuador"},{"id":64,"name":"Egypt"},{"id":203,"name":"El Salvador"},{"id":87,"name":"Equatorial Guinea"},{"id":66,"name":"Eritrea"},{"id":63,"name":"Estonia"},{"id":68,"name":"Ethiopia"},{"id":72,"name":"Falkland Islands (Malvinas)"},{"id":74,"name":"Faroe Islands"},{"id":71,"name":"Fiji"},{"id":70,"name":"Finland"},{"id":75,"name":"France"},{"id":80,"name":"French Guiana"},{"id":170,"name":"French Polynesia"},{"id":208,"name":"French Southern Territories"},{"id":76,"name":"Gabon"},{"id":84,"name":"Gambia"},{"id":79,"name":"Georgia"},{"id":56,"name":"Germany"},{"id":81,"name":"Ghana"},{"id":82,"name":"Gibraltar"},{"id":88,"name":"Greece"},{"id":83,"name":"Greenland"},{"id":78,"name":"Grenada"},{"id":86,"name":"Guadeloupe"},{"id":91,"name":"Guam"},{"id":90,"name":"Guatemala"},{"id":249,"name":"Guernsey"},{"id":85,"name":"Guinea"},{"id":92,"name":"Guinea-Bissau"},{"id":93,"name":"Guyana"},{"id":98,"name":"Haiti"},{"id":95,"name":"Heard Island and McDonald Islands"},{"id":96,"name":"Honduras"},{"id":94,"name":"Hong Kong"},{"id":99,"name":"Hungary"},{"id":107,"name":"Iceland"},{"id":103,"name":"India"},{"id":100,"name":"Indonesia"},{"id":106,"name":"Iran"},{"id":105,"name":"Iraq"},{"id":101,"name":"Ireland"},{"id":245,"name":"Isle of Man"},{"id":102,"name":"Israel"},{"id":108,"name":"Italy"},{"id":109,"name":"Jamaica"},{"id":111,"name":"Japan"},{"id":250,"name":"Jersey"},{"id":110,"name":"Jordan"},{"id":122,"name":"Kazakhstan"},{"id":112,"name":"Kenya"},{"id":115,"name":"Kiribati"},{"id":243,"name":"Kosovo"},{"id":120,"name":"Kuwait"},{"id":113,"name":"Kyrgyzstan"},{"id":123,"name":"Laos"},{"id":132,"name":"Latvia"},{"id":124,"name":"Lebanon"},{"id":129,"name":"Lesotho"},{"id":128,"name":"Liberia"},{"id":133,"name":"Libya"},{"id":126,"name":"Liechtenstein"},{"id":130,"name":"Lithuania"},{"id":131,"name":"Luxembourg"},{"id":143,"name":"Macau"},{"id":139,"name":"Macedonia"},{"id":137,"name":"Madagascar"},{"id":151,"name":"Malawi"},{"id":153,"name":"Malaysia"},{"id":150,"name":"Maldives"},{"id":140,"name":"Mali"},{"id":148,"name":"Malta"},{"id":138,"name":"Marshall Islands"},{"id":145,"name":"Martinique"},{"id":146,"name":"Mauritania"},{"id":149,"name":"Mauritius"},{"id":238,"name":"Mayotte"},{"id":152,"name":"Mexico"},{"id":73,"name":"Micronesia"},{"id":136,"name":"Moldova"},{"id":135,"name":"Monaco"},{"id":142,"name":"Mongolia"},{"id":246,"name":"Montenegro"},{"id":147,"name":"Montserrat"},{"id":134,"name":"Morocco"},{"id":154,"name":"Mozambique"},{"id":141,"name":"Myanmar"},{"id":155,"name":"Namibia"},{"id":164,"name":"Nauru"},{"id":163,"name":"Nepal"},{"id":161,"name":"Netherlands"},{"id":8,"name":"Netherlands Antilles"},{"id":156,"name":"New Caledonia"},{"id":166,"name":"New Zealand"},{"id":160,"name":"Nicaragua"},{"id":157,"name":"Niger"},{"id":159,"name":"Nigeria"},{"id":165,"name":"Niue"},{"id":158,"name":"Norfolk Island"},{"id":118,"name":"North Korea"},{"id":144,"name":"Northern Mariana Islands"},{"id":162,"name":"Norway"},{"id":167,"name":"Oman"},{"id":173,"name":"Pakistan"},{"id":180,"name":"Palau"},{"id":178,"name":"Palestinian Territory"},{"id":168,"name":"Panama"},{"id":171,"name":"Papua New Guinea"},{"id":181,"name":"Paraguay"},{"id":169,"name":"Peru"},{"id":172,"name":"Philippines"},{"id":176,"name":"Pitcairn"},{"id":174,"name":"Poland"},{"id":179,"name":"Portugal"},{"id":177,"name":"Puerto Rico"},{"id":182,"name":"Qatar"},{"id":183,"name":"Reunion"},{"id":184,"name":"Romania"},{"id":185,"name":"Russian Federation"},{"id":186,"name":"Rwanda"},{"id":193,"name":"Saint Helena"},{"id":117,"name":"Saint Kitts and Nevis"},{"id":125,"name":"Saint Lucia"},{"id":251,"name":"Saint Martin"},{"id":175,"name":"Saint Pierre and Miquelon"},{"id":229,"name":"Saint Vincent and the Grenadines"},{"id":247,"name":"Saint-Barthélemy"},{"id":236,"name":"Samoa"},{"id":198,"name":"San Marino"},{"id":202,"name":"Sao Tome and Principe"},{"id":187,"name":"Saudi Arabia"},{"id":199,"name":"Senegal"},{"id":248,"name":"Serbia"},{"id":189,"name":"Seychelles"},{"id":197,"name":"Sierra Leone"},{"id":192,"name":"Singapore"},{"id":252,"name":"Sint Maarten"},{"id":196,"name":"Slovakia"},{"id":194,"name":"Slovenia"},{"id":188,"name":"Solomon Islands"},{"id":200,"name":"Somalia"},{"id":239,"name":"South Africa"},{"id":89,"name":"South Georgia and the South Sandwich Islands"},{"id":119,"name":"South Korea"},{"id":255,"name":"South Sudan"},{"id":67,"name":"Spain"},{"id":127,"name":"Sri Lanka"},{"id":190,"name":"Sudan"},{"id":201,"name":"Suriname"},{"id":195,"name":"Svalbard and Jan Mayen"},{"id":205,"name":"Swaziland"},{"id":191,"name":"Sweden"},{"id":42,"name":"Switzerland"},{"id":204,"name":"Syria"},{"id":220,"name":"Taiwan"},{"id":211,"name":"Tajikistan"},{"id":221,"name":"Tanzania"},{"id":210,"name":"Thailand"},{"id":209,"name":"Togo"},{"id":212,"name":"Tokelau"},{"id":216,"name":"Tonga"},{"id":218,"name":"Trinidad and Tobago"},{"id":215,"name":"Tunisia"},{"id":217,"name":"Turkey"},{"id":214,"name":"Turkmenistan"},{"id":206,"name":"Turks and Caicos Islands"},{"id":219,"name":"Tuvalu"},{"id":223,"name":"Uganda"},{"id":222,"name":"Ukraine"},{"id":2,"name":"United Arab Emirates"},{"id":77,"name":"United Kingdom"},{"id":224,"name":"United States Minor Outlying Islands"},{"id":226,"name":"Uruguay"},{"id":225,"name":"USA"},{"id":227,"name":"Uzbekistan"},{"id":234,"name":"Vanuatu"},{"id":228,"name":"Vatican City (Holy See)"},{"id":230,"name":"Venezuela"},{"id":233,"name":"Vietnam"},{"id":231,"name":"Virgin Islands (British)"},{"id":232,"name":"Virgin Islands (U.S.)"},{"id":235,"name":"Wallis and Futuna"},{"id":65,"name":"Western Sahara"},{"id":237,"name":"Yemen"},{"id":241,"name":"Zaire"},{"id":240,"name":"Zambia"},{"id":242,"name":"Zimbabwe"}]; var gdprCountriesIds = [196,194,191,184,179,174,161,148,132,131,130,108,101,99,97,88,77,75,70,67,63,58,56,55,54,37,23,21,14]; </script> <div class="infoq" id="infoq"> <!-- ####### SITE START ######### --> <header class="header"> <button aria-label="Toggle Navigation" tabindex="0" class="burger header__toggle button">Toggle Navigation <span></span><span></span><span></span></button> <div class="header__container container"> <div class="container__inner"> <div data-nosnippet class="actions header__top"> <div class="actions__left"> <p class="header__desc my-0"> Diffuser les Connaissances et l'Innovation dans le Développement Logiciel d'Entreprise </p> <div class="button__dropdown dropdown header__more my-0 dropdown__center"> <button aria-label="English edition" class="button button__unstyled button__small">French edition</button> <div class="dropdown__holder"> <!----> <div class="dropdown__content"> <ul class="no-style dropdown__nav languagesEdition"> <li><a href="/">English edition</a></li> <li><a href="https://www.infoq.cn">Chinese edition</a></li> <li><a href="/jp/">Japanese edition</a></li> <li class="active"><a href="#" onclick="return false;">French edition</a></li> </ul> </div> <!----> </div> </div> <a class="my-0 contribute-link" role="button" href="/fr/write-for-infoq/" title="Contribuez"> Contribuez </a> </div> <div class="actions__right"> <div> <form id="searchForm" name="search-form" action="/fr/search.action" enctype="multipart/form-data" class="search icon__search icon icon__green"> <div class="field search__bar input__text input__no-label input__small"> <label for="search" class="label field__label">Rechercher</label> <input name="queryString" type="text" id="search" value="" placeholder="Rechercher" class="input field__input"> <input type="hidden" name="page" value="1"/> <input type="hidden" size="15" name="searchOrder"> </div> <input value="Rechercher" type="submit" class="search__go"> </form> </div> <div class="button__dropdown dropdown user__login"> <button aria-label="INSCRIPTION / CONNEXION" class="button button__small button__green button__arrow arrow__true button__icon icon icon__user icon--only">INSCRIPTION / CONNEXION</button> <div class="dropdown__holder"> <div class="dropdown__content"> <div class="login__dropdown"> <div class="login__module"> <div class="login__username"> <form id="login-form" data-vv-scope="login" class="login__form form" action="/fr/login.action"> <input type="hidden" id="loginWidgetOrigin" name="loginWidgetOrigin" value="mainLogin"/> <input type="hidden" name="fromP13N" id="isP13n" value="false"/> <input type="hidden" name="fromP13NId" id="p13n-id" value=""/> <input type="hidden" name="fromP13NType" id="p13n-type" value=""/> <div class="field form__row input__text input__small" data-vv-as="Email" data-vv-scope="login"> <label for="email" class="label field__label">Email</label> <input type="text" id="email" placeholder="" class="input field__input" name="username"> </div> <div class="field form__row input__password input__small" data-vv-as="Mot de passe" data-vv-scope="login"> <label for="password" class="label field__label">Mot de passe</label> <input type="password" id="password" placeholder="" class="input field__input" name="password"> <p data-message="resultMessage"></p> </div> <input type="submit" value="Connexion" class="form__row button button__medium button__green"> <div class="login__actions"> <button aria-label="Mot de passe oublié ?" class="forgot button button__unstyled">Mot de passe oublié ?</button> </div> </form> <form id="forgot-password-form" data-vv-scope="forgot" class="forgot__form form" action="/fr/resetpasswordinit.action" onsubmit="UserActions_Login.showMessage($(this),JSi18n.login_sendingRequest);"> <div data-vv-as="Email" data-vv-scope="forgot" class="field form__row input__text input__small"> <label for="forgotten_email" class="label field__label">Email du compte InfoQ</label> <input id="forgotten_email" name="email" placeholder="" class="input field__input" type="text" onkeyup="UserActions_ResetPass.checkInputStatus('forgotten_email','forgotPassMessage',JSi18n.login_invalid_email,'submit_resetPass');"> <p id="forgotPassMessage" data-message="resultMessage"></p> </div> <input type="submit" id="submit_resetPass" value="Envoyer email de récupération" class="button button__medium button__green" onclick="return UserActions_ResetPass.checkInputStatus('forgotten_email','forgotPassMessage',JSi18n.login_invalid_email,'submit_resetPass');"> <p class="login__actions"> <button aria-label="Retour à la connexion" class="back-to-login button button__unstyled">Retour à la connexion</button> </p> </form> <form id="email-revalidation-form" data-vv-scope="revalidation" class="revalidation__form form" action="/fr/reactivate.action" onsubmit="UserActions_Login.showMessage($(this),JSi18n.login_sendingRequest);"> <div data-vv-as="Email" data-vv-scope="revalidation" class="field form__row input__text input__small"> <label for="revalidated_email" class="label field__label">Renvoyer l'Activation</label> <input id="revalidated_email" name="email" placeholder="" class="input field__input" type="text" onkeyup="UserActions_ResetPass.checkInputStatus('revalidated_email','emailRevalidMessage',JSi18n.login_invalid_email,'submit_resetPass');"> <p id="emailRevalidMessage" data-message="resultMessage"></p> </div> <input type="submit" value="Renvoyer" class="button button__medium button__green" onclick="return UserActions_ResetPass.checkInputStatus('revalidated_email','emailRevalidMessage',JSi18n.login_invalid_email,'submit_resetPass');"> <p class="login__actions"> <button id="show-login" aria-label="Retour à la connexion" class="back-to-login button button__unstyled">Retour à la connexion</button> </p> </form> </div> <div class="login__social"> <h4 class="heading">Connexion avec:</h4> <div class="social__connect form__row login__socials"> <a href="/fr/social/googleLogin.action?fl=login" onclick="return UserActions_Login.addLoginInfo(this);" class="button button__medium button__gray button__icon icon icon__google" title="Connexion avec Google">Google</a> <a href="/fr/social/liveLogin.action?fl=login" onclick="return UserActions_Login.addLoginInfo(this);" class="button button__medium button__icon icon icon__microsoft" title="Connexion avec Microsoft">Microsoft</a> <a href="/fr/twitter-info" class="button button__medium button__icon icon icon__twitter" title="Connexion avec Twitter">Twitter</a> <a href="/fr/social/facebookLogin.action?fl=login" onclick="return UserActions_Login.addLoginInfo(this);" class="button button__medium button__icon icon icon__fb" title="Connexion avec Facebook">Facebook</a> </div> </div> <div class="login__signup"> <h4 class="heading">Vous n'avez pas encore de compte InfoQ ?</h4> <a href="/fr/reginit.action?" onclick="return UserActions_Login.addLoginInfo(this);" class="button button__medium button__green">S'inscrire</a> </div> </div> </div> </div> </div> </div> </div> </div> <div class="header__middle"> <div class="logo header__logo"> <a href="/fr/" class="logo__symbol active"> Logo - Back to homepage </a> </div> <div class="content-items"> <a href="/fr/news/" class="icon icon__news">Actualités</a> <a href="/fr/articles/" class="icon icon__articles">Articles</a> <a href="/fr/presentations/" class="icon icon__presentations">Présentations</a> <a href="/fr/podcasts/" class="icon icon__podcasts">Podcasts</a> <a href="/fr/minibooks/" class="icon icon__guides">Livres</a> </div> <div class="header__items columns"> <div> <h3 class="widget__heading">Sujets</h3> <nav class="nav header__nav topics" data-trk-ref="header_personas"> <div class="has--subnav li-nav"> <a href="/fr/development/" title="Development" class="nav__category">Development</a> <div class="nav__subnav subnav"> <ul class="subnav__categories no-style"> <li><a href="/fr/java/" title="Java">Java</a></li> <li><a href="/fr/clojure/" title="Clojure">Clojure</a></li> <li><a href="/fr/scala/" title="Scala">Scala</a></li> <li><a href="/fr/dotnet/" title=".Net">.Net</a></li> <li><a href="/fr/mobile/" title="Mobile">Mobile</a></li> <li><a href="/fr/android/" title="Android">Android</a></li> <li><a href="/fr/ios/" title="iOS">iOS</a></li> <li><a href="/fr/HTML5Topic/" title="HTML5">HTML5</a></li> <li><a href="/fr/javascript/" title="JavaScript">JavaScript</a></li> <li><a href="/fr/fp/" title="Programmation Fonctionnelle">Programmation Fonctionnelle</a></li> <li><a href="/fr/webapi/" title="Web API">Web API</a></li> </ul> <div class="subnav__content" data-id="12691"> <div class="heading__container actions"> <div class="actions__left"> <h3 class="heading section__heading">A la une dans Développement</h3> </div> </div> <ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style"> <li> <div class="card__content"> <div class="card__data"> <h4 class="card__title"> <a href="/fr/articles/encryption-defense-native-browser-apps">Comment Utiliser Le Chiffrement Pour La Défense En Profondeur Dans Les Apps Natives Et Navigateurs</a> </h4> <p class="card__excerpt">Isaac Potoczny-Jones discute des avantages et des inconvénients du chiffrement de la couche application. Il couvre la surface d'attaque du chiffrement dans la couche application d'un navigateur, comme...</p> <div class="card__footer"></div> </div> <a href="/fr/articles/encryption-defense-native-browser-apps" class="card__header"> <img loading="lazy" alt="Comment Utiliser Le Chiffrement Pour La Défense En Profondeur Dans Les Apps Natives Et Navigateurs" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/articles/encryption-defense-native-browser-apps/fr/smallimage/security-browser-1589240480229.jpg" class="card__image"/> </a> </div> </li> </ul> <a href="/fr/development/" class="button__more button button__large button__arrow arrow__right">Tout voir dans development</a> </div> </div> </div> <div class="has--subnav li-nav"> <a href="/fr/architecture-design/" title="Architecture & Design" class="nav__category">Architecture & Design</a> <div class="nav__subnav subnav"> <ul class="subnav__categories no-style"> <li><a href="/fr/architecture/" title="Architecture">Architecture</a></li> <li><a href="/fr/enterprise-architecture/" title="Architecture Entreprise">Architecture Entreprise</a></li> <li><a href="/fr/performance-scalability/" title="Scalabilité/Performance">Scalabilité/Performance</a></li> <li><a href="/fr/design/" title="Design">Design</a></li> <li><a href="/fr/Case_Study/" title="Case Studies">Case Studies</a></li> <li><a href="/fr/DesignPattern/" title="Patterns">Patterns</a></li> <li><a href="/fr/Security/" title="Sécurité">Sécurité</a></li> </ul> <div class="subnav__content" data-id="12692"> <div class="heading__container actions"> <div class="actions__left"> <h3 class="heading section__heading">A la une dans Architecture & Design</h3> </div> </div> <ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style"> <li> <div class="card__content"> <div class="card__data"> <h4 class="card__title"> <a href="/fr/articles/ballerina-data-functional-programming">Manipulation De Données Avec Programmation Fonctionnelle Et Requêtes Dans Ballerina</a> </h4> <p class="card__excerpt">Ballerina a été conçu comme un langage de programmation orienté données et prend en charge un style de codage de programmation fonctionnel. Le langage de requête de Ballerina est similaire à SQL dans ...</p> <div class="card__footer"></div> </div> <a href="/fr/articles/ballerina-data-functional-programming" class="card__header"> <img loading="lazy" alt="Manipulation De Données Avec Programmation Fonctionnelle Et Requêtes Dans Ballerina" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/articles/ballerina-data-functional-programming/fr/smallimage/logo-1660058595815.jpg" class="card__image"/> </a> </div> </li> </ul> <a href="/fr/architecture-design/" class="button__more button button__large button__arrow arrow__right">Tout voir dans architecture-design</a> </div> </div> </div> <div class="has--subnav li-nav"> <a href="/fr/ai-ml-data-eng/" title="Data Science" class="nav__category">Data Science</a> <div class="nav__subnav subnav"> <ul class="subnav__categories no-style"> <li><a href="/fr/bigdata/" title="Big Data">Big Data</a></li> <li><a href="/fr/machinelearning/" title="Machine Learning">Machine Learning</a></li> <li><a href="/fr/nosql/" title="NoSQL">NoSQL</a></li> <li><a href="/fr/database/" title="Base de données">Base de données</a></li> <li><a href="/fr/data-analytics/" title="Data Analytics">Data Analytics</a></li> </ul> <div class="subnav__content" data-id="15900"> <div class="heading__container actions"> <div class="actions__left"> <h3 class="heading section__heading">A la une dans Data Science</h3> </div> </div> <ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style"> <li> <div class="card__content"> <div class="card__data"> <h4 class="card__title"> <a href="/fr/articles/uber-eats-time-predictions">Les Prédictions De Temps Chez Uber Eats</a> </h4> <p class="card__excerpt">Les prédiction de temps sont essentielles pour les activités d’Uber Eats, elles permettent une répartition optimale des livreurs et garantissent la satisfaction des clients. Nous verrons dans cet art...</p> <div class="card__footer"></div> </div> <a href="/fr/articles/uber-eats-time-predictions" class="card__header"> <img loading="lazy" alt="Les Prédictions De Temps Chez Uber Eats" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/articles/uber-eats-time-predictions/fr/smallimage/predicting-time-to-cook-arrive-deliver-in-uber-eats-logo-small-1573830801103.jpg" class="card__image"/> </a> </div> </li> </ul> <a href="/fr/ai-ml-data-eng/" class="button__more button button__large button__arrow arrow__right">Tout voir dans ai-ml-data-eng</a> </div> </div> </div> <div class="has--subnav li-nav"> <a href="/fr/culture-methods/" title="Culture & Methods" class="nav__category">Culture & Méthodes</a> <div class="nav__subnav subnav"> <ul class="subnav__categories no-style"> <li><a href="/fr/agile/" title="Agile">Agile</a></li> <li><a href="/fr/Leadership/" title="Leadership">Leadership</a></li> <li><a href="/fr/team-collaboration/" title="Team Collaboration">Team Collaboration</a></li> <li><a href="/fr/testing/" title="Tests">Tests</a></li> <li><a href="/fr/pm/" title="Project Management">Project Management</a></li> <li><a href="/fr/ux/" title="UX">UX</a></li> <li><a href="/fr/scrum/" title="Scrum">Scrum</a></li> <li><a href="/fr/lean/" title="Lean/Kanban">Lean/Kanban</a></li> </ul> <div class="subnav__content" data-id="12693"> <div class="heading__container actions"> <div class="actions__left"> <h3 class="heading section__heading">A la une dans Culture & Méthodes</h3> </div> </div> <ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style"> <li> <div class="card__content"> <div class="card__data"> <h4 class="card__title"> <a href="/fr/articles/individual-team-processes">Les Processus De Tests Individuels Ne Peuvent Convenir A Tout Le Monde.</a> </h4> <p class="card__excerpt">De nombreuses entreprises de l'industrie du logiciel ont mis en place des procédures qui sont utilisés par tout le monde dans l'entreprise. Chaque équipe est différente alors pourquoi les procédures s...</p> <div class="card__footer"></div> </div> <a href="/fr/articles/individual-team-processes" class="card__header"> <img loading="lazy" alt="Les Processus De Tests Individuels Ne Peuvent Convenir A Tout Le Monde." src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/articles/individual-team-processes/fr/smallimage/logo-1667318501298.jpg" class="card__image"/> </a> </div> </li> </ul> <a href="/fr/culture-methods/" class="button__more button button__large button__arrow arrow__right">Tout voir dans culture-methods</a> </div> </div> </div> <div class="has--subnav li-nav"> <a href="/fr/devops/" title="DevOps" class="nav__category">DevOps</a> <div class="nav__subnav subnav"> <ul class="subnav__categories no-style"> <li><a href="/fr/infrastructure/" title="Infrastructure">Infrastructure</a></li> <li><a href="/fr/continuous_delivery/" title="Déploiement continu">Déploiement continu</a></li> <li><a href="/fr/automation/" title="Automation">Automation</a></li> <li><a href="/fr/cloud-computing/" title="Cloud">Cloud</a></li> </ul> <div class="subnav__content" data-id="12234"> <div class="heading__container actions"> <div class="actions__left"> <h3 class="heading section__heading">A la une dans DevOps</h3> </div> </div> <ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style"> <li> <div class="card__content"> <div class="card__data"> <h4 class="card__title"> <a href="/fr/articles/devops-governance-developer-velocity">Pourquoi La Gouvernance DevOps Est Cruciale Pour Permettre La Vélocité Des Développeurs</a> </h4> <p class="card__excerpt">L'environnement d'application doit être géré de manière centralisée par l'équipe DevOps. Cela leur permet de mieux suivre les modifications et les changements qui seraient ensuite rapides et transpare...</p> <div class="card__footer"></div> </div> <a href="/fr/articles/devops-governance-developer-velocity" class="card__header"> <img loading="lazy" alt="Pourquoi La Gouvernance DevOps Est Cruciale Pour Permettre La Vélocité Des Développeurs" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/articles/devops-governance-developer-velocity/fr/smallimage/logo-1658737978607.jpg" class="card__image"/> </a> </div> </li> </ul> <a href="/fr/devops/" class="button__more button button__large button__arrow arrow__right">Tout voir dans devops</a> </div> </div> </div> </nav> </div> <div> <h3 class="widget__heading">Liens utiles</h3> <ul class="no-style header__nav"> <li> <a href="/fr/about-infoq" title="A propos d'InfoQ"> A propos d'InfoQ </a> </li> <li> <a href="/fr/infoq-editors" title="Editeurs InfoQ"> Editeurs InfoQ </a> </li> <li> <a href="/fr/write-for-infoq" title="Contribuez"> Contribuez </a> </li> <li> <a href="/fr/about-c4media" title="A propos de C4 Media"> A propos de C4 Media </a> </li> <li> <a rel="noreferrer noopener" href="https://c4media.com/diversity" title="Diversity" target="_blank">Diversity</a> </li> </ul> </div> <div> <h3 class="widget__heading">Sélectionner votre région</h3> <ul class="language__switcher no-style"> <li><a href="/" title="InfoQ English">En</a></li> <li><a href="https://www.infoq.cn">中文</a></li> <li><a href="/jp/">日本</a></li> <li class="active"><a href="#" onclick="return false;">Fr</a></li> </ul> </div> </div> </div> <div data-nosnippet class="actions header__bottom header__bottom__events"> <div class="actions__left"> <div class="header__events-all"> <a href="https://qconlondon.com/?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_qlondon25" rel="nofollow" target="_blank" class="header__event-slot"> <picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvbG9uZG9uLXRvcC11cGRhdGVkMi5qcGciLCJlZGl0cyI6IHsid2VicCI6IHsgInF1YWxpdHkiOjgwfX19" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvbG9uZG9uLXRvcC11cGRhdGVkMi5qcGciLCJlZGl0cyI6IHsianBlZyI6IHsgInF1YWxpdHkiOjgwfX19" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvbG9uZG9uLXRvcC11cGRhdGVkMi5qcGciLCJlZGl0cyI6IHsianBlZyI6IHsgInF1YWxpdHkiOjgwfX19" loading="lazy" width="40px" height="40px" alt="QCon London - image"></picture> <div> <span>QCon London</span> <p>Discover emerging trends, insights, and real-world best practices in software development & tech leadership. Join now.</p> </div> </a> <a href="https://devsummit.infoq.com/conference/boston2025?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_idsboston25" rel="nofollow" target="_blank" class="header__event-slot"> <picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvSW5mb1FEZXZTdW1taXQtdG9wLmpwZyIsImVkaXRzIjogeyJ3ZWJwIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvSW5mb1FEZXZTdW1taXQtdG9wLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvSW5mb1FEZXZTdW1taXQtdG9wLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" loading="lazy" width="40px" height="40px" alt="InfoQ Dev Summit Boston - image"></picture> <div> <span>InfoQ Dev Summit Boston</span> <p>Learn how senior software developers are solving the challenges you face. Register now with early bird tickets.</p> </div> </a> <a href="https://devsummit.infoq.com/conference/munich2025?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_idsmunich25" rel="nofollow" target="_blank" class="header__event-slot"> <picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvSURTLU11bmljaC10b3AuanBnIiwiZWRpdHMiOiB7IndlYnAiOiB7ICJxdWFsaXR5Ijo4MH19fQ==" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvSURTLU11bmljaC10b3AuanBnIiwiZWRpdHMiOiB7ImpwZWciOiB7ICJxdWFsaXR5Ijo4MH19fQ==" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvSURTLU11bmljaC10b3AuanBnIiwiZWRpdHMiOiB7ImpwZWciOiB7ICJxdWFsaXR5Ijo4MH19fQ==" loading="lazy" width="40px" height="40px" alt="InfoQ Dev Summit Munich - image"></picture> <div> <span>InfoQ Dev Summit Munich</span> <p>Learn practical solutions to today's most pressing software challenges. Register now with early bird tickets.</p> </div> </a> <a href="https://qconsf.com/?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_qsf25" rel="nofollow" target="_blank" class="header__event-slot"> <picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvU0YtdG9wLmpwZyIsImVkaXRzIjogeyJ3ZWJwIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvU0YtdG9wLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvU0YtdG9wLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" loading="lazy" width="40px" height="40px" alt="QCon San Francisco - image"></picture> <div> <span>QCon San Francisco</span> <p>Explore insights, real-world best practices and solutions in software development & leadership. Register now.</p> </div> </a> </div> </div> <!----> </div> </div> </div> </header> <!-- ####### CONTENT START ######### --> <main> <article data-type="article" class="article"> <section class="section container white"> <div class="container__inner"> <p class="crumbs"> <span data-nosnippet><a href="/fr" title="Accueil InfoQ">Accueil InfoQ</a></span> <span data-nosnippet><a href="/fr/articles" title="Articles">Articles</a></span> <span data-nosnippet class="active">Traitements Big Data avec Apache Spark - 1ère partie : Introduction</span> </p> <div class="actions"> <div class="actions__left"> </div> <div class="actions__right"> </div> </div> <div class="actions heading__container article__heading"> <div class="actions__left"> <h1 class="heading"> Traitements Big Data avec Apache Spark - 1ère partie : Introduction </h1> </div> </div> <script type="text/javascript"> $("#translated_"+InfoQConstants.userDetectedCountryCode.toLowerCase()).show(); </script> <div class="columns article__explore"> <div class="article__main" data-col="4/6"> <div class="article__metadata metadata"> <p class="article__readTime date">03 mars 2015<span class="dot"></span> 19 min(s) de lecture </p> <div class="widget article__authors"> <div> <p class="meta">par</p> <ul class="no-style authors"> <li data-id="author-Srini-Penchikala"> <p class="meta author__bio"> <a href="/fr/profile/Srini-Penchikala/" class="avatar author__avatar" aria-label="Srini Penchikala"></a> <span class="author__name"> <a href="/fr/profile/Srini-Penchikala/" class="author__link">Srini Penchikala</a> </span> </p> </li> </ul> </div> <div> <p class="meta">traduit par</p> <ul class="no-style authors"> <li data-id="author-Julien-Delhomme"> <p class="meta author__bio"> <a href="/fr/profile/Julien-Delhomme/" class="avatar author__avatar" aria-label="Julien Delhomme"></a> <span class="author__name"> <a href="/fr/profile/Julien-Delhomme/" class="author__link">Julien Delhomme</a> </span> </p> </li> </ul> </div> </div> </div> <div class="article__content"> <div class="actions__left actions__sidebar article__actions"> <button id="toggleLikeContent" class="icon button button__icon like button__gray icon__like" aria-label="J'aime">J'aime</button> <div class="bookmarkReading"> <button id="bookmarkBtn" data-ref="bookmarkPage" aria-label="Lire plus tard" class="login button__gray button button__icon icon icon__bookmark icon--only"> </button> <!-- new dropdown rading list --> <div class="my-0 button__dropdown dropdown reading_list dropdown__center" id="showBookmarks"> <button aria-label="Favoris" class="button button__unstyled button__small"></button> <div class="dropdown__holder"> <div class="dropdown__content"> <ul class="no-style dropdown__nav"> <li class="active"><a href="/fr/showbookmarks.action">Favoris</a></li> </ul> </div> </div> </div> <div id="toastContainer" class="toast-none toast-hide"> <div class="toast"><span></span></div> </div> </div> <script type="text/javascript"> if(loggedIn){ $('#showBookmarks').css('display', 'flex'); } function performBookmark() { Bookmarks.toggleBookmark('articles', 'apache-spark-introduction'); } infoq.event.on('bookmarkRequested', function(e) { Bookmarks.toggleBookmark('articles', 'apache-spark-introduction'); }); infoq.event.on("loaded", function(){ if(loggedIn){ var href = window.location.href; if(href.indexOf("#bookmarkPage") != -1){ $('#bookmarkBtn').click(); } } }); $(document).ready(function() { if(Bookmarks.isContentBookmarked == 'true'){ $('#bookmarkBtn').addClass('button__green'); $('#bookmarkBtn').removeClass('button__gray'); }else{ $('#bookmarkBtn').removeClass('button__green'); $('#bookmarkBtn').addClass('button__gray'); } }); </script> </div> <div class="article__data"> <h2>Qu’est-ce que Spark ?</h2> <p><a href="https://spark.apache.org/">Apache Spark</a> est un framework de traitements Big Data open source construit pour effectuer des analyses sophistiquées et conçu pour la rapidité et la facilité d’utilisation. Celui-ci a originellement été développé par AMPLab, de l’Université UC Berkeley, en 2009 et passé open source sous forme de projet Apache en 2010.</p> <p>Spark présente plusieurs avantages par rapport aux autres technologies big data et MapReduce comme Hadoop et Storm. D’abord, Spark propose un framework complet et unifié pour répondre aux besoins de traitements Big Data pour divers jeux de données, divers par leur nature (texte, graphe, etc.) aussi bien que par le type de source (batch ou flux temps-réel). Ensuite, Spark permet à des applications sur clusters Hadoop d’être exécutées jusqu’à 100 fois plus vite en mémoire, 10 fois plus vite sur disque. Il vous permet d’écrire rapidement des applications en Java, Scala ou Python et inclut un jeu de plus de 80 opérateurs haut-niveau. De plus, il est possible de l’utiliser de façon interactive pour requêter les données depuis un shell.</p> <p>Enfin, en plus des opérations de Map et Reduce, Spark supporte les requêtes SQL et le streaming de données et propose des fonctionnalités de machine learning et de traitements orientés graphe. Les développeurs peuvent utiliser ces possibilités en stand-alone ou en les combinant en une chaîne de traitement complexe.</p> <div class="clear"></div> <script type="text/javascript"> var uriMapping = "articles"; var showVcr = "true"; var fillWithVcr = "false"; var sponsorshipsJson = "{"links":null}"; var sponsoredLinks = $.parseJSON($("<div/>").html(sponsorshipsJson).text()).links; var numberOfSponsoredVcrIds = sponsoredLinks != null ? sponsoredLinks.length : 0; var maxItems = 5 - numberOfSponsoredVcrIds; var intervalVcrSponsorship = setInterval(function() { if (window.vcrsLoaded) { clearInterval(intervalVcrSponsorship); if(showVcr || fillWithVcr) { if(fillWithVcr) { for(var index in window.vcrList) { if(VCR.isVcrSponsored(sponsoredLinks, window.vcrList[index])) { VCR.addToExcludedList(window.vcrList[index]); } } } var vcrs = VCR.getByTopicsAndCommunities(window.vcrList, topicIds, communityIds, maxItems, false, null); if (vcrs != null && vcrs.length > 0 || (sponsoredLinks != null && sponsoredLinks.length > 0)) { VCR.addToExcludedList(vcrs); var $widget = jQuery('.related__vc'); getCommonElements(vcrs, uriMapping, "EMBEDDED"); $widget.css("display", "flex"); } else { var $widget = jQuery('.related__vc'); $widget.remove(); } } window.contentVcrFinished = true; // search for infoq.event.on("contentVcrFinished",... to see how/where it is used infoq.event.trigger("contentVcrFinished"); } }, 200); </script> <input type="hidden" name="" value="" id="cont_item_primary_topic"/> <div class="related__group related__vc nocontent f_rvcbox" data-trk-view="true" data-trk-impr="true" data-place="EMBEDDED" style="display: none" > <ul class="no-style rvc__list"> <h4 class="heading">Contenu sponsorisé lié</h4> <div class="f_rvcList"></div> </ul> </div> <p>Ce premier article de la série propose un aperçu de ce qu’est Spark, de la suite d’outils mis à disposition pour les traitements Big Data et explique comment Spark se positionne par rapport aux solutions classiques de MapReduce.</p> <h2>Hadoop et Spark</h2> <p>Hadoop est positionné en tant que technologie de traitement de données depuis 10 ans et a prouvé être la solution de choix pour le traitement de gros volumes de données. MapReduce est une très bonne solution pour les traitements à passe unique mais n’est pas la plus efficace pour les cas d’utilisation nécessitant des traitements et algorithmes à plusieurs passes. Chaque étape d’un workflow de traitement étant constituée d’une phase de Map et d’une phase de Reduce, il est nécessaire d’exprimer tous les cas d’utilisation sous forme de patterns MapReduce pour tirer profit de cette solution. Les données en sortie de l’exécution de chaque étape doivent être stockées sur système de fichier distribué avant que l’étape suivante commence. Cette approche a tendance à être peu rapide à cause de la réplication et du stockage sur disque.</p> <p>De plus, les solutions Hadoop s’appuient généralement sur des clusters, qui sont difficiles à mettre en place et à administrer. Elles nécessitent aussi l’intégration de plusieurs outils pour les différents cas d’utilisation big data (comme Mahout pour le Machine Learning et Storm pour le traitement par flux).</p> <div id="lowerFullwidthVCR"></div> <p>Si vous souhaitez mettre en place quelque chose de plus complexe, vous devrez enchaîner une série de jobs MapReduce et les exécuter séquentiellement, chacun de ces jobs présentant une latence élevée et aucun ne pouvant commencer avant que le précédent n’ait tout-à-fait terminé.</p> <p>Spark permet de développer des pipelines de traitement de données complexes, à plusieurs étapes, en s’appuyant sur des graphes orientés acycliques (<a href="http://en.wikipedia.org/wiki/Directed_acyclic_graph">DAG</a>). Spark permet de partager les données en mémoire entre les graphes, de façon à ce que plusieurs jobs puissent travailler sur le même jeu de données. Spark s’exécute sur des infrastructures Hadoop Distributed File System (<a href="http://wiki.apache.org/hadoop/HDFS">HDFS</a>) et propose des fonctionnalités supplémentaires. Il est possible <a href="http://databricks.com/blog/2014/01/21/Spark-and-Hadoop.html">de déployer des applications Spark</a> sur un cluster Hadoop v1 existant (avec SIMR – Spark-Inside-MapReduce), sur un cluster Hadoop v2 YARN ou même sur <a href="http://mesos.apache.org/">Apache Mesos</a>. Plutôt que de voir en Spark un remplaçant d’Hadoop, il est plus correct de le voir comme une alternative au MapReduce d’Hadoop. Spark n’a pas été prévu pour remplacer Hadoop mais pour mettre à disposition une solution complète et unifiée permettant de prendre en charge différents cas d’utilisation et besoins dans le cadre des traitements big data.</p> <h2>Les fonctionnalités de Spark</h2> <p>Spark apporte des améliorations à MapReduce grâce à des étapes de shuffle moins coûteuses. Avec le stockage en mémoire et un traitement proche du temps-réel, la performance peut être plusieurs fois plus rapide que d’autres technologies big data. Spark supporte également les évaluations paresseuses ("lazy evaluation") des requêtes, ce qui aide à l’optimisation des étapes de traitement. Il propose une API de haut-niveau pour une meilleure productivité et un modèle d’architecture cohérent pour les solutions big data.</p> <p>Spark maintient les résultats intermédiaires en mémoire plutôt que sur disque, ce qui est très utile en particulier lorsqu’il est nécessaire de travailler à plusieurs reprises sur le même jeu de données. Le moteur d’exécution est conçu pour travailler aussi bien en mémoire que sur disque. Les opérateurs réalisent des opérations externes lorsque la donnée ne tient pas en mémoire, ce qui permet de traiter des jeux de données plus volumineux que la mémoire agrégée d’un cluster. Spark essaye de stocker le plus possible en mémoire avant de basculer sur disque. Il est capable de travailler avec une partie des données en mémoire, une autre sur disque.</p> <p>Il est nécessaire d’examiner ses données et ses cas d’utilisation pour évaluer ses besoins en mémoire car, en fonction du travail fait en mémoire, Spark peut présenter d’importants avantages de performance. Les autres fonctionnalités proposées par Spark comprennent :</p> <ul> <li>Des fonctions autres que Map et Reduce</li> <li>L’optimisation de graphes d’opérateurs arbitraires</li> <li>L’évaluation paresseuse des requêtes, ce qui aide à optimiser le workflow global de traitement</li> <li>Des APIs concises et cohérentes en Scala, Java et Python</li> <li>Un shell interactif pour Scala et Python (non disponible encore en Java)</li> </ul> <p>Spark est écrit en <a href="http://www.scala-lang.org/">Scala</a> et s’exécute sur la machine virtuelle Java (JVM). Les langages supportés actuellement pour le développement d’applications sont :</p> <ul> <li>Scala</li> <li>Java</li> <li>Python</li> <li>Clojure</li> <li>R</li> </ul> <h2>L’écosystème de Spark</h2> <p>À côté des API principales de Spark, l’écosystème contient des librairies additionnelles qui permettent de travailler dans le domaine des analyses big data et du machine learning. Parmi ces librairies, on trouve :</p> <ul> <li><strong>Spark Streaming :</strong> <a href="https://spark.apache.org/streaming/">Spark Streaming</a> peut être utilisé pour traitement temps-réel des données en flux. Il s’appuie sur un mode de traitement en "micro batch" et utilise pour les données temps-réel DStream, c’est-à-dire une série de RDD (Resilient Distributed Dataset).</li> <li><strong>Spark SQL :</strong> <a href="https://spark.apache.org/sql/">Spark SQL</a> permet d’exposer les jeux de données Spark via API JDBC et d’exécuter des requêtes de type SQL en utilisant les outils BI et de visualisation traditionnels. Spark SQL permet d’extraire, transformer et charger des données sous différents formats (JSON, Parquet, base de données) et les exposer pour des requêtes ad-hoc.</li> <li><strong>Spark MLlib :</strong> <a href="https://spark.apache.org/mllib/">MLlib</a> est une librarie de machine learning qui contient tous les algorithmes et utilitaires d’apprentissage classiques, comme la classification, la régression, le clustering, le filtrage collaboratif, la réduction de dimensions, en plus des primitives d’optimisation sous-jacentes.</li> <li><strong>Spark GraphX :</strong> <a href="https://spark.apache.org/graphx/">GraphX</a> est la nouvelle API (en version alpha) pour les traitements de graphes et de parallélisation de graphes. GraphX étend les RDD de Spark en introduisant le Resilient Distributed Dataset Graph, un multi-graphe orienté avec des propriétés attachées aux nœuds et aux arrêtes. Pour le support de ces traitements, GraphX expose un jeu d’opérateurs de base (par exemple subgraph, joinVertices, aggregateMessages), ainsi qu’une variante optimisée de l’API Pregel. De plus, GraphX inclut une collection toujours plus importante d’algorithmes et de builders pour simplifier les tâches d’analyse de graphes.</li> </ul> <p>En plus de ces librairies, on peut citer BlinkDB et Tachyon : <a href="http://blinkdb.org/">BlinkDB</a> est un moteur de requêtes approximatif qui peut être utilisé pour exécuter des requêtes SQL interactives sur des volumes de données importants. Il permet à l’utilisateur de troquer la précision contre le temps de réponse. Il fonctionne en exécutant les requêtes sur des extraits des données et présente ses résultats accompagnés d’annotations avec les indicateurs d’erreurs significatifs. <a href="http://tachyon-project.org/index.html">Tachyon</a> est un système de fichiers distribué qui permet de partager des fichiers de façon fiable à la vitesse des accès en mémoire à travers des frameworks de clusters comme Spark et MapReduce. Il évite les accès disques et le chargement des fichiers fréquemment utilisés en les cachant en mémoire. Ceci permet aux divers frameworks, tâches et requêtes d’accéder aux fichiers en cache rapidement.</p> <p>Il existe aussi des adaptateurs pour intégration à d’autres produits comme Cassandra (<a href="http://www.datastax.com/dev/blog/accessing-cassandra-from-spark-in-java">Spark Cassandra Connector</a>) et R (SparkR). Avec le connecteur Cassandra, vous pouvez utiliser Spark pour accéder à des données stockées dans Cassandra et réaliser des analyses sur ces données.</p> <p>Le diagramme suivant (Figure 1) montre les relations entre ces différentes librairies de l’écosystème.</p> <p><img _href="img://71.png" _p="true" alt="" style="width: 600px; height: 273px;" data-src="articles/apache-spark-introduction/fr/resources/71.png" src="https://imgopt.infoq.com/fit-in/3000x4000/filters:quality(85)/filters:no_upscale()/articles/apache-spark-introduction/fr/resources/71.png" rel="share"></p> <p><strong>Figure 1. Spark Framework Libraries</strong></p> <p>Nous explorerons ces librairies dans les futurs articles de cette série.</p> <h2>L’architecture de Spark</h2> <p>L’architecture de Spark comprend les trois composants principaux suivants :</p> <ul> <li>Le stockage des données</li> <li>L’API</li> <li>Le Framework de gestion des ressources</li> </ul> <p>Regardons chacun de ces composants plus en détails.</p> <h3>Le stockage des données :</h3> <p>Spark utilise le système de fichiers HDFS pour le stockage des données. Il peut fonctionner avec n’importe quelle source de données compatible avec Hadoop, dont HDFS, HBase, Cassandra, etc.</p> <h3>L’API :</h3> <p>L’API permet aux développeurs de créer des applications Spark en utilisant une API standard. L’API existe en Scala, Java et Python. Les liens ci-dessous pointent vers les sites présentant les API Spark pour chacun de ces langages :</p> <ul> <li><a href="http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.package">Scala API</a></li> <li><a href="http://spark.apache.org/docs/latest/api/java/index.html">Java</a></li> <li><a href="http://spark.apache.org/docs/latest/api/python/index.html">Python</a></li> </ul> <h3>Gestion des ressources</h3> <p>Spark peut être déployé comme un serveur autonome ou sur un framework de traitements distribués comme Mesos ou YARN. La figure 2 illustre les composants du modèle d’architecture de Spark.</p> <p><img _href="img://2.png" _p="true" alt="" style="width: 600px; height: 311px;" data-src="articles/apache-spark-introduction/fr/resources/2.png" src="https://imgopt.infoq.com/fit-in/3000x4000/filters:quality(85)/filters:no_upscale()/articles/apache-spark-introduction/fr/resources/2.png" rel="share"></p> <p><strong>Figure 2. Spark Architecture</strong></p> <h3>Les "Resilient Distributed Datasets"</h3> <p>Les <a href="https://spark.apache.org/docs/latest/programming-guide.html#resilient-distributed-datasets-rdds">Resilient Distributed Datasets</a> (basés sur la <a href="https://www.cs.berkeley.edu/%7Ematei/papers/2012/nsdi_spark.pdf">publication de recherche</a> de Matei), ou RDD, sont un concept au cœur du framework Spark. Vous pouvez voir un RDD comme une table dans une base de données. Celui-ci peut porter tout type de données et est stocké par Spark sur différentes partitions. Les RDD permettent de réarranger les calculs et d’optimiser le traitement. Ils sont aussi tolérants aux pannes car un RDD sait comment recréer et recalculer son ensemble de données. Les RDD sont immutables. Pour obtenir une modification d’un RDD, il faut y appliquer une transformation, qui retournera un nouveau RDD, l’original restera inchangé. Les RDD supportent deux types d’opérations :</p> <ul> <li>Les transformations</li> <li>Les actions</li> </ul> <p><strong>Les transformations :</strong> les <a href="https://spark.apache.org/docs/latest/programming-guide.html#transformations">transformations</a> ne retournent pas de valeur seule, elles retournent un nouveau RDD. Rien n’est évalué lorsque l’on fait appel à une fonction de transformation, cette fonction prend juste un RDD et retourne un nouveau RDD. Les fonctions de transformation sont par exemple <code>map, filter, flatMap, groupByKey, reduceByKey, aggregateByKey, pipe et coalesce</code>.</p> <p><strong>Les actions :</strong> les <a href="https://spark.apache.org/docs/latest/programming-guide.html#actions">actions</a> évaluent et retournent une nouvelle valeur. Au moment où une fonction d’action est appelée sur un objet RDD, toutes les requêtes de traitement des données sont calculées et le résultat est retourné. Les actions sont par exemple <code>reduce, collect, count, first, take, countByKey et foreach</code>.</p> <h3>Comment installer Spark</h3> <p>Il y a plusieurs façons d’installer et d’utiliser Spark. Vous pouvez l’installer sur votre machine, comme framework autonome ou utiliser une des images de machine virtuelle (Spark Virtual Machine) disponibles chez des éditeurs comme <a href="http://www.cloudera.com/content/cloudera/en/downloads/quickstart_vms/cdh-5-1-x.html">Cloudera</a>, HortonWorks ou MapR. Vous pouvez aussi utiliser Spark déjà installé et configuré, sur le Cloud (comme <a href="http://databricks.com/product/databricks-cloud">Databricks Cloud</a>).</p> <p>Dans cet article, Spark sera installé en framework autonome et lancé localement. La version 1.2.0, sortie récemment, sera utilisée pour la démonstration de code.</p> <h3>Comment exécuter Spark ?</h3> <p>Lorsque Spark est installé sur une machine locale ou sur le Cloud, différents modes de connexion au moteur Spark sont possibles. La table ci-dessous présente le paramètre Master URL utilisable pour les différents modes d’exécution.</p> <p><img _href="img://23.png" _p="true" alt="" style="width: 600px; height: 354px;" data-src="articles/apache-spark-introduction/fr/resources/23.png" src="https://imgopt.infoq.com/fit-in/3000x4000/filters:quality(85)/filters:no_upscale()/articles/apache-spark-introduction/fr/resources/23.png" rel="share"></p> <h3>Comment interagir avec Spark ?</h3> <p>Une fois que Spark est installé et est en cours d’exécution, vous pouvez vous y connecter en utilisant le Shell Spark pour effectuer des analyses de données interactives. Le Shell Spark est disponible pour les langages Scala et Python. Java ne supporte pas encore de Shell interactif, donc cette fonctionnalité n’est pas encore disponible pour Java. Vous pouvez utiliser les commandes <code>spark-shell.cmd</code> et <code>pyspark.cmd</code> pour lancer respectivement le Shell avec Scala et Python.</p> <h3>La console Web</h3> <p>Quand Spark est en cours d’exécution, quel que soit le mode d’exécution, vous pouvez consulter les résultats des jobs et d’autres statistiques en accédant à la console Web, via l’URL suivante : <code>http://localhost:4040</code> La figure 3 montre la console Spark, avec ses onglets pour les étapes, le stockage, l’environnement et les exécuteurs.</p> <p>(Cliquez sur l'image pour l'agrandir)</p> <p><a data-href="articles/apache-spark-introduction/en/resources/4.png" href="https://imgopt.infoq.com/fit-in/3000x4000/filters:quality(85)/filters:no_upscale()/articles/apache-spark-introduction/en/resources/4.png"/><img _href="img://4-b.png" _p="true" alt="" style="width: 600px; height: 219px;" data-src="articles/apache-spark-introduction/fr/resources/4-b.png" src="https://imgopt.infoq.com/fit-in/3000x4000/filters:quality(85)/filters:no_upscale()/articles/apache-spark-introduction/fr/resources/4-b.png" rel="share"></a></p> <p><strong>Figure 3. Spark Web Console</strong></p> <h3>Les variables partagées</h3> <p>Spark fournit deux types de variables partagées pour permettre d’exécuter de façon efficace les programmes Spark sur un cluster : Broadcast et Accumulators.</p> <p><strong>Les variables Broadcast :</strong> Ces variables permettent de maintenir des variables en cache, en lecture seule, sur chaque machine, plutôt que d’avoir à les envoyer avec les tâches. Elles peuvent être utilisées pour mettre à la disposition des nœuds du cluster des copies de jeux de données volumineux de façon plus efficace. L’extrait de code suivant montre comment utiliser les variables Broadcast.</p> <pre> <font color="000000">//</font> <font color="000000">// Broadcast Variables</font> <font color="000000">//</font> <font color="000000">val</font> <font color="000000">broadcastVar</font> <font color="000000">=</font> sc.broadcast(<font color="000000">Array</font>(<font color="000000">1</font>, <font color="000000">2</font>, <font color="000000">3</font>)) broadcastVar.value</pre> <p><strong>Les accumulateurs :</strong> les accumulateurs peuvent être ajoutés lors de l’utilisation d’opérations associatives ; leur support est donc efficace dans le cadre de traitements parallèles. Ils peuvent être utilisés pour implémenter des compteurs (comme avec MapReduce) ou des sommes. Les tâches exécutées sur le cluster peuvent ajouter un accumulateur avec la méthode add. Cependant, ils ne peuvent pas lire sa valeur. Seul le programme pilote peut lire la valeur d’un accumulateur. L’extrait de code suivant montre comment utiliser un accumulateur :</p> <pre> <font color="000000">//</font> <font color="000000">// Accumulators</font> <font color="000000">//</font> <font color="000000">val</font> <font color="000000">accum</font> <font color="000000">=</font> sc.accumulator(<font color="000000">0</font>, <font color="000000"><font color="000000">"</font>My Accumulator<font color="000000">"</font></font>) sc.parallelize(<font color="000000">Array</font>(<font color="000000">1</font>, <font color="000000">2</font>, <font color="000000">3</font>, <font color="000000">4</font>)).foreach(x <font color="000000">=></font> accum <font color="000000">+</font><font color="000000">=</font> x) accum.value</pre> <h3>Exemple d’application Spark</h3> <p>L’exemple couvert dans cet article est une application simple décompte de mots. C’est l’exemple classique que l’on présenterait lorsque l’on enseigne les traitements big data avec Hadoop. Nous allons effectuer des requêtes d’analyse sur un fichier texte. Le fichier texte et le jeu de données de cet exemple sont de petite taille mais les requêtes Spark sont valables pour des jeux de données beaucoup plus volumineux, sans modification de code. Pour faire simple, nous utiliserons le Shell Scala. Commençons par voir comment installer Spark sur une machine locale.</p> <p><strong>Pré-requis :</strong></p> <ul> <li>Vous aurez besoin du Java Development Kit (JDK) pour que Spark fonctionne en local. C’est la première étape décrite plus bas.</li> <li>Vous aurez besoin d’installer les applicatifs Spark sur votre machine. Les instructions sont données dans la deuxième étape ci-dessous.</li> </ul> <p><strong>Note :</strong> Ces instructions sont valables en environnement Windows. Si vous utilisez un système d’exploitation différent, vous devrez adapter les variables système et les chemins vers les répertoires en fonction de votre environnement.</p> <p><strong>Installation du JDK :</strong> Téléchargez le JDK depuis le site d’Oracle, la <a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html">version 1.7</a> est recommandée. Choisissez pour l’installation du JDK un répertoire sans espaces. Pour les utilisateurs de Windows, choisissez par exemple <code>c:\dev</code>, pas <code>c:\Program Files</code>. Vérifiez l’installation depuis le répertoire bin sous le répertoire JDK 1.7 en tapant la commande <code>java -version</code>. Si l’installation est correcte, cette commande doit afficher la version de Java installée.</p> <p><strong>Installation des applicatifs Spark :</strong> Téléchargez la dernière version depuis le <a href="https://spark.apache.org/downloads.html">site de Spark</a>. La version la plus récente au moment de l’écriture de cet article est la 1.2. Vous pouvez aussi choisir une version spécifique en fonction d’une version Hadoop. J’ai moi-même téléchargé Spark pour Hadoop 2.4 et le nom du fichier est <code>spark-1.2.0-bin-hadoop2.4.tgz</code>. Décompressez le fichier dans un répertoire local, comme c:\dev.</p> <p>Pour vérifier l’installation de Spark, positionnez-vous sur le répertoire de Spark et lancez le Shell avec les commandes suivantes :</p> <pre> <code>c: cd c:\dev\spark-1.2.0-bin-hadoop2.4 bin\spark-shell </code></pre> <p>Si l’installation s’est bien passée, vous verrez les messages ci-dessous dans la console :</p> <pre> <code>…. 15/01/17 23:17:46 INFO HttpServer: Starting HTTP Server 15/01/17 23:17:46 INFO Utils: Successfully started service 'HTTP class server' on port 58132. Welcome to ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/ __/ '_/ /___/ .__/\_,_/_/ /_/\_\ version 1.2.0 /_/ Using Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_71) Type in expressions to have them evaluated. Type :help for more information. …. 15/01/17 23:17:53 INFO BlockManagerMaster: Registered BlockManager 15/01/17 23:17:53 INFO SparkILoop: Created spark context.. Spark context available as sc. </code></pre> <p>Vous pouvez taper la commande suivante pour vérifier le bon fonctionnement du Shell :</p> <pre> <code>sc.version </code></pre> <p>(ou)</p> <pre> <code>sc.appName </code></pre> <p>Cette étape finie, vous pouvez sortir du shell :</p> <pre> <code>:quit </code></pre> <p>Pour lancer le Shell python, vous devez installer Python sur votre machine. Prenez par exemple <a href="http://continuum.io/downloads">Anaconda</a>, qui est une distribution gratuite qui inclut plusieurs packages Python pour la science, les maths, l’ingénierie et l’analyse de données. Vous pouvez ensuite exécuter les commandes suivantes :</p> <pre> <code>c: cd c:\dev\spark-1.2.0-bin-hadoop2.4 bin\pyspark </code></pre> <h2>Décompte de mots</h2> <p>Une fois Spark installé et en cours d’exécution, vous pouvez exécuter des requêtes d’analyse avec l’API. Des commandes simples pour lire des données depuis un fichier texte et les traiter sont disponibles. Nous examinerons des cas d’utilisation plus avancés dans les futurs articles de la série. Commençons par utiliser l’API pour exécuter l’exemple connu du décompte de mots. Ouvrez un Shell Scala, voici les commandes à utiliser :</p> <pre> <font color="000000">import</font> <font color="000000">org.apache.spark.</font><font color="000000">SparkContext</font> <font color="000000">import</font> <font color="000000">org.apache.spark.SparkContext.</font><font color="000000">_</font> <font color="000000">val</font> <font color="000000">txtFile</font> <font color="000000">=</font> <font color="000000"><font color="000000">"</font>README.md<font color="000000">"</font></font> <font color="000000">val</font> <font color="000000">txtData</font> <font color="000000">=</font> sc.textFile(txtFile) txtData.cache()</pre> <p>La fonction cache est appelée pour stocker les RDD créés en cache, de façon à ce que Spark n’ait pas à les recalculer à chaque fois, à chaque requête suivante. Notez que cache() est une opération lazy, Spark ne stocke pas la donnée immédiatement en mémoire, en fait, ceci sera fait lorsque l’action sera invoquée sur un RDD. Maintenant, nous pouvons appeler la fonction count pour voir combien de lignes sont présentes dans le fichier texte. txtData.count()</p> <p>Les commandes suivantes réalisent le décompte des mots et affichent le compte à côté de chaque mot présent dans le fichier.</p> <pre> <font color="000000">val</font> <font color="000000">wcData</font> <font color="000000">=</font> txtData.flatMap(l <font color="000000">=></font> l.split(<font color="000000"><font color="000000">"</font> <font color="000000">"</font></font>)).map(word <font color="000000">=></font> (word, <font color="000000">1</font>)).reduceByKey(_ <font color="000000">+</font> _) wcData.collect().foreach(println)</pre> <p>D’autres exemples d’utilisation de l’API peuvent être consultés sur le site de Spark, dans <a href="http://spark.apache.org/docs/latest/programming-guide.html">la documentation</a>.</p> <h2>Pour suivre</h2> <p>Dans les futurs articles de la série, nous en apprendrons plus sur d’autres parties de l’écosystème de Spark, en commençant par Spark SQL. Nous regarderons Spark Streaming, Spark MLlib et Spark GraphX, ainsi que les frameworks à venir comme Tachyon et BlinkDB.</p> <h2>Conclusion</h2> <p>Dans cet article, nous avons vu comment le framework Apache Spark, avec son API standard, nous aide en matière de traitement et d’analyse de données. Nous avons aussi vu comment Spark se positionne par rapport aux implémentations MapReduce traditionnelles comme Apache Hadoop. Spark s’appuie sur le même système de stockage de fichiers qu’Hadoop, il est donc possible d’utiliser Spark et Hadoop ensemble dans le cas où des investissements significatifs ont déjà été faits avec Hadoop.</p> <p>Vous pouvez aussi combiner les types de traitements Spark avec Spark SQL, Spark Machine Learning et Spark Streaming comme nous le verrons dans les prochains articles. Grâce à différents modes d’intégration et adaptateurs Spark, vous pouvez combiner Spark avec d’autres technologies. Vous pouvez par exemple utiliser ensemble Spark, Kafka et Apache Cassandra ; Kafka pour le streaming de données entrantes, Spark pour le traitement et la base NoSQL Cassandra pour le stockage des résultats.</p> <p>Gardez cependant à l’esprit que Spark n’est pas un écosystème encore complètement mature et que celui-ci nécessite des améliorations dans certains domaines comme la sécurité ou l’intégration avec des outils de BI.</p> <h2>Références</h2> <ul> <li><a href="http://spark.apache.org/">Site principal de Spark</a></li> <li><a href="http://spark.apache.org/examples.html">Exemples</a></li> <li><a href="http://spark-summit.org/2014/">Vidéos et présentations</a> de la conférence Spark Summit 2014</li> <li><a href="http://databricks.com/spark">Site de Spark on Databricks</a></li> </ul> <h3>Au sujet de l’Auteur</h3> <p><strong><img _href="img://srinipenchikala.jpg" _p="true" alt="" style="float: left; width: 85px; height: 100px;" data-src="articles/apache-spark-introduction/fr/resources/srinipenchikala.jpg" src="https://imgopt.infoq.com/fit-in/3000x4000/filters:quality(85)/filters:no_upscale()/articles/apache-spark-introduction/fr/resources/srinipenchikala.jpg" rel="share">Srini Penchikala</strong> travaille actuellement en tant qu’architecte applicatif au sein d’une société de services financiers à Austin au Texas. Il a plus de 20 ans d’expérience en architecture, conception et développement. Srini écrit actuellement un livre sur les patterns dans le contexte des bases NoSQL. Il est aussi le co-auteur de <a href="http://www.manning.com/SpringRooinAction">"Spring Roo in Action"</a>, aux éditions Manning. Il a été présentateur lors de plusieurs conférences, comme JavaOne, SEI Architecture Technology Conference (SATURN), IT Architect Conference (ITARC), No Fluff Just Stuff, NoSQL Now et Project World Conference. Srini a publié également de nombreux articles sur l’architecture, la sécurité et la gestion des risques et les bases NoSQL sur divers sites, tels qu’InfoQ, The ServerSide, OReilly Network (ONJava), DevX Java, java.net et JavaWorld. Il est <a href="http://www.infoq.com/author/Srini-Penchikala">Lead Editor de la communauté bases de données NoSQL</a> chez InfoQ.</p> </div> <div id="zoom-container"></div> <input type="hidden" name="" value="Merci d'avoir donné votre avis!" id="cr_messages_submitSuccess"/> <input type="hidden" name="" value="Evaluation nécessaire" id="cr_messages_ratingRequired"/> <input type="hidden" name="" value="Traitements Big Data avec Apache Spark - 1ère partie : Introduction" id="cr_item_title"/> <input type="hidden" name="" value="Srini Penchikala" id="cr_item_author"/> <input type="hidden" name="" value="http://www.infoq.com/fr/articles/apache-spark-introduction/" id="cr_item_url"/> <input type="hidden" name="" value="articles" id="cr_item_ctype"/> <input type="hidden" name="" value="fr" id="cr_item_lang"/> <input type="hidden" name="" value="1425372300000" id="cr_item_published_time"/> <input type="hidden" name="" value="" id="cr_item_primary_topic"/> <script type="text/javascript"> ContentRating.readMessages(); ContentRating.readContentItem(); </script> <form class="box__border box form rate contentRatingWidget"> <h3 class="heading">Evaluer cet article</h3> <div class="criterias"> <div class="crit" id="relevance_fieldset"> <div class="crit__name">Pertinence</div> <span class="stars"> <input type="radio" id="relevance-star5" name="rating-relevance" value="5" /><label class="star" for="relevance-star5" title="Innovator"></label> <input type="radio" id="relevance-star4" name="rating-relevance" value="4" /><label class="star" for="relevance-star4" title="Early adopter"></label> <input type="radio" id="relevance-star3" name="rating-relevance" value="3" /><label class="star" for="relevance-star3" title="Early majority"></label> <input type="radio" id="relevance-star2" name="rating-relevance" value="2" /><label class="star" for="relevance-star2" title="Late majority"></label> <input type="radio" id="relevance-star1" name="rating-relevance" value="1" /><label class="star" for="relevance-star1" title="Laggards"></label> </span> <span class="stars__total"></span> </div> <div class="crit" id="style_fieldset"> <div class="crit__name">Style</div> <span class="stars"> <input type="radio" id="style-star5" name="rating-style" value="5" /><label class="star" for="style-star5" title="Excellent"></label> <input type="radio" id="style-star4" name="rating-style" value="4" /><label class="star" for="style-star4" title="Bon"></label> <input type="radio" id="style-star3" name="rating-style" value="3" /><label class="star" for="style-star3" title="Moyen"></label> <input type="radio" id="style-star2" name="rating-style" value="2" /><label class="star" for="style-star2" title="Acceptable"></label> <input type="radio" id="style-star1" name="rating-style" value="1" /><label class="star" for="style-star1" title="Médiocre"></label> </span> <span class="stars__total"></span> </div> </div> </form> <div class="reviews tabs contentRatingWidget"> <div id="editorReview" class="tab" data-title="Critique de l'éditeur"> <form class="box__border form contentRatingWidget" onsubmit="return false;"> <span class="field input__textarea" aria-required="false"> <textarea id="editor_input" placeholder="Cliquer ici pour laisser un avis..." name="textarea" value="" class="field__input"></textarea> <p class="input__message field__desc serverCallFeedback"></p> </span> <input class="button button__large submit_rating" type="submit" value="Soumettre"/> </form> </div> <div id="chiefEditorReview" class="tab" data-title="Action du rédacteur en chef"> <form class="box__border form contentRatingWidget" onsubmit="return false;"> <span class="field input__textarea"> <textarea id="chiefEditor_input" placeholder="Action du rédacteur en chef..." value="" class="field__input"></textarea> <p class="input__message field__desc serverCallFeedback"></p> </span> <div class="actions"> <div class="actions__left"> <input class="button button__large submit_rating" type="submit" value="Soumettre"/> </div> <div class="actions__right"> <span class="field input__checkbox input--small"> <input type="checkbox" id="auth-checkbox" /> <label class="label" for="auth-checkbox"><span></span> Author Contacted</label> </span> </div> </div> </form> </div> </div> <script type="text/javascript"> if (!InfoQConstants.editorUser || InfoQConstants.editorUser == 'false') { $('.contentRatingWidget').remove(); } else { if (InfoQConstants.chiefEditor !== 'undefined' && InfoQConstants.chiefEditor == 'false') { $('#chiefEditorReview').remove(); } } </script> <div class="widget article__fromTopic topics"> <div class="widget__head related__for-topic" data-id="11150" data-trk-ref="content_primary_topic"> <h4 class="heading related__heading"> Ce contenu est dans le sujet <a href='/fr/enterprise-architecture/'>Architecture Entreprise</a> </h4> </div> <h5 class="heading related__inline">Sujets liés</h5> <ul class="no-style topics related__topics topics__small" data-trk-ref="content_related_topic"> <li data-id="12691"> <a href="/fr/development/" class="button related__topic button__small button__black">Développement</a> </li> <li data-id="12692"> <a href="/fr/architecture-design/" class="button related__topic button__small button__black">Architecture & Design</a> </li> <li data-id="12234"> <a href="/fr/Devops/" class="button related__topic button__small button__black">DevOps</a> </li> <li data-id="15900"> <a href="/fr/ai-ml-data-eng/" class="button related__topic button__small button__black">Data Science</a> </li> <li data-id="12390"> <a href="/fr/bigdata/" class="button related__topic button__small button__black">Big Data</a> </li> <li data-id="12201"> <a href="/fr/NoSQL/" class="button related__topic button__small button__black">NoSQL</a> </li> <li data-id="13042"> <a href="/fr/DataMgt/" class="button related__topic button__small button__black">Data Management</a> </li> <li data-id="11150"> <a href="/fr/enterprise-architecture/" class="button related__topic button__small button__black">Architecture Entreprise</a> </li> <li data-id="12333"> <a href="/fr/Infrastructure/" class="button related__topic button__small button__black">Infrastructure</a> </li> <li data-id="12310"> <a href="/fr/Spark/" class="button related__topic button__small button__black">Spark</a> </li> <li data-id="10665"> <a href="/fr/Database/" class="button related__topic button__small button__black">Base de données</a> </li> <li data-id="11317"> <a href="/fr/architecture/" class="button related__topic button__small button__black">Architecture</a> </li> </ul> </div> </div> <script type="text/javascript"> $(document).ready(function() { $.ajax({ url: "/api/recommendationlinks.action", contentType: "application/x-www-form-urlencoded; charset=utf-8", type: 'POST', data: { "primaryTopicAlias": "", "topicIds": "3030,704,1853,2088,2012,3521,1982,4365", "title": "Traitements Big Data avec Apache Spark - 1ère partie : Introduction", "contentPath": "/articles/apache-spark-introduction", "language": "fr" }, success: displayRelatedEditorial, async: false }); }); function displayRelatedEditorial(data) { $('.related__editorial h4').text("Contenu éditorial lié"); if (data && data.length > 0) { if(data[0].fromEs) { //change title and tracking params var box_title=""; //replace html entity since it conflicts with style box_title=box_title.replace("&","&"); $('.related__editorial h4').text("Popular in " + box_title); } for (var i = 0; i < data.length; i++) { if (i === 5) { break; } if (data[i].url.indexOf("/articles/apache-spark-introduction") !== -1) { console.log("Removing the current item from list..."); continue; } var theLinkURL = data[i].url; if(!theLinkURL.endsWith("/")) { theLinkURL = theLinkURL + "/"; } var link = $('<li><h5 class="rvc__title"><a title="" href="' + theLinkURL + '/">' + data[i].title + '</a></h5></li>'); $('.related__editorial ul').append(link); } $('.related__editorial').show(); displayWidget = true; }else{ $('.related__editorial').parent("li").remove(); } if(displayWidget==true){ $('.related__group').attr("data-cols", $('.related__group').find(">li").length); $('.related__group').css("display", "flex"); } } </script> <ul class="no-style related__group nocontent cards"> <li> <div class="related__editorial"> <h4 class="heading">Contenu éditorial lié</h4> <ul></ul> </div> </li> </ul> </div> <div class="article__more f_article_rightbar" data-col="2/6"> <div id="mostPopularSection" class="widget popular"> <div class="heading__container actions"> <div class="actions__left"> <h2 class="heading icon icon__popular">Tendance</h2> </div> </div> <div class="tabs" id="trending"> <div class="tab" data-title="10 jours" > <ol data-size="xs" data-cols="1" class="cards popular__cards"> <li class="news"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: tendays pageviews: 1 publication date: Dec 14, 2022--> <a href="/fr/news/2022/12/swift-ownership-macros-cpp-api/"> Swift Va Ajouter La Prise En Charge De La Propriété, Des Macros Et De L'Interopérabilité C++ </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="news"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: tendays pageviews: 5 publication date: Dec 07, 2022--> <a href="/fr/news/2022/12/financial-debt-impossible/"> La Dette Technique Est Quantifiable En Tant Que Dette Financière : Impossible Pour Les Développeurs </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="news"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: tendays pageviews: 2 publication date: Nov 20, 2022--> <a href="/fr/news/2022/11/android-modularization-guide/"> Google Publie Un Guide Sur La Modularisation Des Applications Android </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="news"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: tendays pageviews: 2 publication date: Nov 19, 2022--> <a href="/fr/news/2022/11/performance-testing-trends/"> Les Tests De Performance Doivent S'Appuyer Sur Les Tendances </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="articles"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: tendays pageviews: 1 publication date: Nov 17, 2022--> <a href="/fr/articles/individual-team-processes/"> Les Processus De Tests Individuels Ne Peuvent Convenir A Tout Le Monde. </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="news"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: tendays pageviews: 2 publication date: Nov 08, 2022--> <a href="/fr/news/2022/11/technical-debt-code-quality/"> Utiliser La Métaphore De La Dette Technique Pour Communiquer La Qualité Du Code </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="articles"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: tendays pageviews: 2 publication date: Oct 17, 2022--> <a href="/fr/articles/james-ward-java-jvm-languages/"> Le Java Champion James Ward Parle De L'état Des Langages Java Et JVM </a> </h5> <div class="card__footer"></div> </div> </div> </li> </ol> </div> <div class="tab" data-title="40 jours" > <ol data-size="xs" data-cols="1" class="cards popular__cards"> <li class="news"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: fortydays pageviews: 4 publication date: Dec 14, 2022--> <a href="/fr/news/2022/12/swift-ownership-macros-cpp-api/"> Swift Va Ajouter La Prise En Charge De La Propriété, Des Macros Et De L'Interopérabilité C++ </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="news"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: fortydays pageviews: 3 publication date: Dec 08, 2022--> <a href="/fr/news/2022/12/aws-codecatalyst-cloud-workspace/"> Pourquoi CodeCatalyst D'Amazon Facilite La Collaboration Des Développeurs ? </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="news"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: fortydays pageviews: 26 publication date: Dec 07, 2022--> <a href="/fr/news/2022/12/financial-debt-impossible/"> La Dette Technique Est Quantifiable En Tant Que Dette Financière : Impossible Pour Les Développeurs </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="news"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: fortydays pageviews: 6 publication date: Nov 20, 2022--> <a href="/fr/news/2022/11/android-modularization-guide/"> Google Publie Un Guide Sur La Modularisation Des Applications Android </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="articles"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: fortydays pageviews: 8 publication date: Nov 17, 2022--> <a href="/fr/articles/individual-team-processes/"> Les Processus De Tests Individuels Ne Peuvent Convenir A Tout Le Monde. </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="news"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: fortydays pageviews: 7 publication date: Nov 19, 2022--> <a href="/fr/news/2022/11/performance-testing-trends/"> Les Tests De Performance Doivent S'Appuyer Sur Les Tendances </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="articles"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: fortydays pageviews: 1 publication date: Nov 04, 2022--> <a href="/fr/articles/testability-psychological-safety/"> Comment Nous Avons Construit La Testabilité ? </a> </h5> <div class="card__footer"></div> </div> </div> </li> </ol> </div> <div class="tab" data-title="6 mois" > <ol data-size="xs" data-cols="1" class="cards popular__cards"> <li class="news"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: sixmonths pageviews: 41 publication date: Dec 14, 2022--> <a href="/fr/news/2022/12/swift-ownership-macros-cpp-api/"> Swift Va Ajouter La Prise En Charge De La Propriété, Des Macros Et De L'Interopérabilité C++ </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="news"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: sixmonths pageviews: 115 publication date: Dec 07, 2022--> <a href="/fr/news/2022/12/financial-debt-impossible/"> La Dette Technique Est Quantifiable En Tant Que Dette Financière : Impossible Pour Les Développeurs </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="news"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: sixmonths pageviews: 26 publication date: Dec 08, 2022--> <a href="/fr/news/2022/12/aws-codecatalyst-cloud-workspace/"> Pourquoi CodeCatalyst D'Amazon Facilite La Collaboration Des Développeurs ? </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="news"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: sixmonths pageviews: 26 publication date: Nov 20, 2022--> <a href="/fr/news/2022/11/android-modularization-guide/"> Google Publie Un Guide Sur La Modularisation Des Applications Android </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="articles"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: sixmonths pageviews: 34 publication date: Nov 17, 2022--> <a href="/fr/articles/individual-team-processes/"> Les Processus De Tests Individuels Ne Peuvent Convenir A Tout Le Monde. </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="news"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: sixmonths pageviews: 38 publication date: Nov 19, 2022--> <a href="/fr/news/2022/11/performance-testing-trends/"> Les Tests De Performance Doivent S'Appuyer Sur Les Tendances </a> </h5> <div class="card__footer"></div> </div> </div> </li> <li class="news"> <div class="card__content"> <span class="card__icon">Icon</span> <div class="card__data"> <h5 class="card__title"> <!-- section: sixmonths pageviews: 10 publication date: Nov 07, 2022--> <a href="/fr/news/2022/11/azul-vulnerability-detection/"> Azul Lance Azul Vulnerability Detection Pour Sécuriser La Chaîne D'Approvisionnement </a> </h5> <div class="card__footer"></div> </div> </div> </li> </ol> </div> </div> </div> <script type="text/javascript"> createOptionalVcrs({ uriMapping : "articles", languageUri : "", excludedVcrIds : "", nativeVcrAdsEnabled : "true", vcrsPosition : "0" }); function createOptionalVcrs(params) { if(params.nativeVcrAdsEnabled) { VCR.addIdstoExcludeList(params.excludedVcrIds); if(params <= 1) { window.finishedVcrOptional1 = false; }else if(params.vcrsPosition == 2) { window.finishedVcrOptional2 = false; } var intervalOptional = setInterval(function() { if(window.vcrsLoaded) { if((InfoQConstants.pageType == "HOMEPAGE" && (params.vcrsPosition <=1 || window.finishedRelatedVcr)) || (InfoQConstants.pageType != "HOMEPAGE" && (window.contentVcrFinished == true && (params.vcrsPosition == 2 || params.vcrsPosition <= 1)))) { clearInterval(intervalOptional); if(InfoQConstants.countryCode == "" || InfoQConstants.countryCode == "/br" || InfoQConstants.countryCode == "/fr") { var vcrs = VCR.getByTopicsAndCommunities(window.vcrList, topicIds, communityIds, 2, true, null); if(vcrs != null && vcrs.length == 2) { getOptionalElements(vcrs, params); } toggleAds(vcrs, params); } else { if(params.vcrsPosition <= 1) { window.finishedVcrOptional1 = true; } else { window.finishedVcrOptional2 = true; } } } } }, 200); } } </script> <div id="vcrOptional1" class="widget prsp box__border f_oCOjWmPC4BS3qhTDkqXP box nocontent " data-place="1" data-trk-view="true" data-trk-impr="true"> <h3 class="widget__heading">Related Sponsored Content</h3> <ul class="prsp__items no-style vcrs_optional_0"></ul> </div> <div class="article__widget"> <h3 class="widget__heading">Contenu Éducatif</h3> <div class="tabs" id="educational"> <div class="tab" id="ALL_EXCEPT_NEWS" data-title="Tout"> <form id="tabstateform" action=""> <div id="tabstateformelements"> <input id="startIndex" type="hidden" name="startIndex" value="0"/> <input id="selectedTab" type="hidden" name="selectedTab" value="ALL_EXCEPT_NEWS"/> <input id="rightBarLanguage" type="hidden" name="language" value="fr" /> </div> </form> <ul class="no-style cards" data-horizontal="true" data-size="medium" data-tax="" data-hoverables="true"> <li data-id="individual-team-processes "> <div class="card__content"> <div class="card__data"> <h4 class="card__title"> <a href="/fr/articles/individual-team-processes/">Les Processus De Tests Individuels Ne Peuvent Convenir A Tout Le Monde.</a> </h4> <div class="card__footer"> <div class="card__details"> <div class="card__authors authors"> <span> <a href="/fr/profile/Bailey-Hanna/" data-id="author-Bailey-Hanna">Bailey Hanna</a> </span> </div> <span class="card__date date">le <span>17 nov. 2022</span></span> </div> </div> </div> <a href="/fr/articles/individual-team-processes/" class="card__header"> <img loading="lazy" alt="" src="https://res.infoq.com/articles/individual-team-processes/fr/smallimage/logo-1667318501298.jpg" class="card__image"> </a> </div> </li> <li data-id="testability-psychological-safety "> <div class="card__content"> <div class="card__data"> <h4 class="card__title"> <a href="/fr/articles/testability-psychological-safety/">Comment Nous Avons Construit La Testabilité ?</a> </h4> <div class="card__footer"> <div class="card__details"> <div class="card__authors authors"> <span> <a href="/fr/profile/Jitesh-Gosai/" data-id="author-Jitesh-Gosai">Jitesh Gosai</a> </span> </div> <span class="card__date date">le <span>04 nov. 2022</span></span> </div> </div> </div> <a href="/fr/articles/testability-psychological-safety/" class="card__header"> <img loading="lazy" alt="" src="https://res.infoq.com/articles/testability-psychological-safety/fr/smallimage/logo-1666020381323.jpg" class="card__image"> </a> </div> </li> <script type="text/javascript"> createOptionalVcrs({ uriMapping : "articles", languageUri : "", excludedVcrIds : "", nativeVcrAdsEnabled : "true", vcrsPosition : "2" }); function createOptionalVcrs(params) { if(params.nativeVcrAdsEnabled) { VCR.addIdstoExcludeList(params.excludedVcrIds); if(params <= 1) { window.finishedVcrOptional1 = false; }else if(params.vcrsPosition == 2) { window.finishedVcrOptional2 = false; } var intervalOptional = setInterval(function() { if(window.vcrsLoaded) { if((InfoQConstants.pageType == "HOMEPAGE" && (params.vcrsPosition <=1 || window.finishedRelatedVcr)) || (InfoQConstants.pageType != "HOMEPAGE" && (window.contentVcrFinished == true && (params.vcrsPosition == 2 || params.vcrsPosition <= 1)))) { clearInterval(intervalOptional); if(InfoQConstants.countryCode == "" || InfoQConstants.countryCode == "/br" || InfoQConstants.countryCode == "/fr") { var vcrs = VCR.getByTopicsAndCommunities(window.vcrList, topicIds, communityIds, 2, true, null); if(vcrs != null && vcrs.length == 2) { getOptionalElements(vcrs, params); } toggleAds(vcrs, params); } else { if(params.vcrsPosition <= 1) { window.finishedVcrOptional1 = true; } else { window.finishedVcrOptional2 = true; } } } } }, 200); } } </script> <div id="vcrOptional2" class="widget prsp box__border f_oCOjWmPC4BS3qhTDkqXP box nocontent " data-place="2" data-trk-view="true" data-trk-impr="true"> <h3 class="widget__heading">Related Sponsored Content</h3> <ul class="prsp__items no-style vcrs_optional_2"></ul> </div> <li data-id="james-ward-java-jvm-languages "> <div class="card__content"> <div class="card__data"> <h4 class="card__title"> <a href="/fr/articles/james-ward-java-jvm-languages/">Le Java Champion James Ward Parle De L'état Des Langages Java Et JVM</a> </h4> <div class="card__footer"> <div class="card__details"> <div class="card__authors authors"> <span> <a href="/fr/profile/Karsten-Silz/" data-id="author-Karsten-Silz">Karsten Silz</a> </span> <span> <a href="/fr/profile/James-Ward/" data-id="author-James-Ward">James Ward</a> </span> </div> <span class="card__date date">le <span>17 oct. 2022</span></span> </div> </div> </div> <a href="/fr/articles/james-ward-java-jvm-languages/" class="card__header"> <img loading="lazy" alt="" src="https://res.infoq.com/articles/james-ward-java-jvm-languages/fr/smallimage/james-ward-on-the-state-of-java-and-JVM-languages-small-1661766435546.jpg" class="card__image"> </a> </div> </li> <li data-id="java-collections-streams "> <div class="card__content"> <div class="card__data"> <h4 class="card__title"> <a href="/fr/articles/java-collections-streams/">Comment Accélérer Le Traitement Des Grandes Collections En Java</a> </h4> <div class="card__footer"> <div class="card__details"> <div class="card__authors authors"> <span> <a href="/fr/profile/Nahla-Davies/" data-id="author-Nahla-Davies">Nahla Davies</a> </span> </div> <span class="card__date date">le <span>10 oct. 2022</span></span> </div> </div> </div> <a href="/fr/articles/java-collections-streams/" class="card__header"> <img loading="lazy" alt="" src="https://res.infoq.com/articles/java-collections-streams/fr/smallimage/how-to-speed-up-large-collections-processing-in-java-small-1661255513148.jpg" class="card__image"> </a> </div> </li> <li data-id="ballerina-data-functional-programming "> <div class="card__content"> <div class="card__data"> <h4 class="card__title"> <a href="/fr/articles/ballerina-data-functional-programming/">Manipulation De Données Avec Programmation Fonctionnelle Et Requêtes Dans Ballerina</a> </h4> <div class="card__footer"> <div class="card__details"> <div class="card__authors authors"> <span> <a href="/fr/profile/Yehonathan-Sharvit/" data-id="author-Yehonathan-Sharvit">Yehonathan Sharvit</a> </span> </div> <span class="card__date date">le <span>03 oct. 2022</span></span> </div> </div> </div> <a href="/fr/articles/ballerina-data-functional-programming/" class="card__header"> <img loading="lazy" alt="" src="https://res.infoq.com/articles/ballerina-data-functional-programming/fr/smallimage/logo-1660058595815.jpg" class="card__image"> </a> </div> </li> <li data-id="ballerina-data-oriented-language "> <div class="card__content"> <div class="card__data"> <h4 class="card__title"> <a href="/fr/articles/ballerina-data-oriented-language/">Ballerina : Un Langage De Programmation Orienté Données</a> </h4> <div class="card__footer"> <div class="card__details"> <div class="card__authors authors"> <span> <a href="/fr/profile/Yehonathan-Sharvit/" data-id="author-Yehonathan-Sharvit">Yehonathan Sharvit</a> </span> </div> <span class="card__date date">le <span>26 sept. 2022</span></span> </div> </div> </div> <a href="/fr/articles/ballerina-data-oriented-language/" class="card__header"> <img loading="lazy" alt="" src="https://res.infoq.com/articles/ballerina-data-oriented-language/fr/smallimage/pasted+image+0-21-1651860771114.jpg" class="card__image"> </a> </div> </li> </ul> <div class="actions"> <a href="#" class="button button__arrow arrow__right button__unstyled button__small" onclick="ContentSummary.updateEducationalContent('6');return false;">Suivant</a> </div> </div> <div class="tab" id="ARTICLE" data-title="Articles"></div> <div class="tab" id="PRESENTATION" data-title="Présentations"></div> <div class="tab" id="INTERVIEW" data-title="Interviews"></div> <div class="tab" id="MINIBOOK" data-title="Livres"></div> <div class="tab" id="PODCAST" data-title="Podcasts"></div> <div class="tab" id="ALL_REVIEWED" data-title="Révisé"></div> </div> </div> <div class="newsletter widget" data-bg="infoq"> <h3 class="heading"><strong>InfoQ</strong> Newsletter hebdomadaire</h3> <p class="intro"> Un résumé du contenu de la semaine dernière sur InfoQ envoyé tous les jeudis. Rejoignez une communauté de plus de 250 000 développeurs seniors. <a target="_blank" href="https://assets.infoq.com/newsletter/regular/fr/newsletter_sample/newsletter_sample.html">Voir un exemple</a> </p> <div class="newsletter__subscribe"> <form class="form gdpr" id="floatingNewsletterForm" action="#" onsubmit="floatingNewsletterForm.saveSubscription(); return false;"> <div class="field input__text input__no-label input__medium newsletter__mail email"> <label class="field__label label" for="email-newsletter-infoq-guide">Votre adresse email ici</label> <input class="field__input input" id="email-newsletter-infoq-guide" placeholder="Votre adresse email ici" type="email"> <input type="text" name="emailH" id="input_floating_email_h" aria-required="false" style="display:none !important" tabindex="-1" autocomplete="off"> <input type="hidden" id="floating_fnt" name="fnt" value="2QAP3HqxPJi7MPlU"/> <input type="hidden" id="floatingNewsletterType" name="footerNewsletterType" value="regular"/> <input type="hidden" id="cmpi_f" name="cmpi" value="2"/> </div> <div class="hidden"> <span class="input__select field country"> <label for="input-floating-newsletter-country" class="label field__label">Sélectionnez votre pays</label> <select id="input-floating-newsletter-country" class="select field__input"> <option value="" class="select__option">Sélectionner</option> </select> <p class="input__message field__desc"></p> </span> <span class="input__checkbox field hidden"> <input type="checkbox" id="gdpr-consent-simple-floating-nl"> <label for="gdpr-consent-simple-floating-nl" class="label"><span>Je consens à ce que InfoQ.com traite mes données comme expliqué dans ces <a href="https://www.infoq.com/fr/privacy-notice" target=“_blank”>conditions de confidentialité</a>.</span></label> </span> </div> <input class="button button__medium button__yellow" type="submit" role="button" value="S'inscrire" onclick="return floatingNewsletterForm.validateEmail('Adresse email invalide');"> </form> <p class="meta"> <a href="/fr/privacy-notice/" target="_blank">Nous protégeons votre vie privée.</a> </p> <span class="success" style="display:none;" id="floatingNewsletterEmailMessage"></span> </div> </div> <script type="text/javascript"> var floatingNewsletterForm = new Newsletter('Votre adresse email ici', 'email-newsletter-infoq-guide', 'floatingNewsletterType','floatingNewsletterEmailMessage', 'floating_fnt', 'input_floating_email_h', 'input-floating-newsletter-country','cmpi_f','floating_box'); </script> </div> </div> </div> </section> </article> <script type="text/javascript"> // global vars that can be used for this page, us ethis section to add more. var contentTitle = "Traitements Big Data avec Apache Spark - 1ère partie : Introduction", contentPath = "/articles/apache-spark-introduction", contentUUID = "5290daa6-b595-434d-a5f0-be1155b7ea4b", authorUserCSVIds = "89014"; </script> <script src="https://cdn.infoq.com/statics_s2_20250228123450/scripts/prism-build.js"></script> <script src="https://cdn.infoq.com/statics_s2_20250228123450/scripts/lib/MathJax/MathJax.js?config=TeX-AMS_HTML"></script> </main> <footer class="footer "> <section data-nosnippet class="section container prsps__section white center"> <div class="container__inner"> <p>Rien ne serait possible sans le soutien et la confiance de nos Sponsors:</p> <div class="prsps__list"> <a href="https://www.oxiane.com/" target="_blank"> <img loading="lazy" src="/styles/static/images/oxiane_logo_bleu_150x40.png" alt="Jenji"/> </a> </div> </div> </section> <section data-nosnippet class="section container"> <div class="container__inner"> <ul data-cols="5" class="no-style columns boxes topic__boxes"> <li class="development"> <div class="box__header"> <a class="t_all_footer_more-boxes-header" href="/fr/development/">Développement</a> </div> <div class="box__content"> <ul class="no-style box__list small"> <li> <h5><a class="t_all_footer_more-boxes-item" href="/fr/news/2022/07/Asahi-linux-m2-support/" title="La Nouvelle Version D'Asahi Linux Prend En Charge Les Processeurs Apple M1 Ultra Et M2">La Nouvelle Version D'Asahi Linux Prend En Charge Les Processeurs Apple M1 Ultra Et M2</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/fr/news/2022/06/PostgreSQL-14-Breaking-Change/" title="PostgreSQL 14 Casse Les Pilotes .NET Et Java Pour PostgreSQL">PostgreSQL 14 Casse Les Pilotes .NET Et Java Pour PostgreSQL</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/fr/news/2022/03/docker-desktop-macos-virtiofs/" title="Docker Desktop 4.6 Pour Mac Am&eacute;liore Les Performances De Partage">Docker Desktop 4.6 Pour Mac Améliore Les Performances De Partage</a></h5> </li> </ul> </div> </li> <li class="architecture-design"> <div class="box__header"> <a class="t_all_footer_more-boxes-header" href="/fr/architecture-design/">Architecture & Design</a> </div> <div class="box__content"> <ul class="no-style box__list small"> <li> <h5><a class="t_all_footer_more-boxes-item" href="/fr/news/2022/10/design-patterns-serverless/" title="Comment Eviter Le Verrouillage Des Fournisseurs Sans Serveurs Avec Design Patterns ?">Comment Eviter Le Verrouillage Des Fournisseurs Sans Serveurs Avec Design Patterns ?</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/fr/articles/ballerina-data-functional-programming/" title="Manipulation De Donn&eacute;es Avec Programmation Fonctionnelle Et Requ&ecirc;tes Dans Ballerina">Manipulation De Données Avec Programmation Fonctionnelle Et Requêtes Dans Ballerina</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/fr/articles/ballerina-data-oriented-language/" title="Ballerina : Un Langage De Programmation Orient&eacute; Donn&eacute;es">Ballerina : Un Langage De Programmation Orienté Données</a></h5> </li> </ul> </div> </li> <li class="culture-methods"> <div class="box__header"> <a class="t_all_footer_more-boxes-header" href="/fr/culture-methods/">Culture & Méthodes</a> </div> <div class="box__content"> <ul class="no-style box__list small"> <li> <h5><a class="t_all_footer_more-boxes-item" href="/fr/news/2022/12/financial-debt-impossible/" title="La Dette Technique Est Quantifiable En Tant Que Dette Financi&egrave;re : Impossible Pour Les D&eacute;veloppeurs">La Dette Technique Est Quantifiable En Tant Que Dette Financière : Impossible Pour Les Développeurs</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/fr/news/2022/11/performance-testing-trends/" title="Les Tests De Performance Doivent S'Appuyer Sur Les Tendances">Les Tests De Performance Doivent S'Appuyer Sur Les Tendances</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/fr/articles/individual-team-processes/" title="Les Processus De Tests Individuels Ne Peuvent Convenir A Tout Le Monde.">Les Processus De Tests Individuels Ne Peuvent Convenir A Tout Le Monde.</a></h5> </li> </ul> </div> </li> <li class="ai-ml-data-eng"> <div class="box__header"> <a class="t_all_footer_more-boxes-header" href="/fr/ai-ml-data-eng/">Data Science</a> </div> <div class="box__content"> <ul class="no-style box__list small"> <li> <h5><a class="t_all_footer_more-boxes-item" href="/fr/news/2022/10/grab-data-platform/" title="Grab A Partag&eacute; Son Experience Sur La Conception De Plate-formes De Donn&eacute;es Distribu&eacute;es">Grab A Partagé Son Experience Sur La Conception De Plate-formes De Données Distribuées</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/fr/news/2021/01/microsoft-vision-language-vinvl/" title="Microsoft Research D&eacute;veloppe un Nouveau Syst&egrave;me de Language-Vision : VinVL">Microsoft Research Développe un Nouveau Système de Language-Vision : VinVL</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/fr/articles/uber-eats-time-predictions/" title="Les Pr&eacute;dictions De Temps Chez Uber Eats">Les Prédictions De Temps Chez Uber Eats</a></h5> </li> </ul> </div> </li> <li class="devops"> <div class="box__header"> <a class="t_all_footer_more-boxes-header" href="/fr/devops/">DevOps</a> </div> <div class="box__content"> <ul class="no-style box__list small"> <li> <h5><a class="t_all_footer_more-boxes-item" href="/fr/news/2022/10/Uber-breach-mfa-fatigue/" title="Les Facteurs Cl&eacute;s De La &quot;MFA Fatigue&quot; Dont A Ete Victime Uber">Les Facteurs Clés De La "MFA Fatigue" Dont A Ete Victime Uber</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/fr/news/2022/09/slack-remote-development-env/" title="Adoption D'Environnements De D&eacute;veloppement &Agrave; Distance Chez Slack">Adoption D'Environnements De Développement À Distance Chez Slack</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/fr/articles/devops-governance-developer-velocity/" title="Pourquoi La Gouvernance DevOps Est Cruciale Pour Permettre La V&eacute;locit&eacute; Des D&eacute;veloppeurs">Pourquoi La Gouvernance DevOps Est Cruciale Pour Permettre La Vélocité Des Développeurs</a></h5> </li> </ul> </div> </li> </ul> </div> </section> <section data-nosnippet class="container section section__newsletter"> <div class="columns container__inner"> <div class="newsletter" data-col="1/2" > <h2 class="heading"> <strong>InfoQ</strong> Newsletter hebdomadaire </h2> <p class="intro">Un résumé du contenu de la semaine dernière sur InfoQ envoyé tous les jeudis. Rejoignez une communauté de plus de 250 000 développeurs seniors. <a target="_blank" href="https://assets.infoq.com/newsletter/regular/fr/newsletter_sample/newsletter_sample.html">Voir un exemple</a> </p> <ul class="newsletter__features"> <li>Obtenez un aperçu rapide du contenu publié sur une variété de technologies innovantes et précoces</li> <li>Apprenez ce que vous ne savez pas et que vous devriez connaître</li> <li>Restez à jour avec les dernières informations sur les sujets qui vous intéressent</li> </ul> <div class="newsletter__subscribe"> <form class="form gdpr" name="footerNewsletterForm" id="footerNewsletterForm" action="#" onsubmit="footerNewsletter.saveSubscription(); return false;"> <div class="field newsletter__mail input__text input__no-label input__medium email"> <label for="email-newsletter-infoq" class="label field__label">Votre adresse email ici</label> <input id="email-newsletter-infoq" name="footerNewsletterEmail" placeholder="Votre adresse email ici" class="input field__input" type="email"/> <input type="text" name="emailH" id="input_email_h" aria-required="false" style="display:none !important" tabindex="-1" autocomplete="off"/> <input type="hidden" id="fnt" name="fnt" value="2QAP3HqxPJi7MPlU"/> <input type="hidden" id="footerNewsletterType" name="footerNewsletterType" value="regular"/> <input type="hidden" id="cmpi" name="cmpi" value="2"/> </div> <div class="hidden"> <span class="input__select field country"> <label for="input-simple-newsletter-country" class="label field__label">Sélectionnez votre pays</label> <select id="input-simple-newsletter-country" class="select field__input"> <option value="" class="select__option">Sélectionner</option> </select> <p class="input__message field__desc"></p> </span> <span class="input__checkbox field hidden"> <input type="checkbox" id="gdpr-consent-simple-nl"> <label for="gdpr-consent-simple-nl" class="label"><span>Je consens à ce que InfoQ.com traite mes données comme expliqué dans ces <a href="https://www.infoq.com/fr/privacy-notice" target=“_blank”>conditions de confidentialité</a>.</span></label> </span> </div> <input type="submit" role="button" value="S'inscrire" class="button button__medium button__red" onclick="return footerNewsletter.validateEmail('Adresse email invalide');"/> </form> <p class="meta"> <a href="/fr/privacy-notice/" target="_blank">Nous protégeons votre vie privée.</a> </p> <span class="success" style="display:none;" id="footerNewsletterMessage"></span> </div> <script type="text/javascript"> var footerNewsletter = new Newsletter('Votre adresse email ici', 'email-newsletter-infoq', 'footerNewsletterType','footerNewsletterMessage', 'fnt', 'input_email_h', 'input-simple-newsletter-country', 'cmpi','footer_except_homepage'); </script> </div> <div data-col="1/2" data-bg="qconLondon" class="event__container"> <a href="https://qconlondon.com/?utm_source=infoq&utm_medium=referral&utm_campaign=largefooterad_qlondon25" target="_blank" class="qconplus__events-slider"> <div> <div class="logo-london"></div> <br> </div> <p class="intro"><ul><li><strong>Conference: April 7-9, 2025</strong></li><li><strong>Certification workshop: April 10, 2025</strong></li></ul> QCon London International Software Development Conference returns on April 7-10, 2025. Level-up on 15 major software and leadership topics including; The Tech of FinTech, AI & ML in Software Engineering, Modern Data Architectures, Engineering Productivity, The Path to Senior Engineering Leadership, Supply Chain Security, and more.</p> <p class="intro">Learn the emerging trends. Explore the use cases. Implement the best practices.<br><strong class="button button__green cta__button">Register Now</strong></p> </a> </div> </div> </section> <section data-nosnippet class="section container footer__subfooter align__left"> <div class="container__inner columns"> <div data-col="1/4" class="columns footer__links-wrap"> <div class="footer__links"> <a href="/fr/" class="nuxt-link-exact-active active" title="Accueil">Accueil</a> <a href="/fr/reginit.action" class="emphasis" title="S'inscrire">S'inscrire</a> <button aria-label="Connexion" class="login" data-ref="mainLogin">Connexion</button> <a rel="noreferrer noopener" href="http://qconferences.com/" target="_blank" title="Conférences QCon">Conférences QCon</a> <a rel="noreferrer noopener" href="https://events.infoq.com/" target="_blank">Events</a> <a href="/fr/write-for-infoq/" title="Contribuez">Contribuez</a> <a href="/fr/infoq-editors/" title="Editeurs InfoQ">Editeurs InfoQ</a> <a href="/fr/about-infoq/" title="A propos d'InfoQ">A propos d'InfoQ</a> <a href="/fr/about-c4media/" title="A propos de C4 Media">A propos de C4 Media</a> <a rel="noreferrer noopener" href="https://c4media.com/diversity" title="Diversity" target="_blank">Diversity</a> </div> </div> <div data-col="1/4" class="events__list"> <h4 class="heading footer__heading">Events</h4> <ul class="qcons__list no-style"> <li><span class="icon event__type conference"></span> <div class="qcon__detail"> <h5 class="heading"> <a rel="noreferrer noopener" href="https://qconlondon.com/?utm_source=infoq&utm_medium=referral&utm_campaign=footer_qlondon25" target="_blank">QCon London</a> </h5> <span class="meta date">APRIL 7-10, 2025</span> </div> </li> <li><span class="icon event__type conference"></span> <div class="qcon__detail"> <h5 class="heading"> <a rel="noreferrer noopener" href="https://devsummit.infoq.com/conference/boston2025?utm_source=infoq&utm_medium=referral&utm_campaign=footer_idsboston25" target="_blank">InfoQ Dev Summit Boston</a> </h5> <span class="meta date">June 9-10, 2025</span> </div> </li> <li><span class="icon event__type conference"></span> <div class="qcon__detail"> <h5 class="heading"> <a rel="noreferrer noopener" href="https://devsummit.infoq.com/conference/munich2025?utm_source=infoq&utm_medium=referral&utm_campaign=footer_idsmunich25" target="_blank">InfoQ Dev Summit Munich</a> </h5> <span class="meta date">October 15-16, 2025</span> </div> </li> <li><span class="icon event__type conference"></span> <div class="qcon__detail"> <h5 class="heading"> <a rel="noreferrer noopener" href="https://qconsf.com/?utm_source=infoq&utm_medium=referral&utm_campaign=footer_qsf25" target="_blank">QCon San Francisco</a> </h5> <span class="meta date">November 17-21, 2025 / In-person</span> </div> </li> <li><span class="icon event__type conference"></span> <div class="qcon__detail"> <h5 class="heading"> <a rel="noreferrer noopener" href="#" target="_self" onclick="return false;">InfoQ Dev Summit New York</a> </h5> <span class="meta date">December, 2025 / In-person</span> </div> </li> </ul> </div> <div data-col="1/4" class="footer__social-wrap"> <h4 class="heading text-left footer__heading">Retrouvez-nous sur les réseaux sociaux </h4> <div class="social__links columns social__links__row"> <a href="http://www.linkedin.com/company/infoq"><span class="icon icon__large icon__social icon__linkedin"></span></a> <a href="#" id="footerNewsletterRssLink"><span class="icon icon__large icon__social icon__rss"></span></a> <a href="http://twitter.com/infoqfr" target="_blank"><span class="icon icon__large icon__social icon__twitter"></span></a> <a href="https://www.facebook.com/InfoQ-75911537320" target="_blank"><span class="icon icon__large icon__social icon__fb"></span></a> </div> </div> <div data-col="1/4" class="footer__stayin-wrap"> <h4 class="heading text-left footer__heading">Stay in the know</h4> <div class="stayIn_panel_container"> <a href="/podcasts/" class="stayIn_panel" target="_blank" rel="noreferrer noopener"><span>The InfoQ Podcast</span><picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QuanBnIiwiZWRpdHMiOiB7IndlYnAiOiB7ICJxdWFsaXR5Ijo4MH19fQ==" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QuanBnIiwiZWRpdHMiOiB7ImpwZWciOiB7ICJxdWFsaXR5Ijo4MH19fQ==" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QuanBnIiwiZWRpdHMiOiB7ImpwZWciOiB7ICJxdWFsaXR5Ijo4MH19fQ==" loading="lazy" width="65px" height="64px" alt="The InfoQ Podcast Logo - Stay in the know"></picture></a> <a href="/podcasts/#engineering_culture" class="stayIn_panel" target="_blank" rel="noreferrer noopener"><span>Engineering Culture Podcast</span><picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QtZW5naW5lZXJpbmctY3VsdHVyZS5qcGciLCJlZGl0cyI6IHsid2VicCI6IHsgInF1YWxpdHkiOjgwfX19" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QtZW5naW5lZXJpbmctY3VsdHVyZS5qcGciLCJlZGl0cyI6IHsianBlZyI6IHsgInF1YWxpdHkiOjgwfX19" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QtZW5naW5lZXJpbmctY3VsdHVyZS5qcGciLCJlZGl0cyI6IHsianBlZyI6IHsgInF1YWxpdHkiOjgwfX19" loading="lazy" width="65px" height="64px" alt="Engineering Culture Podcast Logo - Stay in the knoww"></picture></a> <a href="/software-architects-newsletter/" class="stayIn_panel" target="_blank" rel="noreferrer noopener"><span>The Software Architects' Newsletter</span><picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLWFyY2hpdGVjdC1uZXdzbGV0dGVyLmpwZyIsImVkaXRzIjogeyJ3ZWJwIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLWFyY2hpdGVjdC1uZXdzbGV0dGVyLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLWFyY2hpdGVjdC1uZXdzbGV0dGVyLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" loading="lazy" width="65px" height="64px" alt="The Software Architects' Newsletter Logo - Stay in the know"></picture></a> </div> </div> </div> </section> <section data-nosnippet class="container footer__bottom section white align__left"> <div class="container__inner columns"> <div data-col="2/3" class="column"> <div class="footer__contact contact columns"> <span data-col="1/6"> Feedback Général <a href="mailto:feedback-fr@infoq.com">feedback-fr@infoq.com</a> </span> <span data-col="1/6"> Publicité <a href="mailto:sales-fr@infoq.com">sales-fr@infoq.com</a> </span> <span data-col="1/6"> Éditorial <a href="mailto:editors-fr@infoq.com">editors-fr@infoq.com</a> </span> <span data-col="1/6"> Marketing <a href="mailto:marketing@infoq.com">marketing@infoq.com</a> </span> </div> </div> <div class="column" data-col="1/3"> <p class="footer__more"> InfoQ.com et tous les contenus sont copyright © 2006-2025 C4Media Inc.<br/> <a href="/fr/privacy-notice/" target="_blank">Politique de confidentialité</a></span> </p> </div> </div> </section> </footer> <!-- ####### SITE END ######### --> </div> <div class="intbt"> <a href="/int/bt/" title="bt">BT</a> </div> <script type="text/javascript"> $.when(humanDetectionAsync()).then( function(status) { $.getScript("/scripts/__hd.ifq?hdt=2QAP3HqxPJi7MPlU&ha=" + status); } ); </script> <script type="text/javascript"> var pageFullyLoaded = false; // this event is fired by frontend once all the necessary things have been done(mobile display, moving vcr boxes around when needed...) infoq.event.on('loaded', function(e) { pageFullyLoaded = true; }); infoq.event.on('pageWidthChanged', function(e) { // re-execute tracking vcr impressions when this event happens (it only happens when elements are added/removed from page) // doTrackVcrImpressions takes into account the data-trk-impr="true" if =false the element was already tracked. // this is needed when switching from mobile to desktop or when layout on mobile changes and desktop version is displayed. New elements become visible. Tracker.safeExec(Tracker.doTrackVcrImpressions); // these 2 need to be called also because we might be on a content page. In case we are not nothing happens VCR.doTrackingCustomRightbar(); VCR.doTrackingCustomRightbarForPresentations() }); //check to see if error page if(window.device !== undefined) { var intervalImpressions = setInterval(function() { var shouldTrack = false; // no vcr widgets on index pages if(window.isIndexPage) { if(window.sponsoredPodcastDone === undefined || window.sponsoredPodcastDone) { shouldTrack = true; } } else //on homepage, bottom widget + 2 native widgets if(InfoQConstants.pageType == "HOMEPAGE" && window.finishedVcrOptional1 && window.finishedRelatedVcr && (window.finishedVcrOptional2 === undefined || window.finishedVcrOptional2)) { shouldTrack = true; } else // rightbar widgets + native widgets + content vcr widgets if((InfoQConstants.pageType == "NEWS_PAGE" || InfoQConstants.pageType == "ARTICLE_PAGE") && ((window.finishedRightbarVcr || window.finishedRightbarVcr === undefined) && window.contentVcrFinished)) { shouldTrack = true; } else if ((InfoQConstants.pageType == "PRESENTATION_PAGE") && (window.contentVcrFinished || window.contentVcrFinished === undefined) && (window.finishedRightbarVcr || window.finishedRightbarVcr === undefined) ) { shouldTrack = true; } else // native widgets + content widgets if(window.contentVcrFinished && (window.finishedVcrOptional1 || window.finishedVcrOptional1 === undefined) && (window.finishedVcrOptional2 || window.finishedVcrOptional2 === undefined)) { shouldTrack = true; } // we start tracking only after the page is fully loaded, frontend signals that they finished everything related to page display. if(shouldTrack && pageFullyLoaded) { clearInterval(intervalImpressions); Tracker.safeExec(Tracker.doTrackVcrImpressions); // start tracking viewable impressions also only after everything is ready function callbackRouter(entries, observer) { var targets = new Array(); entries.forEach(function (entry) { var target = entry.target; if (target.dataset.trkView === 'false') return; if (entry.intersectionRatio > 0) { target.dataset.trkView = false; targets.push(target); } }); Tracker.doTrackViewableImpressions(targets); } var elementsForTrackingViewableImpressions = document.querySelectorAll('[data-trk-view="true"]') var observer = new IntersectionObserver(callbackRouter, { threshold: 0.3 }); elementsForTrackingViewableImpressions.forEach(observer.observe.bind(observer)); } }, 500); } $(document).ready(function () { // desktop notifications widget Tracker.encodeNotificationLinks($(".f_notificationWidget")); // mobile notifications widget Tracker.encodeNotificationLinks($(".h_notifications")); // desktop notifications page Tracker.encodeNotificationLinks($(".notification-page")); // mobile notifications page Tracker.encodeNotificationLinks($(".notifications_page")); }); </script> <script type="text/javascript"> if(window.location.hash){ var hash = window.location.hash.substring(1); if(hash == 'subscribe'){ $('html,body').animate({scrollTop: $('.ftxt3 > .newsletter').offset().top}, 'slow'); } } </script> <script type="text/javascript"> var newsletterSubscriptionURL ='/fr/newsletter/subscribe.action'; DynamicLinks.updateRssLinks('XnLuCjIf6z9BHCGZ6Nd4R76O32258ENr'); ContentSummary.setSelectedTab('fr'); //when user enters the main content area show default topics in the topics bar $("#content-wrapper").mouseenter(function() { showDefaultTopics(); }); Bookmarks.contentTitle = "Traitements Big Data avec Apache Spark - 1ère partie : Introduction"; Bookmarks.apiUrl = '/widgets/bookmark.action'; Bookmarks.isContentBookmarked = "false"; </script> <script type="text/javascript"> var $buoop = {vs:{i:6,f:1,o:10.1,s:1}} $buoop.ol = window.onload; $(document).ready(function() { try {if ($buoop.ol) $buoop.ol();}catch (e) {} var e = document.createElement("script"); e.setAttribute("type", "text/javascript"); e.setAttribute("src", "https://cdn.infoq.com/statics_s2_20250228123450/scripts/lib/browser-update-org/update.js"); document.body.appendChild(e); }); </script> <script type='text/javascript'> try { mixpanel.track('page viewed', { 'page name' : document.title, 'url' : window.location.pathname }); } catch(err) { } </script> <!-- Latest Version --> <script src="https://cc.cdn.civiccomputing.com/9/cookieControl-9.x.min.js" type="text/javascript"></script> <script> const config = { apiKey: '8910ea974a96ffb6f927952b4ae9b9b0cc3e5973', product: 'PRO_MULTISITE', // general settings consentCookieExpiry: 90, encodeCookie: true, sameSiteCookie: true, // if false, cookie set as SameSite=None;secure; sameSiteValue: ';secure', // either 'Strict', 'Lax', or 'None' subDomains: true, initialState: 'notify', // 'notify','top','box' require pro licence notifyOnce: false, setInnerHTML: true, //layout settings layout: 'slideout', position: 'left', theme: 'light', acceptButton: true, rejectButton: true, closeOnGlobalChange: true, closeStyle: 'icon', toggleType: 'slider', notifyDismissButton: true, settingsStyle: 'link', excludedCountries: ['US'], /*accessibility: { disableSiteScrolling: true, },*/ statement: { description: 'For more detailed information about the cookies we use, see our', name: 'Cookie Policy', url: 'https://www.infoq.com/cookie-policy', updated: '01/01/2024', }, // cookies starting from 'cookie_expire' are from live.infoq.com but since we use the same tool on the same domain we need to specify those too so // that infoq.com cookieControl does not delete live.infoq.com cookies(also infoq.com cookies have been specified in live.infoq.com cookieControl configs) necessaryCookies: ['RegUserCookie', 'UserCookie', 'IdpCookie', 'ConversionTrackingV2_','PSAdialog','*P13NWN*','topbarSurvey','__bkm','JSESSIONID','mp_','_mixpanel','CloudFront-Key-Pair-Id','CloudFront-Policy','CloudFront-Signature','cookie_expire','discount_promo_closed','discount_promo_code','discount_promo_submitted','exit_survey_popup','referrer_popup','voting_popup_*','AWSALB','AWSALBCORS','aws-waf-token'], optionalCookies: [ { name: 'analytics', label: 'Analytics', description: 'Analytical cookies help us to improve our website by collecting and reporting information on its usage.', cookies: ['_ga', '_ga*', '_gid', '_gat', '__utma', '__utmt', '__utmb', '__utmc', '__utmz', '__utmv'], onAccept: function(){ gtag('consent', 'update', {'analytics_storage': 'granted'}); }, onRevoke: function(){ gtag('consent', 'update', {'analytics_storage': 'denied'}); } }, { name: 'marketing', label: 'Advertising', description: 'We use advertising cookies to display advertisements to you for our products.', onAccept: function(){ gtag('consent', 'update', {'ad_storage': 'granted', 'ad_personalization': 'granted', 'ad_user_data': 'granted'}); }, onRevoke: function(){ gtag('consent', 'update', {'ad_storage': 'denied', 'ad_personalization': 'denied', 'ad_user_data': 'denied'}); } } ], text : { // main preference panels title: '<h3>Our use of cookies</h3>', intro: 'We use necessary cookies to make our site work. Functional cookies help enhance the performance and functionality of the site. '+ 'We\'d also like to set analytics cookies to help us improve your experience by measuring how you use the site. '+ 'These will be set only if you accept. ', acceptSettings: 'I Accept', rejectSettings: 'I Do Not Accept', necessaryTitle : '<h3>Necessary Cookies</h3>', necessaryDescription : 'Necessary cookies enable core functionality ' + 'such as page navigation and access to secure areas. '+ 'The website cannot function properly without '+ 'these cookies, and can only be disabled by changing '+ 'your browser preferences.', closeLabel: 'Close Cookie Control', cornerButton: 'Set cookie preferences', // main preference panel controls on: 'On', off : 'Off', thirdPartyTitle : 'Some cookies require your attention', thirdPartyDescription : 'Consent for the following cookies could not be '+ 'automatically revoked. Please follow the link(s) '+ 'below to opt out manually.', // notification panels (only accessible for pro licences) notifyTitle : 'Your choice regarding cookies on this site', notifyDescription : 'We use cookies to optimise site functionality and '+ 'give you the best possible experience.', accept : 'I Accept', reject: 'I Do Not Accept', settings : 'Settings', }, branding : { removeAbout: true, }, }; // do not load this for local envs only. for testing on local envs remove/modify this condition if(InfoQConstants.pageUrl.indexOf('local')===-1){ CookieControl.load( config ); } </script> </body> </html> <!-- s2 -->