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&#xE8;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="&copy; 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>&nbsp;&nbsp;&nbsp;Enregistré&nbsp;&nbsp;&nbsp;&nbsp;</q>'; JSi18n.bookmark_error='<q style=color:black;>&nbsp;&nbsp;&nbsp;Erreur&nbsp;&nbsp;&nbsp;&nbsp;</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&#39;analyse de l&#39;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&#39;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&#39;accompagne comprennent pourquoi elles font ce qu&#39;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 &#34;Big Data Processing with Apache Spark. He is also the co-author of &#34;Spring Roo in Action&#34; 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\\\">&#64;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&#xE8;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&#xE9;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&#xE8;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&#xE9;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&#xE9;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&#xE8;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&#xE9;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&#xE9;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&#xE9;veloppement,Architecture &amp; Design,DevOps,Data Science,Big Data,NoSQL,Data Management,Architecture Entreprise,Infrastructure,Spark,Base de donn&#xE9;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&#xE9;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&#xE9;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&eacute;fense En Profondeur Dans Les Apps Natives Et Navigateurs</a> </h4> <p class="card__excerpt">Isaac Potoczny-Jones discute des avantages et des inconv&#xE9;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&eacute;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 &amp; Design" class="nav__category">Architecture &amp; 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 &amp; 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&eacute;es Avec Programmation Fonctionnelle Et Requ&ecirc;tes Dans Ballerina</a> </h4> <p class="card__excerpt">Ballerina a &#xE9;t&#xE9; con&#xE7;u comme un langage de programmation orient&#xE9; donn&#xE9;es et prend en charge un style de codage de programmation fonctionnel. Le langage de requ&#xEA;te de Ballerina est similaire &#xE0; 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&eacute;es Avec Programmation Fonctionnelle Et Requ&ecirc;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&eacute;dictions De Temps Chez Uber Eats</a> </h4> <p class="card__excerpt">Les pr&#xE9;diction de temps sont essentielles pour les activit&#xE9;s d’Uber Eats, elles permettent une r&#xE9;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&eacute;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 &amp; Methods" class="nav__category">Culture &amp; 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 &amp; M&#xE9;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&#xE9;dures qui sont utilis&#xE9;s par tout le monde dans l'entreprise. Chaque &#xE9;quipe est diff&#xE9;rente alors pourquoi les proc&#xE9;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&eacute;locit&eacute; Des D&eacute;veloppeurs</a> </h4> <p class="card__excerpt">L'environnement d'application doit &#xEA;tre g&#xE9;r&#xE9; de mani&#xE8;re centralis&#xE9;e par l'&#xE9;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&eacute;locit&eacute; Des D&eacute;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 &amp; 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&#xE8;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&#xE8;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&rsquo;est-ce que Spark&nbsp;?</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&eacute;es et con&ccedil;u pour la rapidit&eacute; et la facilit&eacute; d&rsquo;utilisation. Celui-ci a originellement &eacute;t&eacute; d&eacute;velopp&eacute; par AMPLab, de l&rsquo;Universit&eacute; UC Berkeley, en 2009 et pass&eacute; open source sous forme de projet Apache en 2010.</p> <p>Spark pr&eacute;sente plusieurs avantages par rapport aux autres technologies big data et MapReduce comme Hadoop et Storm. D&rsquo;abord, Spark propose un framework complet et unifi&eacute; pour r&eacute;pondre aux besoins de traitements Big Data pour divers jeux de donn&eacute;es, divers par leur nature (texte, graphe, etc.) aussi bien que par le type de source (batch ou flux temps-r&eacute;el). Ensuite, Spark permet &agrave; des applications sur clusters Hadoop d&rsquo;&ecirc;tre ex&eacute;cut&eacute;es jusqu&rsquo;&agrave; 100 fois plus vite en m&eacute;moire, 10 fois plus vite sur disque. Il vous permet d&rsquo;&eacute;crire rapidement des applications en Java, Scala ou Python et inclut un jeu de plus de 80 op&eacute;rateurs haut-niveau. De plus, il est possible de l&rsquo;utiliser de fa&ccedil;on interactive pour requ&ecirc;ter les donn&eacute;es depuis un shell.</p> <p>Enfin, en plus des op&eacute;rations de Map et Reduce, Spark supporte les requ&ecirc;tes SQL et le streaming de donn&eacute;es et propose des fonctionnalit&eacute;s de machine learning et de traitements orient&eacute;s graphe. Les d&eacute;veloppeurs peuvent utiliser ces possibilit&eacute;s en stand-alone ou en les combinant en une cha&icirc;ne de traitement complexe.</p> <div class="clear"></div> <script type="text/javascript"> var uriMapping = "articles"; var showVcr = "true"; var fillWithVcr = "false"; var sponsorshipsJson = "{&quot;links&quot;: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&eacute;rie propose un aper&ccedil;u de ce qu&rsquo;est Spark, de la suite d&rsquo;outils mis &agrave; 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&eacute; en tant que technologie de traitement de donn&eacute;es depuis 10 ans et a prouv&eacute; &ecirc;tre la solution de choix pour le traitement de gros volumes de donn&eacute;es. MapReduce est une tr&egrave;s bonne solution pour les traitements &agrave; passe unique mais n&rsquo;est pas la plus efficace pour les cas d&rsquo;utilisation n&eacute;cessitant des traitements et algorithmes &agrave; plusieurs passes. Chaque &eacute;tape d&rsquo;un workflow de traitement &eacute;tant constitu&eacute;e d&rsquo;une phase de Map et d&rsquo;une phase de Reduce, il est n&eacute;cessaire d&rsquo;exprimer tous les cas d&rsquo;utilisation sous forme de patterns MapReduce pour tirer profit de cette solution. Les donn&eacute;es en sortie de l&rsquo;ex&eacute;cution de chaque &eacute;tape doivent &ecirc;tre stock&eacute;es sur syst&egrave;me de fichier distribu&eacute; avant que l&rsquo;&eacute;tape suivante commence. Cette approche a tendance &agrave; &ecirc;tre peu rapide &agrave; cause de la r&eacute;plication et du stockage sur disque.</p> <p>De plus, les solutions Hadoop s&rsquo;appuient g&eacute;n&eacute;ralement sur des clusters, qui sont difficiles &agrave; mettre en place et &agrave; administrer. Elles n&eacute;cessitent aussi l&rsquo;int&eacute;gration de plusieurs outils pour les diff&eacute;rents cas d&rsquo;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&icirc;ner une s&eacute;rie de jobs MapReduce et les ex&eacute;cuter s&eacute;quentiellement, chacun de ces jobs pr&eacute;sentant une latence &eacute;lev&eacute;e et aucun ne pouvant commencer avant que le pr&eacute;c&eacute;dent n&rsquo;ait tout-&agrave;-fait termin&eacute;.</p> <p>Spark permet de d&eacute;velopper des pipelines de traitement de donn&eacute;es complexes, &agrave; plusieurs &eacute;tapes, en s&rsquo;appuyant sur des graphes orient&eacute;s acycliques (<a href="http://en.wikipedia.org/wiki/Directed_acyclic_graph">DAG</a>). Spark permet de partager les donn&eacute;es en m&eacute;moire entre les graphes, de fa&ccedil;on &agrave; ce que plusieurs jobs puissent travailler sur le m&ecirc;me jeu de donn&eacute;es. Spark s&rsquo;ex&eacute;cute sur des infrastructures Hadoop Distributed File System (<a href="http://wiki.apache.org/hadoop/HDFS">HDFS</a>) et propose des fonctionnalit&eacute;s suppl&eacute;mentaires. Il est possible <a href="http://databricks.com/blog/2014/01/21/Spark-and-Hadoop.html">de d&eacute;ployer des applications Spark</a> sur un cluster Hadoop v1 existant (avec SIMR &ndash; Spark-Inside-MapReduce), sur un cluster Hadoop v2 YARN ou m&ecirc;me sur <a href="http://mesos.apache.org/">Apache Mesos</a>. Plut&ocirc;t que de voir en Spark un rempla&ccedil;ant d&rsquo;Hadoop, il est plus correct de le voir comme une alternative au MapReduce d&rsquo;Hadoop. Spark n&rsquo;a pas &eacute;t&eacute; pr&eacute;vu pour remplacer Hadoop mais pour mettre &agrave; disposition une solution compl&egrave;te et unifi&eacute;e permettant de prendre en charge diff&eacute;rents cas d&rsquo;utilisation et besoins dans le cadre des traitements big data.</p> <h2>Les fonctionnalit&eacute;s de Spark</h2> <p>Spark apporte des am&eacute;liorations &agrave; MapReduce gr&acirc;ce &agrave; des &eacute;tapes de shuffle moins co&ucirc;teuses. Avec le stockage en m&eacute;moire et un traitement proche du temps-r&eacute;el, la performance peut &ecirc;tre plusieurs fois plus rapide que d&rsquo;autres technologies big data. Spark supporte &eacute;galement les &eacute;valuations paresseuses (&quot;lazy evaluation&quot;) des requ&ecirc;tes, ce qui aide &agrave; l&rsquo;optimisation des &eacute;tapes de traitement. Il propose une API de haut-niveau pour une meilleure productivit&eacute; et un mod&egrave;le d&rsquo;architecture coh&eacute;rent pour les solutions big data.</p> <p>Spark maintient les r&eacute;sultats interm&eacute;diaires en m&eacute;moire plut&ocirc;t que sur disque, ce qui est tr&egrave;s utile en particulier lorsqu&rsquo;il est n&eacute;cessaire de travailler &agrave; plusieurs reprises sur le m&ecirc;me jeu de donn&eacute;es. Le moteur d&rsquo;ex&eacute;cution est con&ccedil;u pour travailler aussi bien en m&eacute;moire que sur disque. Les op&eacute;rateurs r&eacute;alisent des op&eacute;rations externes lorsque la donn&eacute;e ne tient pas en m&eacute;moire, ce qui permet de traiter des jeux de donn&eacute;es plus volumineux que la m&eacute;moire agr&eacute;g&eacute;e d&rsquo;un cluster. Spark essaye de stocker le plus possible en m&eacute;moire avant de basculer sur disque. Il est capable de travailler avec une partie des donn&eacute;es en m&eacute;moire, une autre sur disque.</p> <p>Il est n&eacute;cessaire d&rsquo;examiner ses donn&eacute;es et ses cas d&rsquo;utilisation pour &eacute;valuer ses besoins en m&eacute;moire car, en fonction du travail fait en m&eacute;moire, Spark peut pr&eacute;senter d&rsquo;importants avantages de performance. Les autres fonctionnalit&eacute;s propos&eacute;es par Spark comprennent&nbsp;:</p> <ul> <li>Des fonctions autres que Map et Reduce</li> <li>L&rsquo;optimisation de graphes d&rsquo;op&eacute;rateurs arbitraires</li> <li>L&rsquo;&eacute;valuation paresseuse des requ&ecirc;tes, ce qui aide &agrave; optimiser le workflow global de traitement</li> <li>Des APIs concises et coh&eacute;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 &eacute;crit en <a href="http://www.scala-lang.org/">Scala</a> et s&rsquo;ex&eacute;cute sur la machine virtuelle Java (JVM). Les langages support&eacute;s actuellement pour le d&eacute;veloppement d&rsquo;applications sont&nbsp;:</p> <ul> <li>Scala</li> <li>Java</li> <li>Python</li> <li>Clojure</li> <li>R</li> </ul> <h2>L&rsquo;&eacute;cosyst&egrave;me de Spark</h2> <p>&Agrave; c&ocirc;t&eacute; des API principales de Spark, l&rsquo;&eacute;cosyst&egrave;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&nbsp;:</p> <ul> <li><strong>Spark Streaming&nbsp;:</strong> <a href="https://spark.apache.org/streaming/">Spark Streaming</a> peut &ecirc;tre utilis&eacute; pour traitement temps-r&eacute;el des donn&eacute;es en flux. Il s&rsquo;appuie sur un mode de traitement en &quot;micro batch&quot; et utilise pour les donn&eacute;es temps-r&eacute;el DStream, c&rsquo;est-&agrave;-dire une s&eacute;rie de RDD (Resilient Distributed Dataset).</li> <li><strong>Spark SQL&nbsp;:</strong> <a href="https://spark.apache.org/sql/">Spark SQL</a> permet d&rsquo;exposer les jeux de donn&eacute;es Spark via API JDBC et d&rsquo;ex&eacute;cuter des requ&ecirc;tes de type SQL en utilisant les outils BI et de visualisation traditionnels. Spark SQL permet d&rsquo;extraire, transformer et charger des donn&eacute;es sous diff&eacute;rents formats (JSON, Parquet, base de donn&eacute;es) et les exposer pour des requ&ecirc;tes ad-hoc.</li> <li><strong>Spark MLlib&nbsp;:</strong> <a href="https://spark.apache.org/mllib/">MLlib</a> est une librarie de machine learning qui contient tous les algorithmes et utilitaires d&rsquo;apprentissage classiques, comme la classification, la r&eacute;gression, le clustering, le filtrage collaboratif, la r&eacute;duction de dimensions, en plus des primitives d&rsquo;optimisation sous-jacentes.</li> <li><strong>Spark GraphX&nbsp;:</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&eacute;lisation de graphes. GraphX &eacute;tend les RDD de Spark en introduisant le Resilient Distributed Dataset Graph, un multi-graphe orient&eacute; avec des propri&eacute;t&eacute;s attach&eacute;es aux n&oelig;uds et aux arr&ecirc;tes. Pour le support de ces traitements, GraphX expose un jeu d&rsquo;op&eacute;rateurs de base (par exemple subgraph, joinVertices, aggregateMessages), ainsi qu&rsquo;une variante optimis&eacute;e de l&rsquo;API Pregel. De plus, GraphX inclut une collection toujours plus importante d&rsquo;algorithmes et de builders pour simplifier les t&acirc;ches d&rsquo;analyse de graphes.</li> </ul> <p>En plus de ces librairies, on peut citer BlinkDB et Tachyon&nbsp;: <a href="http://blinkdb.org/">BlinkDB</a> est un moteur de requ&ecirc;tes approximatif qui peut &ecirc;tre utilis&eacute; pour ex&eacute;cuter des requ&ecirc;tes SQL interactives sur des volumes de donn&eacute;es importants. Il permet &agrave; l&rsquo;utilisateur de troquer la pr&eacute;cision contre le temps de r&eacute;ponse. Il fonctionne en ex&eacute;cutant les requ&ecirc;tes sur des extraits des donn&eacute;es et pr&eacute;sente ses r&eacute;sultats accompagn&eacute;s d&rsquo;annotations avec les indicateurs d&rsquo;erreurs significatifs. <a href="http://tachyon-project.org/index.html">Tachyon</a> est un syst&egrave;me de fichiers distribu&eacute; qui permet de partager des fichiers de fa&ccedil;on fiable &agrave; la vitesse des acc&egrave;s en m&eacute;moire &agrave; travers des frameworks de clusters comme Spark et MapReduce. Il &eacute;vite les acc&egrave;s disques et le chargement des fichiers fr&eacute;quemment utilis&eacute;s en les cachant en m&eacute;moire. Ceci permet aux divers frameworks, t&acirc;ches et requ&ecirc;tes d&rsquo;acc&eacute;der aux fichiers en cache rapidement.</p> <p>Il existe aussi des adaptateurs pour int&eacute;gration &agrave; d&rsquo;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&eacute;der &agrave; des donn&eacute;es stock&eacute;es dans Cassandra et r&eacute;aliser des analyses sur ces donn&eacute;es.</p> <p>Le diagramme suivant (Figure 1) montre les relations entre ces diff&eacute;rentes librairies de l&rsquo;&eacute;cosyst&egrave;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&eacute;rie.</p> <h2>L&rsquo;architecture de Spark</h2> <p>L&rsquo;architecture de Spark comprend les trois composants principaux suivants&nbsp;:</p> <ul> <li>Le stockage des donn&eacute;es</li> <li>L&rsquo;API</li> <li>Le Framework de gestion des ressources</li> </ul> <p>Regardons chacun de ces composants plus en d&eacute;tails.</p> <h3>Le stockage des donn&eacute;es&nbsp;:</h3> <p>Spark utilise le syst&egrave;me de fichiers HDFS pour le stockage des donn&eacute;es. Il peut fonctionner avec n&rsquo;importe quelle source de donn&eacute;es compatible avec Hadoop, dont HDFS, HBase, Cassandra, etc.</p> <h3>L&rsquo;API&nbsp;:</h3> <p>L&rsquo;API permet aux d&eacute;veloppeurs de cr&eacute;er des applications Spark en utilisant une API standard. L&rsquo;API existe en Scala, Java et Python. Les liens ci-dessous pointent vers les sites pr&eacute;sentant les API Spark pour chacun de ces langages&nbsp;:</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 &ecirc;tre d&eacute;ploy&eacute; comme un serveur autonome ou sur un framework de traitements distribu&eacute;s comme Mesos ou YARN. La figure 2 illustre les composants du mod&egrave;le d&rsquo;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 &quot;Resilient Distributed Datasets&quot;</h3> <p>Les <a href="https://spark.apache.org/docs/latest/programming-guide.html#resilient-distributed-datasets-rdds">Resilient Distributed Datasets</a> (bas&eacute;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&oelig;ur du framework Spark. Vous pouvez voir un RDD comme une table dans une base de donn&eacute;es. Celui-ci peut porter tout type de donn&eacute;es et est stock&eacute; par Spark sur diff&eacute;rentes partitions. Les RDD permettent de r&eacute;arranger les calculs et d&rsquo;optimiser le traitement. Ils sont aussi tol&eacute;rants aux pannes car un RDD sait comment recr&eacute;er et recalculer son ensemble de donn&eacute;es. Les RDD sont immutables. Pour obtenir une modification d&rsquo;un RDD, il faut y appliquer une transformation, qui retournera un nouveau RDD, l&rsquo;original restera inchang&eacute;. Les RDD supportent deux types d&rsquo;op&eacute;rations&nbsp;:</p> <ul> <li>Les transformations</li> <li>Les actions</li> </ul> <p><strong>Les transformations&nbsp;:</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&rsquo;est &eacute;valu&eacute; lorsque l&rsquo;on fait appel &agrave; 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&nbsp;:</strong> les <a href="https://spark.apache.org/docs/latest/programming-guide.html#actions">actions</a> &eacute;valuent et retournent une nouvelle valeur. Au moment o&ugrave; une fonction d&rsquo;action est appel&eacute;e sur un objet RDD, toutes les requ&ecirc;tes de traitement des donn&eacute;es sont calcul&eacute;es et le r&eacute;sultat est retourn&eacute;. 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&ccedil;ons d&rsquo;installer et d&rsquo;utiliser Spark. Vous pouvez l&rsquo;installer sur votre machine, comme framework autonome ou utiliser une des images de machine virtuelle (Spark Virtual Machine) disponibles chez des &eacute;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&eacute;j&agrave; install&eacute; et configur&eacute;, sur le Cloud (comme <a href="http://databricks.com/product/databricks-cloud">Databricks Cloud</a>).</p> <p>Dans cet article, Spark sera install&eacute; en framework autonome et lanc&eacute; localement. La version 1.2.0, sortie r&eacute;cemment, sera utilis&eacute;e pour la d&eacute;monstration de code.</p> <h3>Comment ex&eacute;cuter Spark&nbsp;?</h3> <p>Lorsque Spark est install&eacute; sur une machine locale ou sur le Cloud, diff&eacute;rents modes de connexion au moteur Spark sont possibles. La table ci-dessous pr&eacute;sente le param&egrave;tre Master URL utilisable pour les diff&eacute;rents modes d&rsquo;ex&eacute;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&nbsp;?</h3> <p>Une fois que Spark est install&eacute; et est en cours d&rsquo;ex&eacute;cution, vous pouvez vous y connecter en utilisant le Shell Spark pour effectuer des analyses de donn&eacute;es interactives. Le Shell Spark est disponible pour les langages Scala et Python. Java ne supporte pas encore de Shell interactif, donc cette fonctionnalit&eacute; n&rsquo;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&rsquo;ex&eacute;cution, quel que soit le mode d&rsquo;ex&eacute;cution, vous pouvez consulter les r&eacute;sultats des jobs et d&rsquo;autres statistiques en acc&eacute;dant &agrave; la console Web, via l&rsquo;URL suivante&nbsp;: <code>http://localhost:4040</code> La figure 3 montre la console Spark, avec ses onglets pour les &eacute;tapes, le stockage, l&rsquo;environnement et les ex&eacute;cuteurs.</p> <p>(Cliquez sur l&#39;image pour l&#39;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&eacute;es</h3> <p>Spark fournit deux types de variables partag&eacute;es pour permettre d&rsquo;ex&eacute;cuter de fa&ccedil;on efficace les programmes Spark sur un cluster&nbsp;: Broadcast et Accumulators.</p> <p><strong>Les variables Broadcast&nbsp;:</strong> Ces variables permettent de maintenir des variables en cache, en lecture seule, sur chaque machine, plut&ocirc;t que d&rsquo;avoir &agrave; les envoyer avec les t&acirc;ches. Elles peuvent &ecirc;tre utilis&eacute;es pour mettre &agrave; la disposition des n&oelig;uds du cluster des copies de jeux de donn&eacute;es volumineux de fa&ccedil;on plus efficace. L&rsquo;extrait de code suivant montre comment utiliser les variables Broadcast.</p> <pre> <font color="000000">//</font> <font color="000000">//&nbsp;Broadcast&nbsp;Variables</font> <font color="000000">//</font> <font color="000000">val</font>&nbsp;<font color="000000">broadcastVar</font>&nbsp;<font color="000000">=</font>&nbsp;sc.broadcast(<font color="000000">Array</font>(<font color="000000">1</font>,&nbsp;<font color="000000">2</font>,&nbsp;<font color="000000">3</font>)) broadcastVar.value</pre> <p><strong>Les accumulateurs&nbsp;:</strong> les accumulateurs peuvent &ecirc;tre ajout&eacute;s lors de l&rsquo;utilisation d&rsquo;op&eacute;rations associatives ; leur support est donc efficace dans le cadre de traitements parall&egrave;les. Ils peuvent &ecirc;tre utilis&eacute;s pour impl&eacute;menter des compteurs (comme avec MapReduce) ou des sommes. Les t&acirc;ches ex&eacute;cut&eacute;es sur le cluster peuvent ajouter un accumulateur avec la m&eacute;thode add. Cependant, ils ne peuvent pas lire sa valeur. Seul le programme pilote peut lire la valeur d&rsquo;un accumulateur. L&rsquo;extrait de code suivant montre comment utiliser un accumulateur&nbsp;:</p> <pre> <font color="000000">//</font> <font color="000000">//&nbsp;Accumulators</font> <font color="000000">//</font> <font color="000000">val</font>&nbsp;<font color="000000">accum</font>&nbsp;<font color="000000">=</font>&nbsp;sc.accumulator(<font color="000000">0</font>,&nbsp;<font color="000000"><font color="000000">&quot;</font>My&nbsp;Accumulator<font color="000000">&quot;</font></font>) sc.parallelize(<font color="000000">Array</font>(<font color="000000">1</font>,&nbsp;<font color="000000">2</font>,&nbsp;<font color="000000">3</font>,&nbsp;<font color="000000">4</font>)).foreach(x&nbsp;<font color="000000">=&gt;</font>&nbsp;accum&nbsp;<font color="000000">+</font><font color="000000">=</font>&nbsp;x) accum.value</pre> <h3>Exemple d&rsquo;application Spark</h3> <p>L&rsquo;exemple couvert dans cet article est une application simple d&eacute;compte de mots. C&rsquo;est l&rsquo;exemple classique que l&rsquo;on pr&eacute;senterait lorsque l&rsquo;on enseigne les traitements big data avec Hadoop. Nous allons effectuer des requ&ecirc;tes d&rsquo;analyse sur un fichier texte. Le fichier texte et le jeu de donn&eacute;es de cet exemple sont de petite taille mais les requ&ecirc;tes Spark sont valables pour des jeux de donn&eacute;es beaucoup plus volumineux, sans modification de code. Pour faire simple, nous utiliserons le Shell Scala. Commen&ccedil;ons par voir comment installer Spark sur une machine locale.</p> <p><strong>Pr&eacute;-requis&nbsp;:</strong></p> <ul> <li>Vous aurez besoin du Java Development Kit (JDK) pour que Spark fonctionne en local. C&rsquo;est la premi&egrave;re &eacute;tape d&eacute;crite plus bas.</li> <li>Vous aurez besoin d&rsquo;installer les applicatifs Spark sur votre machine. Les instructions sont donn&eacute;es dans la deuxi&egrave;me &eacute;tape ci-dessous.</li> </ul> <p><strong>Note&nbsp;:</strong> Ces instructions sont valables en environnement Windows. Si vous utilisez un syst&egrave;me d&rsquo;exploitation diff&eacute;rent, vous devrez adapter les variables syst&egrave;me et les chemins vers les r&eacute;pertoires en fonction de votre environnement.</p> <p><strong>Installation du JDK&nbsp;:</strong> T&eacute;l&eacute;chargez le JDK depuis le site d&rsquo;Oracle, la <a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html">version 1.7</a> est recommand&eacute;e. Choisissez pour l&rsquo;installation du JDK un r&eacute;pertoire sans espaces. Pour les utilisateurs de Windows, choisissez par exemple <code>c:\dev</code>, pas <code>c:\Program Files</code>. V&eacute;rifiez l&rsquo;installation depuis le r&eacute;pertoire bin sous le r&eacute;pertoire JDK 1.7 en tapant la commande <code>java -version</code>. Si l&rsquo;installation est correcte, cette commande doit afficher la version de Java install&eacute;e.</p> <p><strong>Installation des applicatifs Spark&nbsp;:</strong> T&eacute;l&eacute;chargez la derni&egrave;re version depuis le <a href="https://spark.apache.org/downloads.html">site de Spark</a>. La version la plus r&eacute;cente au moment de l&rsquo;&eacute;criture de cet article est la 1.2. Vous pouvez aussi choisir une version sp&eacute;cifique en fonction d&rsquo;une version Hadoop. J&rsquo;ai moi-m&ecirc;me t&eacute;l&eacute;charg&eacute; Spark pour Hadoop 2.4 et le nom du fichier est <code>spark-1.2.0-bin-hadoop2.4.tgz</code>. D&eacute;compressez le fichier dans un r&eacute;pertoire local, comme c:\dev.</p> <p>Pour v&eacute;rifier l&rsquo;installation de Spark, positionnez-vous sur le r&eacute;pertoire de Spark et lancez le Shell avec les commandes suivantes&nbsp;:</p> <pre> <code>c: cd c:\dev\spark-1.2.0-bin-hadoop2.4 bin\spark-shell </code></pre> <p>Si l&rsquo;installation s&rsquo;est bien pass&eacute;e, vous verrez les messages ci-dessous dans la console&nbsp;:</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&eacute;rifier le bon fonctionnement du Shell&nbsp;:</p> <pre> <code>sc.version </code></pre> <p>(ou)</p> <pre> <code>sc.appName </code></pre> <p>Cette &eacute;tape finie, vous pouvez sortir du shell&nbsp;:</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&rsquo;ing&eacute;nierie et l&rsquo;analyse de donn&eacute;es. Vous pouvez ensuite ex&eacute;cuter les commandes suivantes&nbsp;:</p> <pre> <code>c: cd c:\dev\spark-1.2.0-bin-hadoop2.4 bin\pyspark </code></pre> <h2>D&eacute;compte de mots</h2> <p>Une fois Spark install&eacute; et en cours d&rsquo;ex&eacute;cution, vous pouvez ex&eacute;cuter des requ&ecirc;tes d&rsquo;analyse avec l&rsquo;API. Des commandes simples pour lire des donn&eacute;es depuis un fichier texte et les traiter sont disponibles. Nous examinerons des cas d&rsquo;utilisation plus avanc&eacute;s dans les futurs articles de la s&eacute;rie. Commen&ccedil;ons par utiliser l&rsquo;API pour ex&eacute;cuter l&rsquo;exemple connu du d&eacute;compte de mots. Ouvrez un Shell Scala, voici les commandes &agrave; utiliser&nbsp;:</p> <pre> <font color="000000">import</font>&nbsp;<font color="000000">org.apache.spark.</font><font color="000000">SparkContext</font> <font color="000000">import</font>&nbsp;<font color="000000">org.apache.spark.SparkContext.</font><font color="000000">_</font> <font color="000000">val</font>&nbsp;<font color="000000">txtFile</font>&nbsp;<font color="000000">=</font>&nbsp;<font color="000000"><font color="000000">&quot;</font>README.md<font color="000000">&quot;</font></font> <font color="000000">val</font>&nbsp;<font color="000000">txtData</font>&nbsp;<font color="000000">=</font>&nbsp;sc.textFile(txtFile) txtData.cache()</pre> <p>La fonction cache est appel&eacute;e pour stocker les RDD cr&eacute;&eacute;s en cache, de fa&ccedil;on &agrave; ce que Spark n&rsquo;ait pas &agrave; les recalculer &agrave; chaque fois, &agrave; chaque requ&ecirc;te suivante. Notez que cache() est une op&eacute;ration lazy, Spark ne stocke pas la donn&eacute;e imm&eacute;diatement en m&eacute;moire, en fait, ceci sera fait lorsque l&rsquo;action sera invoqu&eacute;e sur un RDD. Maintenant, nous pouvons appeler la fonction count pour voir combien de lignes sont pr&eacute;sentes dans le fichier texte. txtData.count()</p> <p>Les commandes suivantes r&eacute;alisent le d&eacute;compte des mots et affichent le compte &agrave; c&ocirc;t&eacute; de chaque mot pr&eacute;sent dans le fichier.</p> <pre> <font color="000000">val</font>&nbsp;<font color="000000">wcData</font>&nbsp;<font color="000000">=</font>&nbsp;txtData.flatMap(l&nbsp;<font color="000000">=&gt;</font>&nbsp;l.split(<font color="000000"><font color="000000">&quot;</font>&nbsp;<font color="000000">&quot;</font></font>)).map(word&nbsp;<font color="000000">=&gt;</font>&nbsp;(word,&nbsp;<font color="000000">1</font>)).reduceByKey(_&nbsp;<font color="000000">+</font>&nbsp;_) wcData.collect().foreach(println)</pre> <p>D&rsquo;autres exemples d&rsquo;utilisation de l&rsquo;API peuvent &ecirc;tre consult&eacute;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&eacute;rie, nous en apprendrons plus sur d&rsquo;autres parties de l&rsquo;&eacute;cosyst&egrave;me de Spark, en commen&ccedil;ant par Spark SQL. Nous regarderons Spark Streaming, Spark MLlib et Spark GraphX, ainsi que les frameworks &agrave; 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&egrave;re de traitement et d&rsquo;analyse de donn&eacute;es. Nous avons aussi vu comment Spark se positionne par rapport aux impl&eacute;mentations MapReduce traditionnelles comme Apache Hadoop. Spark s&rsquo;appuie sur le m&ecirc;me syst&egrave;me de stockage de fichiers qu&rsquo;Hadoop, il est donc possible d&rsquo;utiliser Spark et Hadoop ensemble dans le cas o&ugrave; des investissements significatifs ont d&eacute;j&agrave; &eacute;t&eacute; 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&acirc;ce &agrave; diff&eacute;rents modes d&rsquo;int&eacute;gration et adaptateurs Spark, vous pouvez combiner Spark avec d&rsquo;autres technologies. Vous pouvez par exemple utiliser ensemble Spark, Kafka et Apache Cassandra ; Kafka pour le streaming de donn&eacute;es entrantes, Spark pour le traitement et la base NoSQL Cassandra pour le stockage des r&eacute;sultats.</p> <p>Gardez cependant &agrave; l&rsquo;esprit que Spark n&rsquo;est pas un &eacute;cosyst&egrave;me encore compl&egrave;tement mature et que celui-ci n&eacute;cessite des am&eacute;liorations dans certains domaines comme la s&eacute;curit&eacute; ou l&rsquo;int&eacute;gration avec des outils de BI.</p> <h2>R&eacute;f&eacute;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&eacute;os et pr&eacute;sentations</a> de la conf&eacute;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&rsquo;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&rsquo;architecte applicatif au sein d&rsquo;une soci&eacute;t&eacute; de services financiers &agrave; Austin au Texas. Il a plus de 20 ans d&rsquo;exp&eacute;rience en architecture, conception et d&eacute;veloppement. Srini &eacute;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">&quot;Spring Roo in Action&quot;</a>, aux &eacute;ditions Manning. Il a &eacute;t&eacute; pr&eacute;sentateur lors de plusieurs conf&eacute;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&eacute; &eacute;galement de nombreux articles sur l&rsquo;architecture, la s&eacute;curit&eacute; et la gestion des risques et les bases NoSQL sur divers sites, tels qu&rsquo;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&eacute; bases de donn&eacute;es NoSQL</a> chez InfoQ.</p> </div> <div id="zoom-container"></div> <input type="hidden" name="" value="Merci d'avoir donn&#xE9; votre avis!" id="cr_messages_submitSuccess"/> <input type="hidden" name="" value="Evaluation n&#xE9;cessaire" id="cr_messages_ratingRequired"/> <input type="hidden" name="" value="Traitements Big Data avec Apache Spark - 1&#xE8;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&#xE9;veloppement</a> </li> <li data-id="12692"> <a href="/fr/architecture-design/" class="button related__topic button__small button__black">Architecture &amp; 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&#xE9;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&#xE8;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("&amp;","&"); $('.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&#xE9; ?</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'&#xE9;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&#xE9;l&#xE9;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&#xE9;es Avec Programmation Fonctionnelle Et Requ&#xEA;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&#xE9; Donn&#xE9;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&#xE8;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&#xE9;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&#039;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&amp;eacute;liore Les Performances De Partage">Docker Desktop 4.6 Pour Mac Am&eacute;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 &amp; 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&amp;eacute;es Avec Programmation Fonctionnelle Et Requ&amp;ecirc;tes Dans Ballerina">Manipulation De Donn&eacute;es Avec Programmation Fonctionnelle Et Requ&ecirc;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&amp;eacute; Donn&amp;eacute;es">Ballerina : Un Langage De Programmation Orient&eacute; Donn&eacute;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 &amp; M&#xE9;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&amp;egrave;re : Impossible Pour Les D&amp;eacute;veloppeurs">La Dette Technique Est Quantifiable En Tant Que Dette Financi&egrave;re : Impossible Pour Les D&eacute;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&#039;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&amp;eacute; Son Experience Sur La Conception De Plate-formes De Donn&amp;eacute;es Distribu&amp;eacute;es">Grab A Partag&eacute; Son Experience Sur La Conception De Plate-formes De Donn&eacute;es Distribu&eacute;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&amp;eacute;veloppe un Nouveau Syst&amp;egrave;me de Language-Vision : VinVL">Microsoft Research D&eacute;veloppe un Nouveau Syst&egrave;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&amp;eacute;dictions De Temps Chez Uber Eats">Les Pr&eacute;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&amp;eacute;s De La &amp;quot;MFA Fatigue&amp;quot; Dont A Ete Victime Uber">Les Facteurs Cl&eacute;s De La &quot;MFA Fatigue&quot; 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&#039;Environnements De D&amp;eacute;veloppement &amp;Agrave; Distance Chez Slack">Adoption D'Environnements De D&eacute;veloppement &Agrave; 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&amp;eacute;locit&amp;eacute; Des D&amp;eacute;veloppeurs">Pourquoi La Gouvernance DevOps Est Cruciale Pour Permettre La V&eacute;locit&eacute; Des D&eacute;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 &#169; 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&#xE8;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 -->

Pages: 1 2 3 4 5 6 7 8 9 10