{"id":284233,"date":"2017-03-31T11:30:02","date_gmt":"2017-03-31T07:30:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=284233"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=284233","title":{"rendered":"\u041c\u0438\u0444\u044b \u043e Spark, \u0438\u043b\u0438 \u041c\u043e\u0436\u0435\u0442 \u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f Spark \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a"},"content":{"rendered":"<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043e\u0431\u043b\u0430\u0433\u043e\u0440\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0445\u0430\u0440\u0434\u043a\u043e\u0440\u043d\u044b\u0435 \u0434\u043e\u043a\u043b\u0430\u0434\u044b \u0441\u043f\u0438\u043a\u0435\u0440\u043e\u0432 JPoint 2016. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u043e\u043c\u0435\u043d\u044c\u0448\u0435, \u0432\u0441\u0435\u0433\u043e \u0447\u0430\u0441 \u0441 \u043a\u043e\u043f\u0435\u0439\u043a\u0430\u043c\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u044b \u0438 \u043e\u0442\u0436\u0438\u0433\u0430 \u043d\u0430 \u043e\u0434\u043d\u0443 \u043c\u0438\u043d\u0443\u0442\u0443 \u0437\u0430\u0448\u043a\u0430\u043b\u0438\u0432\u0430\u0435\u0442. <\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0415\u0432\u0433\u0435\u043d\u0438\u0439 <a href=\"https:\/\/habrahabr.ru\/users\/evgenyborisov\/\" class=\"user_link\">EvgenyBorisov<\/a> \u0411\u043e\u0440\u0438\u0441\u043e\u0432 \u043e Spark, \u043c\u0438\u0444\u0430\u0445 \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u0442\u043e\u043c, \u0434\u0435\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438 \u0442\u0435\u043a\u0441\u0442\u044b Pink Floyd \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u0435\u0435, \u0447\u0435\u043c \u0443 \u041a\u044d\u0442\u0438 \u041f\u044d\u0440\u0440\u0438.  <\/p>\n<hr\/>\n<p>  <\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0px; width: 100%; height: 0px; position: relative; padding-bottom: 56.2493%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/XLSQJQjmFFw?rel=0&amp;showinfo=1\" frameborder=\"0\" allowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" style=\"top: 0px; left: 0px; width: 100%; height: 100%; position: absolute;\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u043e Spark.<br \/>  \u041e\u0431\u044b\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u043e Spark, \u043a\u0430\u043a\u043e\u0439 \u043e\u043d \u043a\u0440\u0443\u0442\u043e\u0439, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043a\u043e\u0434 \u043d\u0430 Scala. \u041d\u043e \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0430\u044f \u0446\u0435\u043b\u044c. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u044e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Spark \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d. \u041d\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u044b, \u043a\u0430\u043a Java-\u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440\u044b, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0412 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u043c\u044b \u0440\u0430\u0437\u0432\u0435\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u0444\u043e\u0432 \u043e Spark.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u041a\u043e\u0440\u043e\u0442\u043a\u043e \u043e \u0441\u0435\u0431\u0435<\/h2>\n<p>  \u042f \u0431\u044b\u043b Java-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u043c \u0441 2001 \u0433\u043e\u0434\u0430.<br \/>  \u041a 2003 \u0433\u043e\u0434\u0443 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0447\u0430\u043b \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u044c.<br \/>  \u0421 2008 \u043d\u0430\u0447\u0430\u043b \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438\u044f\u043c\u0438.<br \/>  \u0421 2009 \u0433\u043e\u0434\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0441\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432.<br \/>  \u0421\u0442\u0430\u0440\u0442\u0430\u043f \u0441\u0432\u043e\u0439 \u043e\u0442\u043a\u0440\u044b\u043b \u0432 2014.<br \/>  \u0421 2015 \u0433\u043e\u0434\u0430 \u044f \u044f\u0432\u043b\u044f\u044e\u0441\u044c technical leader \u043f\u043e Big data \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Naya Technologies, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043d\u0435\u0434\u0440\u044f\u0435\u0442 big data \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u0435\u0442. \u0423 \u043d\u0430\u0441 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u044f\u0442, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u0438\u043c \u043f\u043e\u043c\u043e\u0433\u043b\u0438. \u041d\u0430\u043c \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043b\u044e\u0434\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u043d\u043e\u0432\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0438\u0449\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u043d\u0438\u043a\u043e\u0432.<\/p>\n<h2>\u041c\u0438\u0444\u044b \u043e Spark<\/h2>\n<p>  \u041c\u0438\u0444\u043e\u0432 \u043e Spark \u0445\u043e\u0434\u0438\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e.<\/p>\n<p>  \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0438\u0444\u044b, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435:<\/p>\n<ul>\n<li>\u0447\u0442\u043e Spark \u2014 \u044d\u0442\u043e \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043f\u0440\u0438\u043c\u043e\u0447\u043a\u0430 \u0434\u043b\u044f Hadoop-\u0430. \u041c\u043d\u043e\u0433\u0438\u0435 \u0441\u043b\u044b\u0448\u0430\u043b\u0438, \u0447\u0442\u043e Spark \u0438 Hadoop \u043a\u0430\u043a \u0431\u044b \u0432\u043c\u0435\u0441\u0442\u0435. \u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u043e\u043c, \u0442\u0430\u043a \u043b\u0438 \u044d\u0442\u043e;\n<\/li>\n<li>\u0447\u0442\u043e Spark \u043d\u0430\u0434\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Scala. \u0412\u0441\u0435, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0441\u043b\u044b\u0448\u0430\u043b\u0438, \u0447\u0442\u043e Spark \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 Scala, \u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 Scala, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 API \u0438 \u0442.\u0434. \u041c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043b\u0438 \u044d\u0442\u043e;\n<\/li>\n<li>\u044f \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u043b\u044e Spring \u0438 \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u043d\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043f\u043e\u0441\u0442-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b. \u0411\u0443\u0434\u0443\u0442 \u043b\u0438 \u0437\u0434\u0435\u0441\u044c \u043f\u043e\u0441\u0442-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u0443?\n<\/li>\n<li>\u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c Spark. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 Spark \u2014 big data, \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0430\u043a \u0435\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u0438\u0444, \u0447\u0442\u043e \u0442\u0430\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b, \u0430 \u0435\u0441\u043b\u0438 \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u0448\u044c, \u0442\u043e \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0442\u0430\u043a, \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438.  <\/li>\n<\/ul>\n<p>  \u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u0440\u044f\u0434 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u0438\u0444\u043e\u0432 (\u044d\u0442\u043e \u0434\u043b\u044f \u043b\u044e\u0434\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e Spark \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0435\u0433\u043e \u0437\u043d\u0430\u044e\u0442):<\/p>\n<ul>\n<li>\u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 Broadcast \u2014 \u0447\u0442\u043e \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0435\u0433\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0438\u043d\u0430\u0447\u0435 \u0432\u0441\u0435 \u0433\u0440\u043e\u0445\u043d\u0435\u0442\u0441\u044f. \u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u043e\u043c, \u0442\u0430\u043a \u043b\u0438 \u044d\u0442\u043e.\n<\/li>\n<li>\u043f\u0440\u043e \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u044b \u2014 \u0413\u043e\u0432\u043e\u0440\u044f\u0442, \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \u0441\u0445\u0435\u043c\u0430, \u0430 \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u043e\u043c, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u0438\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445.  <\/li>\n<\/ul>\n<p>  \u0410 \u0441\u0430\u043c\u044b\u0439 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043c\u0438\u0444 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e \u0433\u0440\u0443\u043f\u043f\u0443 Pink Floyd. \u0425\u043e\u0434\u0438\u0442 \u043c\u0438\u0444, \u0447\u0442\u043e Pink Floyd \u043f\u0438\u0448\u0435\u0442 (\u043f\u0438\u0441\u0430\u043b) \u0443\u043c\u043d\u044b\u0435 \u0442\u0435\u043a\u0441\u0442\u044b, \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0442\u0430\u043a\u0438\u0435, \u043a\u0430\u043a \u0411\u0440\u0438\u0442\u043d\u0438 \u0421\u043f\u0438\u0440\u0441 \u0438\u043b\u0438 \u041a\u044d\u0442\u0442\u0438 \u041f\u044d\u0440\u0438. \u0418 \u043c\u044b \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Spark, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u044b \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043c\u0443\u0437\u044b\u043a\u0430\u043d\u0442\u043e\u0432 \u0438 \u0432\u044b\u044f\u0432\u0438\u0442\u044c \u0432 \u043d\u0438\u0445 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0441\u043b\u043e\u0432\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e Pink Floyd \u043f\u0438\u0448\u0435\u0442 \u0442\u0430\u043a\u0443\u044e \u0436\u0435 \u0431\u0435\u043b\u0438\u0431\u0435\u0440\u0434\u0443, \u043a\u0430\u043a \u0438 \u043f\u043e\u043f\u0441\u043e\u0432\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438.<\/p>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043c\u0438\u0444\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043e\u043f\u0440\u043e\u0432\u0435\u0440\u0433\u043d\u0443\u0442\u044c.<\/p>\n<h3>\u041c\u0438\u0444 1. Spark \u0438 Hadoop<\/h3>\n<p>  \u041f\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0441\u0447\u0435\u0442\u0443 Hadoop \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u041f\u043b\u044e\u0441 \u043a \u043d\u0435\u043c\u0443 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 API, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u0442\u044c.<br \/>  \u0412 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 Spark \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 Spark \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 Hadoop, \u0430 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 Hadoop \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 (\u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044f\u0441\u044c \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f), \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Spark.<br \/>  \u0412\u043e\u043f\u0440\u043e\u0441 \u0432 \u0442\u043e\u043c, \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u043b\u0438 Spark \u0432 Hadoop, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c?<\/p>\n<p>  \u0412\u043e\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 Spark:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/4dc\/3f5\/634\/4dc3f5634009923c1e5d5c8f5d3eeecb.png\"\/><\/p>\n<p>  \u0420\u0430\u0437\u0432\u0435 \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0441\u043b\u043e\u0432\u043e Hadoop? \u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u0438 Spark:<\/p>\n<ul>\n<li>Spark Core \u2014 \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 API, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u0442\u044c \u0432\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435;\n<\/li>\n<li>Spark SQL, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c SQL-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u043b\u044e\u0434\u0435\u0439, \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0445 \u0441 SQL (\u043c\u044b \u043f\u0440\u043e \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c, \u0445\u043e\u0440\u043e\u0448\u043e \u044d\u0442\u043e \u0438\u043b\u0438 \u043f\u043b\u043e\u0445\u043e);\n<\/li>\n<li>\u043c\u043e\u0434\u0443\u043b\u044c Machine Learning;\n<\/li>\n<li>Streaming, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Spark \u0438\u043b\u0438 \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0447\u0442\u043e-\u043b\u0438\u0431\u043e.  <\/li>\n<\/ul>\n<p>  \u041d\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0438\u0433\u0434\u0435 \u043d\u0435\u0442 \u0441\u043b\u043e\u0432\u0430 Hadoop.<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e Spark.<br \/>  \u042d\u0442\u0430 \u0438\u0434\u0435\u044f \u0437\u0430\u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0432 \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0435 \u0411\u0435\u0440\u043a\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 2009 \u0433\u043e\u0434\u0443. \u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 \u0432\u044b\u0448\u0435\u043b \u043d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u2014 \u0432 2012. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 2.1.0 (\u043e\u043d\u0430 \u0432\u044b\u0448\u043b\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 2016 \u0433\u043e\u0434\u0430). \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0437\u0432\u0443\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430 \u0431\u044b\u043b\u0430 \u0432\u0435\u0440\u0441\u0438\u044f 1.6.1, \u043d\u043e \u043e\u0431\u0435\u0449\u0430\u043b\u0438 \u0441\u043a\u043e\u0440\u044b\u0439 \u0432\u044b\u0445\u043e\u0434 Spark 2.0, \u0433\u0434\u0435 \u043f\u043e\u0447\u0438\u0441\u0442\u0438\u043b\u0438 API \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043c\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439 (\u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f Spark 2.0 \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0443\u0447\u0442\u0435\u043d\u044b).<\/p>\n<p>  \u041d\u0430\u043f\u0438\u0441\u0430\u043d \u0441\u0430\u043c Spark \u043d\u0430 Scala, \u0447\u0442\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442 \u043c\u0438\u0444 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Spark \u043b\u0443\u0447\u0448\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Scala, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 API. \u041d\u043e \u043f\u043e\u043c\u0438\u043c\u043e Scala API \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u043b\u044f:<\/p>\n<ul>\n<li>Python,  <\/li>\n<li>Java,  <\/li>\n<li>Java 8 (\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e)  <\/li>\n<li>\u0438 R (\u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442).  <\/li>\n<\/ul>\n<p>  \u041f\u0438\u0441\u0430\u0442\u044c Spark \u043c\u043e\u0436\u043d\u043e \u0432 InteliJ, \u0447\u0442\u043e \u044f \u0438 \u0431\u0443\u0434\u0443 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u043e\u043a\u043b\u0430\u0434\u0430. \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Eclipse, \u0438 \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0448\u0442\u0443\u043a\u0438 \u0434\u043b\u044f Spark \u2014 \u044d\u0442\u043e Spark-shell, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0435\u0439\u0447\u0430\u0441 \u0438\u0434\u0435\u0442 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 Hadoop, \u0433\u0434\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432 \u0436\u0438\u0432\u0443\u044e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b Spark \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 \u043d\u0435\u0433\u043e Notebooks \u2014 \u0442\u0430\u043c \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0434\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. <\/p>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c Spark \u043c\u043e\u0436\u043d\u043e \u0432 Spark-shell \u0438 Notebooks \u2014 \u0442\u0430\u043c \u043e\u043d \u0432\u0441\u0442\u0440\u043e\u0435\u043d; \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b Spark-submit \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Spark-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u044d\u0442\u043e \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Java-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 (java -jaar \u0438 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f main \u0438 \u0433\u0434\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0432\u0430\u0448 \u043a\u043e\u0434). \u041c\u044b \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0431\u0443\u0434\u0435\u043c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c Spark. \u0414\u043b\u044f \u0442\u0435\u0445 \u0437\u0430\u0434\u0430\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u0440\u0435\u0448\u0438\u0442\u044c, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041d\u043e \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u0431\u044b cluster manager. \u042d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e Spark. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0430\u0441\u0442\u043e \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u00a0\u0438\u043b\u043b\u044e\u0437\u0438\u044f, \u0447\u0442\u043e \u0431\u0435\u0437 Hadoop \u043d\u0438\u043a\u0430\u043a, \u0442.\u043a. \u0432 Hadoop \u0435\u0441\u0442\u044c Yarn \u2014 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 Spark \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443. \u041d\u043e \u0435\u0441\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 Mesos \u2014 \u043a\u043b\u0430\u0441\u0442\u0435\u0440-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a Hadoop. \u041e\u043d \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0430\u0432\u043d\u043e, \u0438 \u043e\u043a\u043e\u043b\u043e \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u043e\u043d\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 70 \u043c\u043b\u043d \u0434\u043e\u043b\u043b\u0430\u0440\u043e\u0432, \u0447\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0445\u043e\u0440\u043e\u0448\u0435\u043c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043a\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043d\u0435 \u043b\u044e\u0431\u0438\u0442 Hadoop, \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 Spark \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0431\u0435\u0437 Yarn \u0438 Hadoop.<\/p>\n<p>  \u0421\u043a\u0430\u0436\u0443 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0434\u0432\u0430 \u0441\u043b\u043e\u0432\u0430 \u043f\u0440\u043e data locality. \u0412 \u0447\u0435\u043c \u0438\u0434\u0435\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 big data, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0435 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0430 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0438\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435?<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u0434, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 jdbc \u0438\u043b\u0438 ORM, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442? \u0415\u0441\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 Java-\u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0438 \u043a\u043e\u0433\u0434\u0430 \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0431\u0435\u0436\u0438\u0442 \u043a\u043e\u0434, \u043e\u0431\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0411\u0414 \u0438 \u043f\u0435\u0440\u0435\u0433\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u0443\u0434\u0430, \u0433\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 Java-\u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u0440\u043e big data, \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u2014 \u044d\u0442\u043e \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438 \u0443 \u043d\u0430\u0441 \u00a0\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0433\u043e\u0440\u043b\u044b\u0448\u043a\u043e \u0431\u0443\u0442\u044b\u043b\u043a\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, data \u0438 \u0442\u0430\u043a \u0443\u0436\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0438 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0430\u0448\u0438\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u043d\u0435 data \u0442\u044f\u043d\u0443\u0442\u044c \u043a \u044d\u0442\u043e\u043c\u0443 \u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443, \u0430 \u043a\u043e\u0434 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043d\u0430 \u0442\u0435 \u043c\u0430\u0448\u0438\u043d\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u044d\u0442\u0443 \u00ab\u0434\u0430\u0442\u0443\u00bb \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u043c\u043d\u043e\u0433\u0438\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445, \u043c\u044b \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u043c \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0438 \u0432\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043a\u043b\u0430\u0441\u0442\u0435\u0440-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b. <\/p>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u043a\u0430\u043a \u0432\u0441\u0435 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043c\u0438\u0440\u0435 Spark.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/273\/74c\/9ac\/27374c9acabcdb78000c60175852f048.png\"\/><\/p>\n<p>  \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c Driver \u2014 \u043d\u0430\u0448 main, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 (\u043d\u0435 \u0438\u043c\u0435\u044e\u0449\u0435\u0439 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443). \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u0430\u0431\u043c\u0438\u0442\u0438\u043c \u043d\u0430\u0448\u0435 Spark-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043c\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a Yarn, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c. \u041c\u044b \u0435\u043c\u0443 \u0433\u043e\u0432\u043e\u0440\u0438\u043c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e worker-\u043e\u0432 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043d\u0430\u0448 Java-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 3). \u041e\u043d \u0438\u0437 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043e\u0434\u043d\u0443 \u043c\u0430\u0448\u0438\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f Application Master. \u0415\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u0434 \u0438 \u043d\u0430\u0439\u0442\u0438 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0442\u0440\u0438 \u043c\u0430\u0448\u0438\u043d\u044b \u0434\u043b\u044f \u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u041d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0442\u0440\u0438 \u043c\u0430\u0448\u0438\u043d\u044b, \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0442\u0440\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 Java-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 (\u0442\u0440\u0438 executor-\u0430), \u0433\u0434\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0448 \u043a\u043e\u0434. \u041f\u043e\u0442\u043e\u043c \u044d\u0442\u043e \u0432\u0441\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f Application Master, \u0438 \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u0442\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0430 Driver, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 big data \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0442\u0443\u0434\u0430, \u043e\u0442\u043a\u0443\u0434\u0430 \u043a\u043e\u0434 \u0432\u044b\u0448\u0435\u043b.<\/p>\n<p>  \u042d\u0442\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u043e \u0447\u0435\u043c \u044f \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0431\u0443\u0434\u0443 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c. \u041f\u0440\u043e\u0441\u0442\u043e \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a Spark \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 Cluster Manager (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441 Yarn) \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b \u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445 (\u0440\u0430\u0437\u0432\u0435 \u0447\u0442\u043e \u0432 \u0434\u0435\u043d\u0435\u0436\u043d\u044b\u0445 \u2014 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u043c\u0430\u0448\u0438\u043d, \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0442.\u0434.). \u042d\u0442\u043e \u0432\u0441\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 MapReduce \u2014 \u0441\u0442\u0430\u0440\u044b\u0439 API, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0432 Hadoop (\u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043e\u043d \u0435\u0441\u0442\u044c \u0438 \u0441\u0435\u0439\u0447\u0430\u0441), \u0441 \u0442\u043e\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e\u0442 API \u043f\u0438\u0441\u0430\u043b\u0441\u044f, \u043c\u0430\u0448\u0438\u043d\u044b \u0431\u044b\u043b\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u044b\u043c\u0438, \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0434\u0438\u0441\u043a\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0435\u0441\u0442\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u043e\u0433\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b\u0438 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u043c MapReduce \u0438 \u043e\u043d \u0431\u0435\u0436\u0430\u043b \u0432 \u0440\u0430\u0439\u043e\u043d\u0435 2,5 \u0447\u0430\u0441\u043e\u0432. \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 1,5 \u043c\u0438\u043d\u0443\u0442\u044b \u043d\u0430 Spark, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 Spark \u0445\u0440\u0430\u043d\u0438\u0442 \u0432\u0441\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u2014 \u00a0\u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f. <\/p>\n<p>  \u041e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u0438\u0448\u0438\u0442\u0435 \u043a\u043e\u0434, \u0447\u0442\u043e \u043e\u0434\u043d\u0430 \u0435\u0433\u043e \u0447\u0430\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435, \u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u2014 \u043d\u0430 Driver-\u0435. \u0423 \u043b\u044e\u0434\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442, \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u044f\u043a\u0438\u0435 OutOfMemory \u0438 \u0442.\u0434. (\u043c\u044b \u043f\u0440\u043e \u044d\u0442\u043e \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u2014 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u044d\u0442\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a).<\/p>\n<p>  \u0418\u0442\u0430\u043a, Spark\u2026 \u043f\u043e\u0435\u0445\u0430\u043b\u0438<\/p>\n<p>  RDD (resilient distributed dataset) \u2014 \u044d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0435\u0441\u044c Spark.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/389\/22c\/216\/38922c216ba4a7d882563aa1069e2779.png\"\/><\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u0430 dataset \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 (Collection). \u0423 \u043d\u0435\u0433\u043e API \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 Stream. \u041f\u043e \u0441\u0443\u0442\u0438, \u043a\u0430\u043a \u0438 Stream, \u043e\u043d \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043d\u0435\u043a\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0435\u0439 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0449\u0451 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c\u0438) \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0430 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0441\u044f\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Stream, RDD \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e Distributed \u2014 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 RDD, \u0430 \u043d\u0430 \u0442\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0430\u0448\u0438\u043d, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 Spark \u043c\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>  Resilient \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0433\u043e \u043d\u0435 \u0443\u0431\u044c\u0435\u0448\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043c\u0430\u0448\u0438\u043d\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b\u0430\u0441\u044c (\u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043c \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0440\u0443\u0431\u0438\u043b\u0438 \u0441\u0432\u0435\u0442), \u043a\u043b\u0430\u0441\u0442\u0435\u0440-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u0438 \u043f\u0435\u0440\u0435\u0434\u0438\u043f\u043b\u043e\u0438\u0442\u044c \u0442\u0443\u0434\u0430 java-\u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0438 RDD \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f. \u041c\u044b \u0434\u0430\u0436\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043f\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u043c. <br \/>  \u041e\u0442\u043a\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c RDD?<\/p>\n<ul>\n<li>\u0441\u0430\u043c\u044b\u0439 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430. \u042f \u043c\u043e\u0433\u0443 \u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0444\u0430\u0439\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c RDD (\u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0434\u043b\u044f Stream \u043d\u0443\u0436\u0435\u043d \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445);\n<\/li>\n<li>\u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u2014 \u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e collection \u0438\u043b\u0438 list. \u042d\u0442\u043e \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 RDD \u0441 \u043a\u0430\u043a\u0438\u043c\u0438-\u0442\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043e\u0442\u0434\u0430\u0435\u0442 RDD \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u041a\u043e\u0433\u0434\u0430 \u044f \u044d\u0442\u043e \u0431\u0443\u0434\u0443 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u044f \u043d\u0435 \u0437\u0430\u0445\u043e\u0447\u0443 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0441 \u0434\u0438\u0441\u043a\u0430 \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u041c\u043d\u0435 \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u0441\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e collection. \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 collection \u0432 RDD \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441;\n<\/li>\n<li>\u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e RDD \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0441\u0442\u0440\u0438\u043c\u044b. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0441\u0442\u0440\u0438\u043c\u043e\u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 stream \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u2014 \u0432\u0441\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435.  <\/li>\n<\/ul>\n<p>  \u0412\u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u043a\u0430\u043a \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c RDD:<\/p>\n<pre><code class=\"java\">\/\/ from local file system JavaRDD&lt;String&gt; rdd = sc.textFile(&quot;file:\/home\/data\/data.txt&quot;); \/\/ from Hadoop using relative path of user, who run spark application rdd = sc.textFile(&quot;\/data\/data.txt&quot;) \/\/ from hadoop rdd = sc.textFile(&quot;hdfs:\/\/data\/data.txt&quot;) \/\/ all files from directory rdd = sc.textFile(&quot;s3:\/\/data\/*&quot;) \/\/ all txt files from directory rdd = sc.textFile(&quot;s3:\/\/data\/*.txt&quot;) <\/code><\/pre>\n<p>  \u041c\u044b \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u043e\u0431\u0441\u0443\u0434\u0438\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 sc (\u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 Spark). \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c RDD:<\/p>\n<ul>\n<li>\u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 (\u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a Hadoop \u0442\u0443\u0442 \u043d\u0435\u0442);\n<\/li>\n<li>\u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u043f\u043e \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u043c\u0443 \u043f\u0443\u0442\u0438;\n<\/li>\n<li>\u0441 Hadoop-\u0430 \u2014 \u0442\u0443\u0442 \u044f \u0431\u0435\u0440\u0443 \u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 Hadoop. \u041e\u043d \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0440\u0430\u0437\u0431\u0438\u0442 \u043d\u0430 \u043a\u0443\u0441\u043a\u0438, \u043d\u043e \u043e\u043d \u0441\u043e\u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d RDD. \u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e RDD \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u0435\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445, \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u044d\u0442\u0430 data;\n<\/li>\n<li>\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441 s3 storage, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u044f\u043a\u0438\u0435 wildcard \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 data.  <\/li>\n<\/ul>\n<p>  \u0427\u0442\u043e \u0432 \u044d\u0442\u043e\u043c RDD \u0431\u0443\u0434\u0435\u0442? \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e RDD  (\u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0435\u0441\u0442\u044c string). \u041f\u0440\u0438\u0447\u0435\u043c, \u043d\u0435 \u0432\u0430\u0436\u043d\u043e, \u0441\u043e\u0437\u0434\u0430\u043b \u044f RDD \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 (\u044d\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430) \u0438\u043b\u0438 \u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 (\u044d\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u044d\u0442\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438).<\/p>\n<p>  \u0422\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f RDD \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cf1\/d77\/acf\/cf1d77acfa9838dedcd05939915b22ca.png\"\/><\/p>\n<p>  \u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 parallelize, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 list \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 RDD. <\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043c \u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0443, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 sc, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f RDD. \u0415\u0441\u043b\u0438 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441\u043e Scala, \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f SparkContext. \u0412 \u043c\u0438\u0440\u0435 Java API \u043e\u043d \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f JavaSparkContext. \u042d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441\u043e Spark, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0442\u0442\u0443\u0434\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c RDD.<br \/>  \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 Spark-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0430 Java:<\/p>\n<pre><code class=\"java\">SparkConf conf = new SparkConf(); conf.setAppName(&quot;my spark application&quot;); conf.setMaster(&quot;local[*]&quot;); JavaSparkContext sc = new JavaSparkContext(conf); <\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 Spark-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043e\u043d \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f (\u0432\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435, \u043a\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435), \u0434\u0430\u043b\u0435\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043c\u044b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438\u043b\u0438 \u043d\u0435\u0442 (\u0437\u0432\u0435\u0437\u0434\u043e\u0447\u043a\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0439\u0434\u0435\u0448\u044c thread-\u043e\u0432, \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c; \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c 1, 2 \u0438 \u0442.\u0434.). \u0418 \u043f\u043e\u0442\u043e\u043c \u044f \u0441\u043e\u0437\u0434\u0430\u044e JavaSparkContext \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e \u0441\u044e\u0434\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e.<\/p>\n<p>  \u0422\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: \u0430 \u043a\u0430\u043a \u0436\u0435 \u0432\u0441\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c? \u0415\u0441\u043b\u0438 \u044f SparkContext \u0441\u043e\u0437\u0434\u0430\u044e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e \u0435\u043c\u0443 \u0441\u044e\u0434\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u044d\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. \u041c\u043d\u0435 \u043d\u0430\u0434\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0437\u0434\u0435\u0441\u044c \u0443 \u043c\u0435\u043d\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Spark-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0434\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0448\u0438\u043d, \u043a\u0442\u043e \u0443 \u043d\u0430\u0441 \u043c\u0430\u0441\u0442\u0435\u0440, \u043a\u0442\u043e \u0443 \u043d\u0430\u0441 \u043a\u043b\u0430\u0441\u0442\u0435\u0440-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435). \u042f \u043d\u0435 \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0437\u0434\u0435\u0441\u044c \u0431\u044b\u043b\u0430; \u044f \u0445\u043e\u0447\u0443 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e application name.<\/p>\n<p>  \u0418 \u0442\u0443\u0442 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 Spring: \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0434\u0432\u0430 bean-\u0430. \u041e\u0434\u0438\u043d \u0443 \u043d\u0430\u0441 \u043f\u043e\u0434 \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u043c production (\u043e\u043d \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u043e \u0442\u043e\u043c, \u043a\u0442\u043e \u0443 \u043d\u0430\u0441 \u043c\u0430\u0441\u0442\u0435\u0440, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0448\u0438\u043d \u0438 \u0442.\u0434.), \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434 \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u043c local (\u0438 \u0437\u0434\u0435\u0441\u044c \u044f \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u044e; \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c). \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d bean \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u0437 SparkContext, \u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d \u2014 \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<pre><code class=\"java\">@Bean @Profile(&quot;LOCAL&quot;) public JavaSparkContext sc() { SparkConf conf = new SparkConf(); conf.setAppName(&quot;music analyst&quot;); conf.setMaster(&quot;local[1]&quot;); return new JavaSparkContext(conf); } @Bean @Profile(&quot;PROD&quot;) public JavaSparkContext sc() { SparkConf conf = new SparkConf(); conf.setAppName(&quot;music analyst&quot;); return new JavaSparkContext(conf); } <\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0441\u0442\u044c \u0443 RDD.<\/p>\n<pre><code class=\"java\">map flatMap filter mapPartitions, mapPartitionsWithIndex sample union, intersection, join, cogroup, cartesian (otherDataset) distinct reduceByKey, aggregateByKey, sortByKey pipe coalesce, repartition, repartitionAndSortWithinPartitions <\/code><\/pre>\n<p>  \u041e\u043d\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Stream: \u0442\u043e\u0436\u0435 \u0432\u0441\u0435 Immutable, \u0442\u043e\u0436\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 RDD (\u0432 \u043c\u0438\u0440\u0435 Stream \u044d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u043b\u043e\u0441\u044c intermediate operations, \u0430 \u0442\u0443\u0442 \u2014 transformations). \u0412 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c Actions (\u0432 \u043c\u0438\u0440\u0435 Stream-\u043e\u0432 \u044d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u043b\u043e\u0441\u044c terminal operations).<\/p>\n<pre><code class=\"java\">reduce collect count, countByKey, countByValue  first take, takeSample, takeOrdered saveAsTextFile, saveAsSequenceFile, saveAsObjectFile foreach <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0447\u0442\u043e Action, \u0430 \u0447\u0442\u043e Transformation? \u041a\u0430\u043a \u0438 \u0432 \u0441\u0442\u0440\u0438\u043c\u0430\u0445, \u0435\u0441\u043b\u0438 RDD-\u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 RDD, \u044d\u0442\u043e Transformation. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u044d\u0442\u043e Action.<\/p>\n<p>  Action \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0443\u0445 \u0432\u0438\u0434\u043e\u0432:<\/p>\n<ul>\n<li>\u0442\u0435, \u0447\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043d\u0435\u0447\u0442\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 Driver (\u0432\u0430\u0436\u043d\u043e \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435; \u043e\u0442\u0432\u0435\u0442 \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f \u043d\u0430 Driver). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, reduce \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u0430\u043a \u043d\u0430\u0434\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0438 \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u043e\u0442\u0432\u0435\u0442 (\u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0434\u0438\u043d);\n<\/li>\n<li>\u0442\u0435, \u0447\u0442\u043e \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 Driver. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u0442\u043e\u0442 \u0436\u0435 Hadoop \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 storage (\u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 saveAsTextFile).  <\/li>\n<\/ul>\n<p>  \u041a\u0430\u043a \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e27\/0c6\/aa7\/e270c6aa71a2ddb610ac56458d696aed.png\"\/><\/p>\n<p>  \u042d\u0442\u0430 \u0441\u0445\u0435\u043c\u0430 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0441\u0442\u0440\u0438\u043c\u044b, \u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043d\u044e\u0430\u043d\u0441. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0430\u044f-\u0442\u043e data, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0432 s3 storage. \u042f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 SparkContext \u0441\u043e\u0437\u0434\u0430\u043b \u0441\u0432\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 RDD1. \u041f\u043e\u0442\u043e\u043c \u044f \u0434\u0435\u043b\u0430\u044e \u0432\u0441\u044f\u043a\u0438\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043d\u0435 RDD. \u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e Action \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u0443 (\u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b, \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u0430\u043b \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u043b\u0430\u043b \u0442\u043e, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c). \u042d\u0442\u043e\u0442 \u043a\u0443\u0441\u043e\u043a, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 (\u0432\u0441\u0435 RDD-\u043c\u0435\u0442\u043e\u0434\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435). \u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043a\u0443\u0441\u043e\u0447\u0435\u043a \u0432 \u043a\u043e\u043d\u0446\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0430 Driver \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0438\u0442\u043e\u0433\u043e\u043c \u0441\u0442\u0430\u043d\u0435\u0442 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u0442\u0432\u0435\u0442. \u0412\u0441\u0435, \u0447\u0442\u043e \u0441\u043b\u0435\u0432\u0430 \u043e\u0442 Data (\u0442.\u0435. \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044f \u043d\u0430\u0447\u0430\u043b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u0434\u043e\u043c Spark) \u2014 \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0430 Driver, \u0430 \u043d\u0435 \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435.<br \/>  \u0412\u0441\u0435 \u044d\u0442\u043e Lazy \u2014 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0432 \u0441\u0442\u0440\u0438\u043c\u0430\u0445. \u041a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 RDD, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442, \u0430 \u0436\u0434\u0435\u0442 Action. \u041a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 Action, \u0432\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f. \u0418 \u0442\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: \u0430 \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u043e\u0442 \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435?<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/12f\/42c\/a4a\/12f42ca4ae164684c9ca66b49782a263.png\"\/><\/p>\n<p>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u043c\u043e\u044f data \u2014 \u044d\u0442\u043e \u0432\u0441\u0435 \u0434\u0435\u043d\u0435\u0436\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 5 \u043b\u0435\u0442 \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u0431\u0430\u043d\u043a\u0435. \u0418 \u043c\u043d\u0435 \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u0438\u043d\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u043e\u043d\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f: \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043c\u0443\u0436\u0447\u0438\u043d \u044f \u0445\u043e\u0447\u0443 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u0438\u043d Action, \u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0436\u0435\u043d\u0449\u0438\u043d \u2014 \u0434\u0440\u0443\u0433\u043e\u0439. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443 \u043c\u0435\u043d\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0437\u0430\u0439\u043c\u0435\u0442 10 \u043c\u0438\u043d\u0443\u0442. \u0412\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043f\u043e \u043c\u0438\u043d\u0443\u0442\u0435. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0443 \u043d\u0430\u0441 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u0443\u043c\u043c\u0435 12 \u043c\u0438\u043d\u0443\u0442?<\/p>\n<p>  \u041d\u0435\u0442, \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f 22 \u043c\u0438\u043d\u0443\u0442\u044b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e Lazy \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f Action, \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0431\u0449\u0438\u0439 \u043a\u0443\u0441\u043e\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e 2 \u0440\u0430\u0437\u0430, \u043d\u043e \u0435\u0441\u043b\u0438 \u0431\u044b \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e 15 \u0440\u0430\u0437\u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439?<\/p>\n<p>  \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0431\u044c\u0451\u0442 \u043f\u043e \u043f\u0435\u0440\u0444\u043e\u0440\u043c\u0430\u043d\u0441\u0443. \u0412 \u043c\u0438\u0440\u0435 Spark \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043b\u044e\u0434\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u041d\u043e \u0435\u0440\u0443\u043d\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434, \u043d\u0430\u0434\u043e \u0437\u043d\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u0427\u0442\u043e\u0431\u044b \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0432 \u0441\u0442\u0440\u0438\u043c\u0430\u0445? \u0421\u0434\u0435\u043b\u0430\u043b\u0438 \u0431\u044b \u043a\u0430\u043a\u043e\u0439-\u0442\u043e collect, \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u044d\u0442\u043e \u0432\u0441\u0435 \u0432 collection, \u0430 \u043f\u043e\u0442\u043e\u043c \u0438\u0437 \u043d\u0435\u0435 \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043b\u0438 \u0431\u044b \u0441\u0442\u0440\u0438\u043c\u044b.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/0af\/5f6\/79f\/0af5f679f99e6e2f9093274ab0a5df5d.png\"\/><\/p>\n<p>  \u0412 GetTaxi \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438, \u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/6c9\/e95\/dfe\/6c9e95dfe8e38bf032e9c7f765085ef8.png\"\/><\/p>\n<p>  \u041f\u0440\u0438\u0447\u0435\u043c, \u043e\u043d\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u0434\u043e\u043a\u0443\u043f\u0438\u0442\u044c \u0435\u0449\u0435 \u043c\u0430\u0448\u0438\u043d \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u0431\u044b\u043b\u043e 40 \u0448\u0442\u0443\u043a \u0438 \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e 20 \u0434\u0436\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438.<br \/>  \u041d\u0430\u0434\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c: \u0435\u0441\u043b\u0438 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u0440\u043e big data, \u0432 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 collect, \u0432\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0438\u0437 \u0432\u0441\u0435\u0445 RDD \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0432\u0430\u043c \u043d\u0430 Driver. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0436\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u044b \u0438 \u043c\u0430\u0448\u0438\u043d\u044b \u0438\u043c \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442: \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 collect, \u0432\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0441\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e \u043c\u0435\u0441\u0442\u043e, \u043e\u0442\u043a\u0443\u0434\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f out of memory.<\/p>\n<p>  \u041a\u0430\u043a \u0440\u0435\u0448\u0430\u0435\u043c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 (\u0434\u0432\u0430\u0436\u0434\u044b \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0442\u044c \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f, 15 \u2014 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0430 collect \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f)? \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 Spark \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 persist:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/03f\/6ce\/48e\/03f6ce48e2aba1bec7cb0df87f6997fc.png\"\/><\/p>\n<p>  Persist \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c state RDD, \u043f\u0440\u0438\u0447\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c, \u043a\u0443\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c. \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u043e. \u0421\u0430\u043c\u044b\u0439 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u2014 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c (\u0435\u0441\u0442\u044c memory only, \u0430 \u0435\u0441\u0442\u044c memory only 2 \u2014 \u0441 \u0434\u0432\u0443\u043c\u044f \u0431\u0435\u043a\u0430\u043f\u0430\u043c\u0438). \u041c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 custom storage \u0438 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c. \u041c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c memory and disk \u2014 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u043d\u043e \u0435\u0441\u043b\u0438 \u0443 \u0434\u0430\u043d\u043d\u043e\u0433\u043e worker (\u0443 \u043c\u0430\u0448\u0438\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044d\u0442\u043e\u0442 RDD \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442) \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0430 \u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u0441\u0431\u0440\u043e\u0441\u044f\u0442\u0441\u044f \u043d\u0430 \u0434\u0438\u0441\u043a. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u043b\u044e\u0441\u044b \u0438 \u043c\u0438\u043d\u0443\u0441\u044b, \u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0435\u0441\u0442\u044c, \u0438 \u044d\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e.<\/p>\n<p>  \u041c\u044b \u043f\u043e\u0431\u0435\u0434\u0438\u043b\u0438 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. Persist \u2014 \u044d\u0442\u043e \u043d\u0435 action. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 action, persist \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e. \u041a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0439 action, \u0432\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 RDD \u043f\u0435\u0440\u0441\u0438\u0441\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u0432\u0441\u0435 \u043c\u0430\u0448\u0438\u043d\u044b, \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f data. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c action RDD6, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0443\u0436\u0435 \u0441 persist (\u0435\u0441\u043b\u0438 \u0431\u044b \u0431\u044b\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f, \u0442\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u043b\u0438 \u0431\u044b \u0441 \u0442\u043e\u0447\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u00ab\u0437\u0430\u043f\u043e\u043c\u043d\u0438\u043b\u0438\u00bb \u0438\u043b\u0438 \u00ab\u043f\u043e\u043c\u0435\u0442\u0438\u043b\u0438\u00bb persist).<\/p>\n<h3>\u041c\u0438\u0444 2. Spark \u043f\u0438\u0448\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 Scala<\/h3>\n<p>  Spark \u2014 \u0437\u0434\u043e\u0440\u043e\u0432\u043e, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0430\u0436\u0435 \u0434\u043b\u044f \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0443\u0436\u0434, \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f big data. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e API \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043e\u043d \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0439). \u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441: \u043d\u0430 \u0447\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c? Python \u0438 R \u044f \u043e\u0442\u043c\u0435\u043b \u0441\u0440\u0430\u0437\u0443. \u0411\u0443\u0434\u0435\u043c \u0432\u044b\u044f\u0441\u043d\u044f\u0442\u044c: Scala \u0438\u043b\u0438 Java?<br \/>  \u0427\u0442\u043e \u0434\u0443\u043c\u0430\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Java-\u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440 \u043e Scala?<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/3f0\/7fe\/71d\/3f07fe71db379b9f820d728028c49eb8.png\"\/><\/p>\n<p>  \u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 Java-\u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440 \u0432\u0438\u0434\u0438\u0442 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435.<br \/>  \u041e\u043d \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e play, \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438, \u043b\u044f\u043c\u0431\u0434\u044b \u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u043e\u0433\u043e.<\/p>\n<p>  \u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043f\u043e\u043f\u0443? \u0412\u043e\u0442 \u043e\u043d\u0430. \u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u043e\u0434 \u043d\u0430 Scala.<\/p>\n<pre><code>val lines = sc.textFile(&quot;data.txt&quot;) val lineLengths = lines.map(_.length) val totalLength = lineLengths.reduce(_+_) <\/code><\/pre>\n<p>  \u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0432 API Scala, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u043e\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u2014 \u0443\u0431\u0435\u0434\u0438\u0442\u044c \u0432\u0430\u0441, \u0447\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Java \u043d\u0438\u0447\u0443\u0442\u044c \u043d\u0435 \u0445\u0443\u0436\u0435, \u043d\u043e \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u043b\u0438\u043d\u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u043e.<br \/>  \u041e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0442\u0438\u0432 Java \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 Java \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">JavaRDD&lt;String&gt; lines = sc.textFile(&quot;data.txt&quot;); JavaRDD&lt;Integer&gt; lineLengths = lines.map(new Function&lt;String, Integer&gt;() { @Override public Integer call(String lines) throws Exception { return lines.length(); } }); Integer totalLength = lineLengths.reduce(new Function2&lt;Integer, Integer, Integer&gt;() { @Override public Integer call(Integer a, Integer b) throws Exception { return a + b; } }); <\/code><\/pre>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u044f \u043d\u0430\u0447\u0438\u043d\u0430\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043d\u0430\u0447\u0430\u043b\u044c\u0441\u0442\u0432\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u043b\u043e, \u0443\u0432\u0435\u0440\u0435\u043d \u043b\u0438 \u044f? \u0412\u0435\u0434\u044c \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c, \u043a\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435. \u041d\u043e \u044d\u0442\u043e \u0432\u0441\u0435 \u043b\u043e\u0436\u044c. \u0421\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>val lines = sc.textFile(&quot;data.txt&quot;) val lineLengths = lines.map(_.length) val totalLength = lineLengths.reduce(_+_) <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"java\">JavaRDD&lt;String&gt; lines = sc.textFile(&quot;data.txt&quot;); JavaRDD&lt;Integer&gt; lineLengths = lines.map(String::length); int totalLength = lineLengths.reduce((a, b) -&gt; a + b); <\/code><\/pre>\n<p>  \u0412\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u0441\u0438\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043c\u0435\u0436\u0434\u0443 Scala \u0438 Java 8? \u041c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0434\u043b\u044f Java-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e. \u041d\u043e \u0434\u0430\u0436\u0435 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 Java 8, \u043c\u044b \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043c \u043a \u043c\u0438\u0444\u0443, \u0447\u0442\u043e Spark \u043d\u0430\u0434\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Scala. \u0427\u0435\u043c \u043b\u044e\u0434\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u043d\u0430\u044e\u0442, \u0447\u0442\u043e \u0432 Java 8 \u0432\u0441\u0435 \u043d\u0435 \u0442\u0430\u043a \u043f\u043b\u043e\u0445\u043e, \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0442, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Scala?<\/p>\n<p>  \u0417\u0430 Scala:<\/p>\n<ul>\n<li>Scala \u2014 \u044d\u0442\u043e \u043a\u0440\u0443\u0442\u043e, \u0445\u0438\u043f\u0441\u0442\u0435\u0440\u043d\u043e, \u043c\u043e\u0434\u043d\u043e, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u043d\u0430\u0434\u043e \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0432\u043f\u0435\u0440\u0435\u0434. \u041d\u0430\u0444\u0438\u0433 \u044d\u0442\u043e\u0442 Groovy, \u0432 Scala \u0432\u0441\u0435 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u0435\u0435;\n<\/li>\n<li>Scala \u2014 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441. \u0422\u0430\u043c \u0435\u0441\u0442\u044c \u043f\u043e\u043f\u0430;\n<\/li>\n<li>Spark API, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Scala, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u0442\u043e\u0447\u0435\u043d \u043f\u043e\u0434 Scala. \u042d\u0442\u043e \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0439 \u043f\u043b\u044e\u0441;\n<\/li>\n<li>Java API \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0435\u0433\u043e \u043f\u043e\u0434\u043f\u0438\u043b\u0438\u0432\u0430\u0442\u044c, \u043f\u043e\u0434\u0434\u0435\u043b\u044b\u0432\u0430\u0442\u044c. \u0422\u0430\u043c \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0441\u0435 \u0435\u0441\u0442\u044c.  <\/li>\n<\/ul>\n<p>  \u0417\u0430 Java:<\/p>\n<ul>\n<li>\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e Java-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u0437\u043d\u0430\u0435\u0442 Java. \u042d\u0442\u0438 \u043b\u044e\u0434\u0438 \u043d\u0435 \u0437\u043d\u0430\u044e\u0442 Scala. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\u0445 \u043a\u0443\u0447\u0430 Java-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0441 Java \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c. \u0414\u0430\u0432\u0430\u0442\u044c \u0438\u043c Scala, \u0447\u0442\u043e\u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c Spark? \u041d\u0435\u0442;\n<\/li>\n<li>\u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043c\u0438\u0440 \u2014 \u0435\u0441\u0442\u044c Spring, \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, Maven \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043b\u0443\u0447\u0448\u0435 \u2014 Gradle, \u0441\u0438\u043d\u0433\u043b\u0435\u0442\u043e\u043d\u044b \u0438 \u0442.\u0434. \u041c\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u0442\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0410 Scala \u2014 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439. \u0412 Scala \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f, \u0442.\u043a. \u0442\u0430\u043c \u0432\u0441\u0435 \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443.  <\/li>\n<\/ul>\n<p>  \u041f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 Java \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u043b\u0443\u0447\u0448\u0435? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043b\u044e\u0431\u0438\u043c Scala, \u043d\u043e \u0434\u0435\u043d\u044c\u0433\u0438 \u0432 Java. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/9d7\/1ec\/411\/9d71ec411c7f24dfad6fe5e9d1380f6e.png\"\/><\/p>\n<p>  \u041f\u043e\u0441\u043b\u0443\u0448\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u043a\u0430\u0441\u0442 \u2014 <a href=\"http:\/\/razbor-poletov.com\/2016\/08\/episode-114.html\">\u0412\u044b\u043f\u0443\u0441\u043a 104<\/a> \u2014 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u044e\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e.<\/p>\n<p>  \u042f \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443.<br \/>  \u0413\u043e\u0434 \u043d\u0430\u0437\u0430\u0434 Martin Odersky, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 2010 \u0433\u043e\u0434\u0443 \u043e\u0442\u043a\u0440\u044b\u043b \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e Typesafe, \u0437\u0430\u043a\u0440\u044b\u043b \u0435\u0435. \u041d\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Typesafe, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Scala.<br \/>  \u042d\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e Scala \u0443\u043c\u0435\u0440\u043b\u0430, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u043c\u0435\u0441\u0442\u043e Typesafe \u043e\u0442\u043a\u0440\u044b\u043b\u0430\u0441\u044c \u0434\u0440\u0443\u0433\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u2014 Lightbend, \u043d\u043e \u0443 \u043d\u0435\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u0430\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043c\u043e\u0434\u0435\u043b\u044c. \u041e\u043d\u0438 \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u043c \u0432\u0435\u0449\u0430\u043c, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u043d\u0430 Scala, \u043a\u0430\u043a Play, Akka \u0438 Spark, \u0438 \u0434\u0430\u0436\u0435 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0439 \u0432\u044b\u0448\u0435 \u043f\u043e\u043f\u0435, \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 Scala. \u0413\u043e\u0434 \u043d\u0430\u0437\u0430\u0434 Scala \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u043d\u0430 \u043f\u0438\u043a\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u044d\u0442\u043e \u043e\u043d\u0430 \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u043b\u0430 \u0434\u0430\u0436\u0435 \u0432 \u043f\u0435\u0440\u0432\u044b\u0435 40 \u043c\u0435\u0441\u0442 \u0432 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u0435. \u0414\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u2014 Groovy \u0431\u044b\u043b \u043d\u0430 \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u043e\u043c, Java \u2014 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c.<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u043d\u0430 \u043f\u0438\u043a\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u043b\u044e\u0434\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Scala \u0432 \u043c\u0430\u0441\u0441\u0430\u0445, \u0442\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043b\u0438 \u0441\u0432\u043e\u044e \u0431\u0438\u0437\u043d\u0435\u0441-\u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439. \u0423 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u043b\u0438\u0442\u044c Scala, \u0434\u0440\u0443\u0433\u0430\u044f \u0431\u0438\u0437\u043d\u0435\u0441 \u043c\u043e\u0434\u0435\u043b\u044c. \u041e\u043d\u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u0435\u043b\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043c\u0430\u0441\u0441, \u0432\u0440\u043e\u0434\u0435 Spark, \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 Java API. \u0418 \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u043e\u0439\u0434\u0435\u043c \u0434\u043e \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u043e\u0432, \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0442\u0430\u043c \u0443\u0436\u0435 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u044b, \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Scala \u0438\u043b\u0438 \u043d\u0430 Java.<\/p>\n<h3>\u041c\u0438\u0444 3. Spark \u0438 Spring \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b<\/h3>\n<p>  \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044f \u0432\u0430\u043c \u0443\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c SparkContext, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d \u043a\u0430\u043a bean. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a \u043f\u0440\u0438 bean \u043f\u043e\u0441\u0442\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0434\u043b\u044f Spark.<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434.<br \/>  \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 RDD \u0441\u0442\u0440\u043e\u043a \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043f\u043e\u0432\u044b\u0445 \u0441\u043b\u043e\u0432. \u0415\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u043f\u043e\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u043a\u043e\u0434\u0435, \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c.<\/p>\n<pre><code class=\"java\">@service public class PopularWordsServiceImpl implements PopularWordsService {      @Override     public List&lt;String&gt; topX(JavaRDD&lt;String&gt; lines, int x) {         return lines.map(String::toLowerCase)                 .flatMap(WordsUtil::getWords)                 .mapToPair(w -&gt; new Tuple2&lt;&gt;(w, 1))                 .reduceByKey((a, b) -&gt; a + b)                 .mapToPair(Tuple2::swap)                 .sortByKey().map(Tuple2::_2).take(x);     } } <\/code><\/pre>\n<p>  \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u043c, \u0432 lowercase \u0438\u043b\u0438 \u0432 uppercase \u0443 \u043d\u0430\u0441 \u0441\u043b\u043e\u0432\u0430 \u043f\u0435\u0441\u0435\u043d, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0432 lowercase, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u043e\u0432\u0430 \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438 \u0441 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0431\u0443\u043a\u0432\u044b \u043c\u044b \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 map. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0441\u043b\u043e\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 flatmap.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c RDD, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u043b\u043e\u0432\u0430. \u041c\u044b \u0435\u0433\u043e map-\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u043e\u0442\u0438\u0432 \u0438\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430. \u041d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u043b\u043e\u0432\u0443 \u0435\u0434\u0438\u043d\u0438\u0447\u043a\u0443 \u043f\u0440\u0438\u043f\u0438\u0441\u0430\u0442\u044c. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d: \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0432\u043e \u2014 1, \u0441\u043b\u043e\u0432\u043e \u2014 1, \u043f\u043e\u0442\u043e\u043c \u0432\u0441\u0435 \u0435\u0434\u0435\u043d\u0438\u0447\u043a\u0438 \u043f\u0440\u043e\u0442\u0438\u0432 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0441\u043b\u043e\u0432 \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c (\u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0435\u0441\u043b\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e).<\/p>\n<p>  \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f mapToPair \u2014 \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u044b. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 Java \u043d\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 Pair. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0443\u043f\u0443\u0449\u0435\u043d\u0438\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c, \u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0434 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441 \u0433\u043b\u0443\u043f\u043e.<\/p>\n<p>  \u0423 \u0421\u043a\u0430\u043b\u044b \u0435\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b (\u0438\u0445 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e) \u2014 Tuple. \u0415\u0441\u0442\u044c Tuple2, 3, 4 \u0438 \u0442.\u043f. \u0434\u043e 22. \u041f\u043e\u0447\u0435\u043c\u0443 \u0434\u043e 22? \u041d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043d\u0438\u043a\u0442\u043e. \u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d Tuple2, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u043c\u0430\u043f\u0438\u0440\u0443\u0435\u043c 2.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u044d\u0442\u043e \u043d\u0430\u0434\u043e reduce-\u0438\u0442\u044c. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 reduceByKey, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430 \u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u043a\u043b\u044e\u0447\u043e\u043c, \u0430 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 value \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0448\u0443. \u041d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u043b\u043e\u0436\u0438\u0442\u044c. \u0423 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u043f\u0430\u0440\u044b: \u0441\u043b\u043e\u0432\u043e \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e. <\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0422\u0443\u0442 \u0443 \u043d\u0430\u0441 \u043e\u043f\u044f\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 Java, \u0442.\u043a. \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c sort \u2014 \u044d\u0442\u043e sorkByKey. \u0412 API Scala \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e sortby \u0438 \u0442\u0430\u043c \u0432\u044b \u0431\u0435\u0440\u0435\u0442\u0435 \u044d\u0442\u043e\u0442 Tuple \u0438 \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u0442\u0435 \u0438\u0437 \u043d\u0435\u0433\u043e \u0432\u0441\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435. \u0410 \u0437\u0434\u0435\u0441\u044c \u2014 \u0442\u043e\u043b\u044c\u043a\u043e SortByKey.<\/p>\n<p>  \u041a\u0430\u043a \u044f \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u043f\u043e\u043a\u0430 \u0435\u0449\u0435 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u043c\u044b \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u043c, \u0447\u0442\u043e Java API \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u0433\u0430\u0442. \u041d\u043e \u0432\u044b\u043a\u0440\u0443\u0442\u0438\u0442\u044c\u0441\u044f \u043c\u043e\u0436\u043d\u043e. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430\u0448\u0443 \u043f\u0430\u0440\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0435\u0449\u0435 \u0440\u0430\u0437 \u0434\u0435\u043b\u0430\u0435\u043c mapToPair, \u0438 \u0443 Tuple \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f swap (\u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043f\u0430\u0440\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u2014 \u0441\u043b\u043e\u0432\u0430). \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c sortByKey.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u043d\u0435 \u043f\u0435\u0440\u0432\u0443\u044e, \u0430 \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0435\u043b\u0430\u0435\u043c map. \u0414\u043b\u044f \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0443 Tuple \u0435\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f &quot;_2&quot;. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043b\u0430\u0435\u043c Take(x) (\u043d\u0430\u043c \u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e x \u0441\u043b\u043e\u0432 \u2014 \u043c\u0435\u0442\u043e\u0434 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f TopX), \u0438 \u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c return.<\/p>\n<p>  \u042f \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u0441\u0442. \u041d\u043e \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u0432 Java config \u043d\u0430 Spring (\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430 Spring, \u0438 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043b\u0430\u0441\u0441, \u0430 \u0441\u0435\u0440\u0432\u0438\u0441).<\/p>\n<pre><code class=\"java\">@Configuration @ComponentScan(basePackages = &quot;ru.jug.jpoint.core&quot;) @PropertySource(&quot;classpath:user.properties&quot;) public class AppConfig {     @Bean     public JavaSparkContext sc() {         SparkConf conf = new SparkConf().setAppName(&quot;music analytst&quot;).setMaster(&quot;local[*]&quot;);         return new JavaSparkContext(conf);     }      @Bean     public static PropertySourcesPlaceholderConfigurer configurer(){         return new PropertySourcesPlaceholderConfigurer();     } }<\/code><\/pre>\n<p>  \u0412 Java config \u044f \u0447\u0438\u0442\u0430\u044e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e user.properties (\u044f \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u044a\u044f\u0441\u043d\u044e, \u0437\u0430\u0447\u0435\u043c; \u0441\u0435\u0439\u0447\u0430\u0441 \u044f \u0435\u0433\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e). \u0422\u0430\u043a\u0436\u0435 \u044f \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u044e \u0432\u0441\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0434\u0432\u0430 bean: PropertySourcePlceholderConfigurer \u2014 \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0438\u0437 property-\u0444\u0430\u0439\u043b\u043e\u0432, \u044d\u0442\u043e \u043f\u043e\u043a\u0430 \u043d\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e; \u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 bean, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0441 \u0441\u0435\u0439\u0447\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u2014 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 JavaSparkContext.<\/p>\n<p>  \u042f \u0441\u043e\u0437\u0434\u0430\u043b SparkConf, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b \u0435\u0433\u043e (\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f music analyst), \u0441\u043a\u0430\u0437\u0430\u043b \u0435\u043c\u0443, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043c\u0430\u0441\u0442\u0435\u0440 (\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e). \u041c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 JavaSparkContext \u2014 \u0432\u0441\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0442\u0435\u0441\u0442.<\/p>\n<pre><code class=\"java\">@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = AppConfig.class) public class PopularWordsServiceImplTest {     @Autowired     JavaSparkContext sc;      @Autowired     PopularWordsService popularWordsService;      @Test     public void textTopX() throws Exception {         JavaRDD&lt;String&gt; rdd = sc.parallelize(Arrays.asList(\u201cjava java java scala grovy grovy\u201d);         List&lt;String&gt; top1 = popularWordsService.topX(rdd, 1);         Assert.assertEquals(\u201cjava\u201d,top1.get(0));     } }<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441\u043e Spring, \u0440\u0430\u043d\u043d\u0435\u0440, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u043f\u0440\u0438\u043d\u0433\u043e\u0432\u044b\u0439. \u041d\u0430\u0448\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u2014 \u044d\u0442\u043e AppConfig (\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d). \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u043c \u0441\u044e\u0434\u0430 JavaSparkContext \u0438 \u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c. \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 SparkContext \u044f \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u043c parallelize \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e \u0442\u0443\u0434\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u00abjava java java scala grovy grovy\u00bb. \u0414\u0430\u043b\u0435\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e \u043c\u0435\u0442\u043e\u0434 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e, \u0447\u0442\u043e Java \u2014 \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e.<\/p>\n<p>  \u0422\u0435\u0441\u0442 \u0443\u043f\u0430\u043b. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u2014 scala.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cd2\/ae7\/cdc\/cd2ae7cdc9270b87830dc6264efca597.png\"\/><\/p>\n<p>  \u0427\u0442\u043e \u044f \u0437\u0430\u0431\u044b\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c? \u041a\u043e\u0433\u0434\u0430 \u044f \u0434\u0435\u043b\u0430\u043b Sort, \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443.<br \/>  \u0418\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435:<\/p>\n<pre><code class=\"java\">@service public class PopularWordsServiceImpl implements PopularWordsService {     @Override     public List&lt;String&gt; topX(JavaRDD&lt;String&gt; lines, int x) {         return lines.map(String::toLowerCase)                 .flatMap(WordsUtil::getWords)                 .mapToPair(w -&gt; new Tuple2&lt;&gt;(w, 1))                 .reduceByKey((a, b) -&gt; a + b)                 .mapToPair(Tuple2::swap).sortByKey(false).map(Tuple2::_2).take(x);     } }<\/code><\/pre>\n<p>  \u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0448\u0435\u043b.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c main \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0441\u043d\u0435.<br \/>  \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f data, \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u043f\u0430\u043f\u043a\u0430 Beatles, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043b\u0435\u0436\u0438\u0442 \u0442\u0435\u043a\u0441\u0442 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u0435\u0441\u043d\u0438: yesterday. \u041a\u0430\u043a \u0432\u044b \u0434\u0443\u043c\u0430\u0435\u0442\u0435, \u043a\u0430\u043a\u043e\u0435 \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0432 yesterday?<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a67\/ca5\/9bb\/a67ca59bb86b91b81db87f35df7e6f94.png\"\/><\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0443 \u043c\u0435\u043d\u044f \u0441\u0435\u0440\u0432\u0438\u0441 ArtistsJudge. \u041c\u044b \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 TopX \u2014 \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0438\u043c\u044f \u0430\u0440\u0442\u0438\u0441\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043f\u0435\u0441\u043d\u0438 \u044d\u0442\u043e\u0433\u043e \u0430\u0440\u0442\u0438\u0441\u0442\u0430, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 topX \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/p>\n<pre><code class=\"java\">@Service public class ArtistJudgeImpl implements ArtistJudge {      @Autowired     private PopularDFWordsService popularDFWordsService;      @Autowired     private WordDataFrameCreator wordDataFrameCreator;      @Value(&quot;${path2Dir}&quot;)     private String path;      @Override     public List&lt;String&gt; topX(String artist, int x) {         DataFrame dataFrame = wordDataFrameCreator.create(path + &quot;data\/songs\/&quot; + artist + &quot;\/*&quot;);         System.out.println(artist);         return popularDFWordsService.topX(dataFrame, x);     }      @Override     public int compare(String artist1, String artist2, int x) {         List&lt;String&gt; artist1Words = topX(artist1, x);         List&lt;String&gt; artist2Words = topX(artist2, x);         int size = artist1Words.size();         artist1Words.removeAll(artist2Words);         return size - artist1Words.size();     }      public static void main(String[] args) {         List&lt;String&gt; list = Arrays.asList(&quot;\u0412\u0440\u043e\u043d\u0441\u043a\u0438\u0439&quot;, null, &quot;\u0410\u043d\u043d\u0430&quot;);         Comparator&lt;String&gt; cmp = Comparator.nullsLast(Comparator.naturalOrder());          System.out.println(Collections.max(list, cmp));       \/*  System.out.println(list.stream().collect(Collectors.maxBy(cmp)).get());         System.out.println(list.stream().max(cmp).get()); *\/     } }<\/code><\/pre>\n<p>  Main \u0443 \u043c\u0435\u043d\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">package ru.jug.jpoint;  import org.springframework.context.annotation.AnnotationConfigApplicationContext; import ru.jug.jpoint.core.ArtistJudge;  import java.util.List; import java.util.Set;  \/**  * Created by Evegeny on 20\/04\/2016.  *\/  public class Main {     public static void main(String[] args) {         AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);         ArtistJudge judge = context.getBean(ArtistJudge.class);         List&lt;String&gt; topX = judge.topX(&quot;beatles&quot;, 3);         System.out.println(topX);     } } <\/code><\/pre>\n<p>  \u0418\u0442\u0430\u043a, \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u2014 \u044d\u0442\u043e \u043d\u0435 yesterday, \u044d\u0442\u043e \u00abi\u00bb:<\/p>\n<pre><code>[i, yesterday, to] <\/code><\/pre>\n<p>  \u0421\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u0441\u044c, \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u0443\u0441\u043e\u0440\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043d\u0435\u0441\u0443\u0442 \u0441\u043c\u044b\u0441\u043b\u043e\u0432\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (\u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0441\u043d\u0438 Pink Floyd \u0431\u043e\u043b\u0435\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0435 \u0438 \u043d\u0430\u043c \u0442\u0430\u043a\u0438\u0435 \u0441\u043b\u043e\u0432\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u0435\u0448\u0430\u0442\u044c).<br \/>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b \u0444\u0430\u0439\u043b userProperties, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043c\u0443\u0441\u043e\u0440\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430:<\/p>\n<pre><code>garbage = the,you,and,a,get,got,m,chorus,to,i,in,of,on,me,is,all,your,my,that,it,for <\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u0440\u0430\u0437\u0443 \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 garbage \u0432 \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441, \u043d\u043e \u044f \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043b\u044e\u0431\u043b\u044e. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c UserConfig, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b. \u041a\u0430\u0436\u0434\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e \u0442\u043e, \u0447\u0442\u043e \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e. <\/p>\n<pre><code class=\"java\">@Component public class UserConfig implements Serializable{     public List&lt;String&gt; garbage;      @Value(&quot;${garbage}&quot;)     private void setGarbage(String[] garbage) {         this.garbage = Arrays.asList(garbage);     } } <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e private \u0434\u043b\u044f \u0441\u0435\u0442\u0442\u0435\u0440\u0430 \u0438 public \u0434\u043b\u044f \u0441\u0430\u043c\u043e\u0433\u043e property. \u041d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043d\u0430 \u044d\u0442\u043e\u043c \u0437\u0430\u0446\u0438\u043a\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f.<br \/>  \u041c\u044b \u0438\u0434\u0435\u043c \u0432 \u043d\u0430\u0448 PopularWordsServiceImpl, \u0434\u0435\u043b\u0430\u0435\u043c Autowired \u044d\u0442\u043e\u043c\u0443 UserConfig \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0441\u043b\u043e\u0432\u0430.<\/p>\n<pre><code class=\"java\">@service public class PopularWordsServiceImpl implements PopularWordsService {      @Override     public List&lt;String&gt; topX(JavaRDD&lt;String&gt; lines, int x) {         return lines.map(String::toLowerCase)                 .flatMap(WordsUtil::getWords)                 .mapToPair(w -&gt; new Tuple2&lt;&gt;(w, 1))                 .reduceByKey((a, b) -&gt; a + b)                 .mapToPair(Tuple2::swap).sortByKey(false).map(Tuple2::_2).take(x);     } } <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u043e\u0442 \u0436\u0435 main.<br \/>  \u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e (\u044d\u0442\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442):<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5e9\/93f\/d2a\/5e993fd2a7235f5d872e43cf9d650636.png\"\/><\/p>\n<p>  \u0412\u0441\u0435 \u0443\u043f\u0430\u043b\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e not serializable.<br \/>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c. <br \/>  \u0427\u0442\u043e\u0431\u044b \u0432\u044b \u043d\u0435 \u0441\u043e\u043c\u043d\u0435\u0432\u0430\u043b\u0438\u0441\u044c, UserConfig \u2014 serializable.<\/p>\n<pre><code class=\"java\">Component public class UserConfig implements Serializable{     public List&lt;String&gt; garbage;      @Value(&quot;${garbage}&quot;)     private void setGarbage(String[] garbage) {         this.garbage = Arrays.asList(garbage);     } } <\/code><\/pre>\n<p>  \u041d\u043e \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 serializable \u043c\u043e\u0439 PopularWordsServiceImpl:<\/p>\n<pre><code class=\"java\">@Service public class PopularWordsServiceImpl implements PopularWordsService { <\/code><\/pre>\n<p>  \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0435\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u044e serializable:<\/p>\n<pre><code class=\"java\">public interface PopularWordsService extends Serializable {     List&lt;String&gt; topX(JavaRDD&lt;String&gt; lines, int x); } <\/code><\/pre>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0432 map-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0435\u0436\u0438\u0442 \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435) \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f state-\u043e\u043c \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0443\u0445\u043e\u0434\u0438\u0442\u044c \u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0422.\u0435. \u0435\u0441\u043b\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e UserConfig \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0432\u043e\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c serializable. \u041d\u043e \u0444\u0438\u0448\u043a\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 UserConfig \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u043c\u043e\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u0442\u043e\u0436\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0445\u0438\u0442\u0440\u043e \u043e\u0431\u043e\u0439\u0442\u0438, \u043d\u043e \u043f\u0440\u043e\u0449\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c serializable.<\/p>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u043f\u043e\u043f\u0430\u043b yesterday. \u041d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u2014 oh, \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u2014 believe. \u042f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u0432\u043d\u043e\u0441\u0438\u043b oh \u0432 \u0441\u043b\u043e\u0432\u0430-\u043c\u0443\u0441\u043e\u0440, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043b\u044f \u0411\u0440\u0438\u0442\u043d\u0438 \u0421\u043f\u0438\u0440\u0441 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e.<br \/>  \u041d\u043e \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 \u044f \u0433\u043e\u0432\u043e\u0440\u044e, \u0447\u0442\u043e UserConfig \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0439\u0442\u0438 \u043d\u0430 \u0432\u0441\u0435 worker? \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0442\u0443\u0434\u0430 \u0438\u0434\u0442\u0438? \u041d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u044d\u0442\u043e \u0431\u0438\u0442\u044c \u043f\u043e \u043f\u0435\u0440\u0444\u043e\u0440\u043c\u0430\u043d\u0441\u0443? \u0422\u0443\u0442 \u043c\u044b \u0441\u043d\u043e\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 Spark \u043b\u0435\u0433\u043a\u043e, \u0430 \u0432\u043e\u0442 \u0447\u0442\u043e\u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434, \u043d\u0430\u0434\u043e \u043a\u043e\u0435-\u0447\u0442\u043e \u0437\u043d\u0430\u0442\u044c.<br \/>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043c\u0438\u0444\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0432\u044f\u0437\u0430\u043d \u0441 broadcast-\u043e\u043c.<\/p>\n<h3>\u041c\u0438\u0444 4. \u0415\u0441\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u0431\u0435\u0437 broadcast \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h3>\n<p>  \u0412\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430 worker-\u044b \u043f\u043e\u043f\u0430\u043b\u0430 \u043e\u0431\u0449\u0430\u044f \u0434\u043b\u044f \u043d\u0438\u0445 data (\u043a\u0430\u043a UserConfig \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435). \u042f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b \u043b\u044e\u0434\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u0447\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0434\u043e \u0434\u0435\u043b\u0430\u0442\u044c broadcast, \u0438\u043d\u0430\u0447\u0435 \u044d\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041d\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c (\u043a\u0430\u043a \u0432\u044b \u0432\u0438\u0434\u0435\u043b\u0438), broadcast \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>  \u0415\u0441\u0442\u044c 2 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c:  <\/p>\n<ul>\n<li>\u043c\u043e\u0436\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c. Spark \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0441\u0430\u043c;\n<\/li>\n<li>\u043c\u043e\u0436\u043d\u043e \u0435\u043c\u0443 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438 \u0442\u0443\u0434\u0430. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 broadcast.  <\/li>\n<\/ul>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438:<\/p>\n<pre><code>Israel, +9725423632 Israel, +9725454232 Israel, +9721454232 Israel, +9721454232 Spain, +34441323432 Spain, +34441323432 Israel, +9725423232 Israel, +9725423232 Spain, +34441323432 Russia, +78123343434 Russia, +78123343434 <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432.<br \/>  \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 (\u0442\u0430\u043c \u0438\u0445 \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u044b), \u0433\u0434\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0441\u0442\u0440\u0430\u043d\u0430 \u0438 \u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430. \u041c\u043d\u0435 \u043d\u0430\u0434\u043e \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435 \u0441\u0442\u0440\u0430\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0441 \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442. \u041a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u2014 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e property-\u0444\u0430\u0439\u043b\u0435 \u0438 \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u0438\u0442\u044c \u043d\u0430 \u0432\u0441\u0435 worker-\u044b. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043d\u0435 \u043e\u043f\u044f\u0442\u044c \u0436\u0435 \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u043d\u0430\u0434\u043e \u0432\u0437\u044f\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430\u0445 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u0438 \u0441\u043c\u0430\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u043e\u0442\u0438\u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439, \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0445 \u043d\u043e\u043c\u0435\u0440\u0430:<\/p>\n<pre><code>Israel, Orange Israel, Orange Israel, Pelephone Israel, Pelephone Israel, Hot Mobile Israel, Orange Russia, Megaphone Russia, MTC <\/code><\/pre>\n<p>  \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e Excel-\u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e 054 \u2014 \u044d\u0442\u043e Orange, \u0430 911 \u2014 \u044d\u0442\u043e \u041c\u0422\u0421. \u042d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a\u043e\u0439 \u0443\u0436 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0444\u0430\u0439\u043b (10 \u041a\u0431; \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u044b \u043e\u043d \u0431\u044b\u043b 2 \u041c\u0431 \u2014 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0438\u0447\u0442\u043e \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 big data) \u0438 \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u0438\u0442\u044c.<br \/>  \u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c\u0438 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\u043c\u0438:<\/p>\n<pre><code>Orange Orange Pelephone Pelephone Hot Mobile Orange Megaphone MTC <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u043e\u0434?<\/p>\n<pre><code class=\"java\">public interface CommonConfig {     Operator getOperator(String phone);      List&lt;String&gt; countries(); } <\/code><\/pre>\n<p>  \u0415\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 CommonConfig, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043f\u043e \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0443 \u0438 \u0432\u044b\u044f\u0441\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u044b \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442.<br \/>  \u041a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0432 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0432\u044b\u0448\u0435 \u0441 \u043c\u0443\u0441\u043e\u0440\u043e\u043c:<\/p>\n<pre><code class=\"java\">@Service public class HrenoviyService { @Autowired private CommonConfig config; public JavaRDD&lt;String&gt; resolveOperatorNames(JavaRDD&lt;Tuple2&lt;String,String&gt;&gt; pairs){ return pairs.filter(pair-&gt; config.countries().contains(pair._1)) .map(pair-&gt; config.getOperator(pair._2).getName()); } } <\/code><\/pre>\n<p>  \u0415\u0441\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 Spring, \u043e\u043d \u0432 \u0441\u0435\u0431\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0444\u0438\u0433 \u0438 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c, \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u043c\u0430\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c data.<br \/>  \u042d\u0442\u043e \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e! \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u0431\u044a\u044f\u0441\u043d\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 (\u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0434\u043e \u0434\u0435\u043b\u0430\u0442\u044c broadcast).<\/p>\n<p>  \u0427\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442? \u041a\u043e\u043d\u0444\u0438\u0433 \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 Driver \u043d\u0430 Worker-\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443, \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c 1 \u0440\u0430\u0437. \u0412\u043e\u0437\u044c\u043c\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0422\u0431 \u0438 \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0423 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u044b \u0438, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u044d\u0442\u043e 1000 \u0442\u0430\u043a\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432. \u0410 \u043a\u043e\u0433\u0434\u0430 \u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e \u0441\u0432\u043e\u0439 Spark-\u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e 10 Worker-\u043e\u0432.<\/p>\n<p>  Worker-\u044b \u0431\u0443\u0434\u0443\u0442 \u043a\u0430\u043a-\u0442\u043e \u0434\u0435\u043b\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443. \u0418\u0445 10, \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432 1000, \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u043e\u0437\u044c\u043c\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f 100 \u0442\u0430\u0441\u043a\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u0443\u0441\u043e\u043a \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0431\u0435\u0440\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u0443\u0441\u043e\u043a \u0438 \u0442.\u0434. \u0418 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u0441\u043a \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0442\u0443\u0434\u0430-\u0441\u044e\u0434\u0430 \u0442\u044f\u0433\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433 (\u0438 \u043d\u0435 1 \u0440\u0430\u0437, \u0430 2, \u0442.\u043a. \u044f \u0438\u043c \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c 2 \u0440\u0430\u0437\u0430). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043d\u0443\u0436\u043d\u0430 \u0432\u0441\u0435\u043c worker-\u0430\u043c \u0438 \u043e\u043d\u0430 \u043d\u0435 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0436\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u0430\u0445, \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c broadcast.<\/p>\n<p>  \u0412 \u043f\u043b\u0430\u043d\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/289\/2cc\/987\/2892cc987ba25cde581b20cb56da70eb.png\"\/><\/p>\n<p>  \u0423 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0435\u0441\u0442\u044c context, \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f broadcast, \u0438 \u0437\u0434\u0435\u0441\u044c \u0432\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0435 \u0442\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0445\u043e\u0442\u0438\u0442\u0435 broadcast-\u0438\u0442\u044c. \u041a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0439\u0434\u0435\u0442 \u043d\u0430 \u0432\u0441\u0435 worker-\u044b \u0438 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043c \u0441\u0438\u0434\u0435\u0442\u044c \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.<\/p>\n<p>  \u0412 \u0447\u0435\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430? \u041d\u0430\u0440\u0443\u0448\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f:<\/p>\n<pre><code class=\"java\">@Service public class HrenoviyService { @Autowired private JavaSparkContext sc; @Autowired private CommonConfig commonConfig; private Broadcast&lt;CommonConfig&gt; configBroadcast; @PostConstruct public void wrapWithBroadCast(){ configBroadcast = sc.broadcast(commonConfig); } public JavaRDD&lt;String&gt; resolveOperatorNames(JavaRDD&lt;Tuple2&lt;String,String&gt;&gt; pairs){ return pairs.filter(pair-&gt; configBroadcast.value().countries().contains(pair._1)) .map(pair-&gt; configBroadcast.value().getOperator(pair._2).getName()); } } <\/code><\/pre>\n<p>  \u041d\u0430\u043c \u0437\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u0435\u043d context (\u0442\u0430\u043a, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u043d\u0430\u0434\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Spring). \u042f \u0445\u043e\u0447\u0443 broadcast-\u0438\u0442\u044c \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 PostConstruct, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f wrapWithBroadcast. \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 SparkContext \u043e\u043d \u0431\u0440\u043e\u0430\u0434\u043a\u0430\u0441\u0442\u0438\u0442 \u0442\u043e, \u0447\u0442\u043e \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e. \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432 PostConstruct.<br \/>  \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u0442\u0430\u043a \u0438\u0437 broadcast \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043e\u043d \u0434\u0435\u0440\u0436\u0438\u0442):<\/p>\n<pre><code class=\"java\">return pairs.filter(pair-&gt; configBroadcast.value().countries().contains(pair._1)) .map(pair-&gt; configBroadcast.value().getOperator(pair._2).getName()); <\/code><\/pre>\n<p>  \u0410 \u0432\u043e\u0442 \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/402\/cde\/a22\/402cdea22d26d3c628c0390a2ba8e320.png\"\/><\/p>\n<p>  \u041c\u044b \u0441\u044e\u0434\u0430 \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u043b\u0438 SparkContext, \u043e\u043d \u0432\u0435\u0441\u044c \u0437\u0434\u0435\u0441\u044c \u0441\u0438\u0434\u0438\u0442. \u042d\u0442\u043e \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e copy-paste, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043b\u043e\u0433\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 broadcast, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0432\u043e \u0432\u0441\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/3ad\/67c\/3a1\/3ad67c3a17b5573ca23029cb44cf281c.png\"\/><\/p>\n<p>  \u0412\u043e\u0442 \u044d\u0442\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f copy-past\u0418\u0442\u044c \u0432\u0435\u0437\u0434\u0435.<\/p>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u0434 Spark \u043f\u0440\u043e\u0441\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0431\u0438\u0437\u043d\u0435\u0441-\u043a\u043e\u0434 (\u043b\u043e\u0433\u0438\u043a\u0430 broadcast \u2014 \u044d\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u0434). \u042d\u0442\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u0442\u0435\u0441\u0442\u044b, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043e\u043a\u0438 \u043d\u0430 SparkContext, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0438\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438.<br \/>  \u0415\u0441\u0442\u044c \u0438 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5f4\/f3e\/6f3\/5f4f3e6f3ac9a78f69c1faa613e0225b.png\"\/><\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u043b\u0438 SparkContext \u0432 \u0441\u0435\u0440\u0432\u0438\u0441, \u043e\u043d \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0431\u044b\u0442\u044c serializable.<br \/>  \u0421\u043f\u043e\u0440 \u043e \u0442\u043e\u043c, \u043d\u0430\u0434\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043b\u0438 \u043d\u0435\u0442, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0432\u0435\u0447\u043d\u043e, \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7c9\/944\/95b\/7c994495be24a7942eeec3f4f48f9763.png\"\/><\/p>\n<p>  \u0425\u043e\u0447\u0435\u0448\u044c \u0434\u0435\u043b\u0430\u0442\u044c broadcast? \u041e\u0442\u043a\u0430\u0436\u0438\u0441\u044c \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a bean:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/6e8\/efd\/1f8\/6e8efd1f8ef9390a38c211cb860a0daf.png\"\/><\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u044c \u0441\u044e\u0434\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 \u0432\u0438\u0434\u0435 broadcast-\u0430, \u043f\u043e\u0441\u0442\u0430\u0432\u044c \u0441\u0435\u0442\u0442\u0435\u0440 \u0438 \u043f\u043e\u0442\u043e\u043c \u0432 \u0441\u0432\u043e\u0435\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0442\u044b \u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0448\u044c \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a bean \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u043c\u0443 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u0442\u0435\u0440 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u0443\u044e \u0432 broadcast.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/6e3\/5bf\/a4b\/6e35bfa4bd3860f87b80c62aacfbcaef.png\"\/><\/p>\n<p>  \u0412\u044b \u0441\u0435\u0431\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0435, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u043d\u0435\u043a\u0440\u0430\u0441\u0438\u0432\u043e, \u043a\u0430\u043a\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0443\u0436\u0435\u043d \u044d\u0442\u043e\u0442 broadcast? \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c <a href=\"https:\/\/habrahabr.ru\/users\/service\/\" class=\"user_link\">Service<\/a>, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0438\u0445 \u0432\u0441\u0435 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u0430\u0432\u0430\u0442\u044c broadcast.<br \/>  \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u043f\u043e\u0439\u0442\u0438 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.<\/p>\n<pre><code class=\"java\">@Service public class PopularWordsServiceImpl implements PopularWordsService {     @AutowiredBroadcast     private Broadcast&lt;UserConfig&gt; userConfig; <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u044f \u0431\u0443\u0434\u0443 \u0434\u0435\u0440\u0436\u0430\u0442\u044c broadcast \u0441\u0432\u043e\u0435\u0433\u043e UserConfig \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 \u00a0AutowiredBroadcast. \u0422\u0430\u043a \u043a\u0440\u0430\u0441\u0438\u0432\u0435\u0435, \u043f\u0440\u0430\u0432\u0434\u0430?<br \/>  \u0422\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0434\u0435\u0441\u044c:<\/p>\n<pre><code class=\"java\">    @Override     public List&lt;String&gt; topX(JavaRDD&lt;String&gt; lines, int x) {         return lines.map(String::toLowerCase)                 .flatMap(WordsUtil::getWords)                 .filter(w -&gt; !userConfig.value().garbage.contains(w))                 .mapToPair(w -&gt; new Tuple2&lt;&gt;(w, 1))                 .reduceByKey((a, b) -&gt; a + b)                 .mapToPair(Tuple2::swap).sortByKey(false).map(Tuple2::_2).take(x);     } } <\/code><\/pre>\n<p>  \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c UserConfig.value, \u0438 \u0432\u0441\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>  \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c bean-\u043f\u043e\u0441\u0442\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u044d\u0442\u0443 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e.<\/p>\n<p>  \u041f\u043e\u0434\u0432\u0435\u0434\u0435\u043c \u0438\u0442\u043e\u0433\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430.<\/p>\n<pre><code class=\"java\">lines.map(String::toLowerCase) .flatMap(WordsUtil::getWords) .filter(word-&gt; !Arrays.asList(garbage).contains(word)) .mapToPair(word-&gt; new Tuple2&lt;&gt;(word, 1)) .reduceByKey((x, y)-&gt;x+y) .mapToPair(Tuple2::swap) .sortByKey(false) .map(Tuple2::_2) .take(amount); <\/code><\/pre>\n<pre><code>lines.map(_.toLowerCase()) .flatMap(&quot;\\\\w+&quot;.r.findAllIn(_)) .filter(!garbage.contains(_)) .map((_,1)).reduceByKey(_+_) .sortBy(_._2,ascending = false) .take(amount) <\/code><\/pre>\n<p>  \u0421\u0432\u0435\u0440\u0445\u0443 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043d\u0430 Java (\u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043c\u0443\u0441\u043e\u0440\u0430 \u0438 \u0442.\u0434.). \u041d\u0438\u0436\u0435 \u2014 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u0431\u044b \u043d\u0430 Scala. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u044d\u0442\u043e Java 8, \u0441\u043f\u0440\u0430\u0432\u0430 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0432 2 \u0440\u0430\u0437\u0430 \u043a\u043e\u0440\u043e\u0447\u0435. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0441\u044f\u043a\u0438\u0435 \u0442\u0430\u043a\u0438\u0435 \u0444\u0438\u0448\u043a\u0438:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f40\/0cb\/a1a\/f400cba1a0eb6bba0489c512f30c5a2f.png\"\/><\/p>\n<p>  \u0412 Java \u0443 \u043d\u0430\u0441 \u0446\u0435\u043b\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f GetWords, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 \u043f\u043e\u043b\u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0410 \u0432 Scala \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043a\u0443\u0441\u043e\u043a \u0432 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0432 \u043d\u0435\u043c. \u0422\u0430\u043a\u0436\u0435 \u0432 Scala \u0435\u0441\u0442\u044c SortBy, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c Tuple, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0430 Scala \u043e\u043d \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 (\u044d\u0442\u043e ascending false, \u0430 \u043d\u0435 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 false).<\/p>\n<p>  \u0427\u0435\u043c \u0431\u0443\u0434\u0435\u043c \u043a\u0440\u044b\u0442\u044c? \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u044b.<\/p>\n<p>  DataFrames \u2014 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 API, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0448\u0435\u043b \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u0443\u0442\u043e\u0440\u0430 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u0441\u043e Spark 1.3. \u041e\u043d \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c \u043a\u043e\u043b\u043e\u043d\u043e\u043a (\u0432\u043c\u0435\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Tuple). \u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0442\u0430\u043c RDD, \u043d\u043e \u0442.\u043a. \u044d\u0442\u043e\u0442 RDD \u043e\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0442 \u0441\u0430\u043c, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0443\u0447\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u2014 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u0414\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u044b \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0435\u0441\u043b\u0438 \u0438\u0445 \u0443\u043c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c), \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u043e\u0439 \u0438 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e task-\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>  \u0414\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0437:<\/p>\n<ul>\n<li>hive-\u0442\u0430\u0431\u043b\u0438\u0446;  <\/li>\n<li>json-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432;  <\/li>\n<li>RDD;  <\/li>\n<li>\u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445;  <\/li>\n<li>\u043b\u044e\u0431\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439.  <\/li>\n<\/ul>\n<p>  \u0414\u0430\u0442\u0430\u0444\u0440\u0435\u043c\u044b \u0438\u043c\u0435\u044e\u0442 \u043e\u0447\u0435\u043d\u044c \u0448\u0438\u0440\u043e\u043a\u0438\u0439 DSL \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 SQLContext (\u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043d\u0435\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435).<br \/>  \u0424\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0441\u0442\u044c \u0443 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0430:<\/p>\n<pre><code>Agg, columns, count, distinct, drop, dropDuplicates, filter groupBy, orderBy, registerTable, schema, show, select, where, withColumn <\/code><\/pre>\n<p>  \u041b\u044e\u0431\u0438\u0442\u0435\u043b\u0438 SQL \u043c\u043e\u0433\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435:<\/p>\n<pre><code>dataFrame.registerTempTable(&quot;finalMap&quot;);  DataFrame frame = sqlContext.sql(&quot;select cl_id, cl_grp_id, dk_org_snw, dk_org_hnw, dk_org_cnp, dk_dir, dk_dat, DK_TIM_HR as dk_tim_hr, dk_spe, dk_sgt, dk_pet, dk_sgs, dk_sbp,\\n&quot; + &quot;SUM(slu_atpt) slu_atpt, SUM(slu_succ) slu_succ, SUM(slu_fail) slu_fail, SUM(slu_dly) slu_dly\\n&quot; + &quot;FROM finalMap f join tdtim t on f.dk_tim = t.DK_TIM\\n&quot; + &quot;WHERE dk_pet IN (1, 4)\\n&quot; + &quot;group by cl_id, cl_grp_id, dk_org_snw, dk_org_hnw, dk_org_cnp, dk_dir, dk_dat, DK_TIM_HR, dk_spe, dk_sgt, dk_pet, dk_sgs, dk_sbp&quot;).toDF(); <\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c, \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0435 SQL \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 sqlContext.<br \/>  \u041f\u0440\u0430\u0432\u0434\u0430, \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0438 \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b6c\/012\/9be\/b6c0129be73fe2d3715aac8f67db39f7.png\"\/><\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0430\u043c\u0438 \u0438 \u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438:<\/p>\n<pre><code>abs, cos, asin, isnull, not, rand, sqrt, when, expr, bin, atan, ceil, floor, factorial, greatest, least, log, log10, pow, round, sin, toDegrees, toRadians, md5, ascii, base64, concat, length, lower, ltrim, unbase64, repeat, reverse, split, substring, trim, upper, datediff, year, month, hour, last_day, next_day, dayofmonth, explode, udf <\/code><\/pre>\n<p>  \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0442\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u043e \u043d\u0430 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0430\u0445.<br \/>  \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u043b\u044e\u0434\u0435\u0439:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8c2\/288\/03c\/8c228803c864ea5ef4147ba5d52b98eb.png\"\/><\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u0440\u0430\u0441\u0442 \u0438 keywords (\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043b\u044e\u0434\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442).<\/p>\n<p>  \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0437\u0430\u043f\u0443\u0449\u0443 main.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/0cb\/74a\/c9f\/0cb74ac9fbe941499c9f75ad0c80dfa4.png\"\/><\/p>\n<p>  \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0432\u0441\u044e \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c. \u0412\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0448\u0438\u0442\u0435 sqlContext.read.json \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e (\u0432\u044b \u0432\u0438\u0434\u0435\u043b\u0438, \u0442\u0430\u043c \u0431\u044b\u043b \u043d\u0435 \u043e\u0434\u0438\u043d json, \u0430 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u2014 \u044f \u0438\u0445 \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b \u043f\u043e\u043a\u0438\u0434\u0430\u043b; \u043a\u0430\u0436\u0434\u044b\u0439 json \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0434\u043d\u043e\u0433\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430). \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u044f \u0434\u0435\u043b\u0430\u044e show. \u041f\u0435\u0440\u0432\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/757\/1ce\/1d8\/7571ce1d897bffbf81bdf01a3f62c579.png\"\/><\/p>\n<p>  \u041e\u043d \u043c\u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c\u0438: \u0432\u043e\u0437\u0440\u0430\u0441\u0442, keywords, \u0438\u043c\u044f. \u041d\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b. \u0410 \u0443 \u043c\u0435\u043d\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430\u0439\u0442\u0438 \u0441\u0430\u043c\u0443\u044e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0443\u044e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044e, \u0430 \u043f\u043e\u0442\u043e\u043c \u043d\u0430\u0439\u0442\u0438 \u043b\u044e\u0434\u0435\u0439 \u043c\u0435\u043d\u044c\u0448\u0435 30 \u043b\u0435\u0442 (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043c \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043b\u0430\u0442\u0438\u0442\u044c), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u043e\u0432. \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f linkedIn. \u042f \u0434\u0435\u043b\u0430\u044e select, \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u0435\u043d\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043a\u043e\u043b\u043e\u043d\u043a\u0430 keywords. \u041d\u043e \u044f \u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435 \u043c\u0430\u0441\u0441\u0438\u0432 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0434\u0435\u043b\u0430\u044e explode (\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e \u043d\u043e\u0432\u0443\u044e \u043a\u043e\u043b\u043e\u043d\u043a\u0443 keyword \u0432 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0447\u0438\u0441\u043b\u0435).<\/p>\n<pre><code>linkedIn.select(functions.explode(functions.column(\u201ckeywords\u201d)).as(\u201ckeyword\u201d)); <\/code><\/pre>\n<p>  \u0421\u0442\u0440\u043e\u043a\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c. \u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u043a\u0430\u043a \u043e\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/898\/8de\/503\/8988de5031fda203892002926faf273d.png\"\/><\/p>\n<p>  \u041f\u043e \u044d\u0442\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435 \u044f \u0443\u0436\u0435 \u0431\u0443\u0434\u0443 \u0434\u0435\u043b\u0430\u0442\u044c sort \u0438 \u0442.\u0434. \u041d\u043e \u0437\u0434\u0435\u0441\u044c \u043e\u043d\u0430 \u043f\u043e\u043a\u0430 \u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f\u043c\u0438.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u043e \u043d\u0430\u0434\u043e \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u042f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e \u043f\u043e keyword:<\/p>\n<pre><code class=\"java\">DataFrame orderedBy = keywords.groupBy(\u201ckeyword\u201d)      .agg(functions.count(\u201ckeyword\u201d).as(\u201camount\u201d))      .orderBy(functions.column(\u201camount\u201d).desc()); orderedBy.show(); <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u044f \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u044e, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438.<br \/>  \u042f \u0445\u043e\u0447\u0443 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c keyword-\u044b \u0438 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u043a\u043e\u043b\u043e\u043d\u043a\u0443 amount. \u041f\u043e\u0442\u043e\u043c \u044f \u0445\u043e\u0447\u0443 \u044d\u0442\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u043a\u043e\u043b\u043e\u043d\u043a\u0435 amount \u0432 descended \u043f\u043e\u0440\u044f\u0434\u043a\u0435 (\u043d\u0438\u043a\u0430\u043a\u0438\u0445 false). \u0418 \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e9a\/0a5\/e19\/e9a0a5e19dfb53b96645d6fa48993aea.png\"\/><\/p>\n<p>  \u0422\u0443\u0442 \u0443\u0436\u0435 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0439 \u0438 \u0432\u043e\u0437\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 \u0435\u0441\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e.<br \/>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e:<\/p>\n<pre><code class=\"java\">String mostPopularWord = orderedBy.first().getString(0); System.out.println(\u201cmostPopularWord = \u201c + mostPopularWord); <\/code><\/pre>\n<p>  \u041c\u044b \u0431\u0435\u0440\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e first \u2014 \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u0447\u043a\u0443, \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u044f \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u044e string (\u0440\u0430\u0431\u043e\u0442\u0430\u044e \u043a\u0430\u043a \u0441 resultset-\u043e\u043c). <br \/>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0441\u044c \u043a \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0443, \u0433\u0434\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0432\u0441\u0435 \u043b\u044e\u0434\u0438:<\/p>\n<pre><code class=\"java\">linkedIn.where{     functions.column(\u201cage\u201d).leq(30).and(functions.array_contains(functions.column(\u201ckeywords\u201d).mostPopularWord))) .select(\u201cname\u201d).show(); } <\/code><\/pre>\n<p>  \u0412\u044b\u0431\u0438\u0440\u0430\u044e \u043b\u044e\u0434\u0435\u0439 \u0441 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043e\u043c \u043c\u0435\u043d\u0435\u0435 30 \u043b\u0435\u0442 \u0438 \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f functions.array_contains.<br \/>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430\u044e show. \u0412\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8bc\/a97\/e68\/8bca97e684a86dde4bf2893c9c549e96.png\"\/><\/p>\n<p>  \u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u0438\u0444. \u041b\u044e\u0434\u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0442: \u0441 XML-\u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u0441 JSON-\u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e. \u0410 \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043b\u043e\u0432\u0430 \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c (\u0444\u0430\u0439\u043b \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b)? \u041d\u0435\u043b\u044c\u0437\u044f \u0436\u0435 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0438 \u0442\u043e\u0433\u0434\u0430 Java \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 Scala? \u042d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u0437 \u0447\u0435\u0433\u043e \u0443\u0433\u043e\u0434\u043d\u043e.<br \/>  \u0423 \u043c\u0435\u043d\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441 WordDataFrameCreator.<\/p>\n<p>  \u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0447\u0442\u043e \u044f \u0434\u0435\u043b\u0430\u044e:<\/p>\n<pre><code class=\"java\">@Component public class WordDataFrameCreator {     @Autowired     private SQLContext sqlContext;       @Autowired     private JavaSparkContext sc;      public DataFrame create(String pathToDir) {         JavaRDD&lt;Row&gt; rdd = sc.textFile(pathToDir).flatMap(WordsUtil::getWords).map(RowFactory::create);         return sqlContext.createDataFrame(rdd,   DataTypes.createStructType(new StructField[]{                 DataTypes.createStructField(&quot;words&quot;, DataTypes.StringType, true)         }));     } } <\/code><\/pre>\n<p>  \u041e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e. \u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c RDD \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 map-\u0438\u0440\u0443\u0435\u0442 \u043f\u043e \u0441\u043b\u043e\u0432\u0430\u043c. \u0410 \u0434\u0430\u043b\u044c\u0448\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f RowFactory \u2014 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e RDD. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043a\u0430 RDD, \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 RDD \u0441\u0442\u0440\u043e\u0447\u0435\u043a, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c, \u0435\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u0442.\u0435. \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438, \u043a\u0430\u043a \u0438\u0445 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0438 \u043a\u0430\u043a\u043e\u0439 \u0442\u0430\u043c \u0442\u0438\u043f \u2014 \u044f \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u044e \u0434\u0430\u043b\u0435\u0435. \u041e\u043f\u044f\u0442\u044c \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f SqlContext.<br \/>  \u041a\u0441\u0442\u0430\u0442\u0438, \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f SqlContext \u0438\u0437 JavaSparkContext \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c (\u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c AppConfig, \u0442\u043e \u0443 \u043c\u0435\u043d\u044f SqlContext \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443). \u0412\u043e\u0442, \u043a\u0430\u043a \u043e\u043d \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f:<\/p>\n<pre><code class=\"java\">public SQLContext sqlContext(){     return new SQLContext(sc()); } <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 SqlContext \u044f \u0441\u043e\u0437\u0434\u0430\u044e \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c, \u043f\u0435\u0440\u0435\u0434\u0430\u044e \u0435\u043c\u0443 RDD, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u2014 \u043f\u0435\u0440\u0435\u0434\u0430\u044e \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u043b\u043e\u043d\u043e\u043a (\u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f words, \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f string \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u2014 true).<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0448\u0442\u0443\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f API \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u043e\u0432: \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0443\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u043e\u043b\u043e\u043d\u043a\u0438, \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0441 \u043d\u0438\u043c\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438.<br \/>  \u0412 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0435 \u043f\u0435\u0441\u0435\u043d \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">@Service public class PopularDFWordsServiceImpl implements PopularDFWordsService {      @AutowiredBroadcast     private Broadcast&lt;UserConfig&gt; userConfig;      @Override     public List&lt;String&gt; topX(DataFrame lines, int x) {         DataFrame sorted = lines.withColumn(&quot;words&quot;, lower(column(&quot;words&quot;)))                 .filter(not(column(&quot;words&quot;).isin(userConfig.value().garbage.toArray())))                 .groupBy(column(&quot;words&quot;)).agg(count(&quot;words&quot;).as(&quot;count&quot;))                 .sort(column(&quot;count&quot;).desc());         sorted.show();         Row[] rows = sorted.take(x);         List&lt;String&gt; topX = new HashSet&lt;&gt;();         for (Row row : rows) {             topX.add(row.getString(0));         }         return topX;     } } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0441 RDD, \u0430 \u0441 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0430\u043c\u0438. API \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0432 lower case \u0432\u0441\u0435 \u0441\u043b\u043e\u0432\u0430. withColumn \u2014 \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043b\u043e\u043d\u043a\u0443. \u0415\u0441\u043b\u0438 \u0435\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0435 \u0436\u0435, \u043a\u0430\u043a \u0431\u044b\u043b\u043e, \u043e\u0434\u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439. \u0414\u0430\u043b\u0435\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u043c\u0443\u0441\u043e\u0440\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430, \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u043c \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0443 count \u0441 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u043b\u043e\u0432, \u0430 \u0437\u0430\u0442\u0435\u043c \u2014 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0432 descended-\u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e-\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>  \u0412\u044b\u0448\u0435 \u044f \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438. \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u043e\u043c\u0438\u043c\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445? \u041d\u0435 \u0432\u043e\u043f\u0440\u043e\u0441. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044f \u043f\u0438\u0448\u0443 \u0441\u0432\u043e\u044e custom-\u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c, \u043c\u0443\u0441\u043e\u0440 \u044d\u0442\u043e \u0438\u043b\u0438 \u043d\u0435\u0442.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/6d0\/615\/510\/6d0615510fde8717706883e228f2e59d.png\"\/><\/p>\n<p>  \u0421ustom-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u043e\u043d\u0438 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f udf) \u043d\u0430\u0434\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u2014 \u0437\u0430\u044f\u0432\u0438\u0442\u044c, \u043a\u0430\u043a \u043e\u043d\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u043e\u0442\u043e\u043c \u0435\u0435 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u0440\u0433\u0430\u0442\u044c \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u0432\u043e\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u0430\u044e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 notGarbage. \u041c\u043e\u0439 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 udf1, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 string (\u0441\u043b\u043e\u0432\u043e), \u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u2014 boolean (\u043c\u0443\u0441\u043e\u0440 \u0438\u043b\u0438 \u043d\u0435 \u043c\u0443\u0441\u043e\u0440).<\/p>\n<p>  \u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u043a\u0430\u043a \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u0432\u043e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"java\">@Service public class PopularWordsResolverWithUDF { @Autowired private GarbageFilter garbageFilter; @Autowired private SQLContext sqlContext; @PostConstruct public void registerUdf(){ sqlContext.udf().register(garbageFilter.udfName(),garbageFilter, DataTypes.BooleanType); } public List&lt;String&gt; mostUsedWords(DataFrame dataFrame, int amount) { DataFrame sorted = dataFrame.withColumn(&quot;words&quot;, lower(column(&quot;words&quot;))) .filter(callUDF(garbageFilter.udfName(),column(&quot;words&quot;)))\u2026 <\/code><\/pre>\n<p>  \u0421\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432 \u0441\u0432\u043e\u0435\u043c PostConstruct \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0435\u0435.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u044f \u0434\u0435\u043b\u0430\u044e callUDF \u0438 \u0434\u0430\u044e \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0438\u043c\u044f \u2014 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043e\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u0442\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u0447\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0433\u0434\u0435-\u0442\u043e \u0441\u0438\u0434\u0438\u0442 \u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f. \u0411\u0443\u0434\u0435\u0442 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e udf-\u0444\u0443\u043d\u043a\u0446\u0438\u044f.<\/p>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u00a0\u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 UDF \u0444\u0443\u043d\u043a\u0438\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0443\u0442\u043e\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u0443\u0436\u0435 \u0434\u043e\u0433\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u044f \u043c\u043e\u0433\u0443 \u043f\u0440\u0438\u0434\u043c\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e @RegisterUDF \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c BPP \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c.<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u0435 \u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0430\u043d\u0430\u043b\u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u043f\u0435\u0441\u0435\u043d \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f (\u0443 \u043c\u0435\u043d\u044f \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c Tomcat, \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440):<br \/>  \u0412\u043e\u0442 10 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0441\u043b\u043e\u0432 \u041a\u044d\u0442\u0442\u0438 \u041f\u044d\u0440\u0438:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ed0\/df0\/7fb\/ed0df07fb552c926c9ee6b0995317e61.png\"\/><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0411\u0440\u0438\u0442\u043d\u0438 \u0421\u043f\u0438\u0440\u0441 \u0441 \u041a\u044d\u0442\u0442\u0438 \u041f\u044d\u0440\u0438 (\u043c\u044b \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a):<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/641\/f10\/b34\/641f10b3430f9228df78ff5dee14b611.png\"\/><\/p>\n<p>  \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u0432\u0443\u0445 \u0430\u0440\u0442\u0438\u0441\u0442\u043e\u0432 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432 \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f. \u0423 \u0411\u0440\u0438\u0442\u0438 \u0421\u043f\u0438\u0440\u0441 \u0438 \u041a\u044d\u0442\u0442\u0438 \u041f\u044d\u0440\u0438 \u0438\u0437 6 \u0441\u043b\u043e\u0432 4 \u043e\u0431\u0449\u0438\u0435.<br \/>  \u041a\u044d\u0442\u0442\u0438 \u041f\u044d\u0440\u0438:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8b3\/4f8\/8eb\/8b34f88eb2c1369f0c07cdb4ac505c62.png\"\/><\/p>\n<p>  \u0411\u0440\u0438\u0442\u043d\u0438 \u0421\u043f\u0438\u0440\u0441:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/554\/36f\/497\/55436f497ab97fb49aee4d911a3415cb.png\"\/><\/p>\n<p>  \u0410 \u0443 Pink Floyd 0 \u043e\u0431\u0449\u0438\u0445 \u0441\u043b\u043e\u0432 \u0441 \u0411\u0440\u0438\u0442\u043d\u0438 \u0421\u043f\u0438\u0440\u0441. \u0412\u043e\u0442, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0437\u0434\u0435\u0441\u044c \u0431\u044b\u043b\u043e:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cd8\/4a8\/9a1\/cd84a89a1d6c065f6e75c301fda0279e.png\"\/><\/p>\n<h3>\u0412\u044b\u0432\u043e\u0434\u044b<\/h3>\n<p>  <\/p>\n<ul>\n<li>Hadoop \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 Spark, \u043d\u043e Spark \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 Hadoop. \u041f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0435 Yarn, \u043d\u043e \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c, \u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u2014 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0434\u043e;\n<\/li>\n<li>\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 Scala, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0430\u043c\u0438. \u0412\u044b \u0434\u0430\u0436\u0435 \u043d\u0435 \u043f\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0442\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u044b;\n<\/li>\n<li>\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434: \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f, Spring, \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0438 \u0442.\u0434.;\n<\/li>\n<li>\u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b. \u041e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u044e\u043d\u0438\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u043c bean, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c, \u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f;\n<\/li>\n<li>\u043f\u043e\u0447\u0442\u0438 \u0432\u0435\u0437\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0430\u043c\u0438 (\u0441 \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043a\u0430\u043a \u0432\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0438 \u0432\u0441\u0435 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u0443\u044e \u0434\u0430\u0442\u0443).  <\/li>\n<\/ul>\n<p>  \u0410 \u0441\u0430\u043c\u044b\u0439 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434: <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/690\/45d\/894\/69045d894fcbf1cd61e678ecc11099d5.png\"\/>  <\/p>\n<hr\/>\n<p>  <i>\u041b\u0438\u0447\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c\u0441\u044f \u0441 \u0416\u0435\u043d\u0435\u0439 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0441\u043a\u043e\u0440\u043e:<br \/>  \u2014 5 \u0430\u043f\u0440\u0435\u043b\u044f \u043d\u0430 Spark-\u0442\u0440\u0435\u043d\u0438\u043d\u0433\u0435. \u0422\u0440\u0435\u043d\u0438\u043d\u0433 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0434\u043e\u043a\u043b\u0430\u0434, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u0438\u043b\u044c\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439, \u043d\u043e \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435. \u0422\u0430\u043a \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043a\u043e\u043f\u0430\u0442\u044c Spark \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u044e\u0430\u043d\u0441\u0430\u043c\u0438 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u043d \u0432\u0430\u043c \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e-\u0442\u043e \u0438 \u043d\u0443\u0436\u0435\u043d. \u0410 \u0432\u043e\u0442 \u0435\u0441\u043b\u0438 \u0440\u0435\u0448\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u0438 \u0441\u0440\u0430\u0437\u0443: \u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u043a \u0437\u0430 \u0434\u0435\u043d\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u0438 \u0432\u0441\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043b\u0438\u0447\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c, \u0438 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u043b\u0435\u0433\u043a\u043e, \u2014 \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043d\u0430 <a href=\"https:\/\/jpoint.ru\/trainings\/welcome-to-spark\/\">\u0442\u0440\u0435\u043d\u0438\u043d\u0433 \u00ab\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 Spark!\u00bb<\/a>. <\/p>\n<p>  \u2014 7-8 \u0430\u043f\u0440\u0435\u043b\u044f \u043d\u0430 <a href=\"https:\/\/jpoint.ru\/\">JPoint 2017<\/a>. \u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043e\u043d \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u0442 \u0441 \u0434\u0432\u0443\u043c\u044f \u0434\u043e\u043a\u043b\u0430\u0434\u0430\u043c\u0438: <a href=\"https:\/\/jpoint.ru\/talks\/spring-deep-and-not-very\/\">\u00abSpring \u2013 \u0413\u043b\u0443\u0431\u043e\u043a\u043e \u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c\u00bb<\/a> \u0438 <a href=\"https:\/\/jpoint.ru\/talks\/spring-test-horror\/\">\u00ab\u041f\u0440\u043e\u043a\u043b\u044f\u0442\u0438\u0435 Spring Test\u00bb<\/a>. \u041f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u0432 \u0432 \u0434\u0438\u0441\u043a\u0443\u0441\u0441\u0438\u043e\u043d\u043d\u043e\u0439 \u0437\u043e\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u0440\u043e\u0441\u044b \u0441 \u043f\u0440\u0438\u0441\u0442\u0440\u0430\u0441\u0442\u0438\u0435\u043c \u043e\u0431\u043e \u0432\u0441\u0435\u043c, \u0447\u0442\u043e \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e!<\/p>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u043d\u0430 JPoint \u0435\u0441\u0442\u044c \u0446\u0435\u043b\u0430\u044f \u043a\u0443\u0447\u0430 \u043a\u0440\u0443\u0442\u044b\u0445 \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043e \u0432\u0441\u0435\u043c \u0438\u0437 \u043c\u0438\u0440\u0430 Java \u2014 \u043e\u0431\u0437\u043e\u0440 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u0432 \u043c\u044b \u0434\u0430\u0432\u0430\u043b\u0438 <a href=\"https:\/\/habrahabr.ru\/company\/jugru\/blog\/323040\/\">\u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0441\u0442\u0435<\/a>, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u043d\u0430 <a href=\"https:\/\/jpoint.ru\/\">\u0441\u0430\u0439\u0442\u0435<\/a> \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u044f.<\/i><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/325070\/\"> https:\/\/habrahabr.ru\/post\/325070\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043e\u0431\u043b\u0430\u0433\u043e\u0440\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0445\u0430\u0440\u0434\u043a\u043e\u0440\u043d\u044b\u0435 \u0434\u043e\u043a\u043b\u0430\u0434\u044b \u0441\u043f\u0438\u043a\u0435\u0440\u043e\u0432 JPoint 2016. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u043e\u043c\u0435\u043d\u044c\u0448\u0435, \u0432\u0441\u0435\u0433\u043e \u0447\u0430\u0441 \u0441 \u043a\u043e\u043f\u0435\u0439\u043a\u0430\u043c\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u044b \u0438 \u043e\u0442\u0436\u0438\u0433\u0430 \u043d\u0430 \u043e\u0434\u043d\u0443 \u043c\u0438\u043d\u0443\u0442\u0443 \u0437\u0430\u0448\u043a\u0430\u043b\u0438\u0432\u0430\u0435\u0442. <\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0415\u0432\u0433\u0435\u043d\u0438\u0439 <a href=\"https:\/\/habrahabr.ru\/users\/evgenyborisov\/\" class=\"user_link\">EvgenyBorisov<\/a> \u0411\u043e\u0440\u0438\u0441\u043e\u0432 \u043e Spark, \u043c\u0438\u0444\u0430\u0445 \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u0442\u043e\u043c, \u0434\u0435\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438 \u0442\u0435\u043a\u0441\u0442\u044b Pink Floyd \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u0435\u0435, \u0447\u0435\u043c \u0443 \u041a\u044d\u0442\u0438 \u041f\u044d\u0440\u0440\u0438.  <\/p>\n<hr\/>\n<p>  <\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0px; width: 100%; height: 0px; position: relative; padding-bottom: 56.2493%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/XLSQJQjmFFw?rel=0&amp;showinfo=1\" frameborder=\"0\" allowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" style=\"top: 0px; left: 0px; width: 100%; height: 100%; position: absolute;\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u043e Spark.<br \/>  \u041e\u0431\u044b\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u043e Spark, \u043a\u0430\u043a\u043e\u0439 \u043e\u043d \u043a\u0440\u0443\u0442\u043e\u0439, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043a\u043e\u0434 \u043d\u0430 Scala. \u041d\u043e \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0430\u044f \u0446\u0435\u043b\u044c. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u044e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Spark \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d. \u041d\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u044b, \u043a\u0430\u043a Java-\u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440\u044b, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0412 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u043c\u044b \u0440\u0430\u0437\u0432\u0435\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u0444\u043e\u0432 \u043e Spark.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-284233","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/284233","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=284233"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/284233\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=284233"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=284233"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=284233"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}