Какой *** язык программирования использовать для обработки больших данных?
Nuances of programmingПеревод статьи Ian Pointer: Which freaking big data programming language should I use?
Автор статьи представляет на суд читателя языки программирования для анализа и обработки больших массивов данных. Без навязывания личного мнения, автор старается расширить пониманием читателя и осознанно подойти к выбору, исходя из индивидуальных условий и потребностей.
![](/file/37e2d6bc4e89c72e60d75.png)
Когда дело доходит до масштабируемой обработки данных, в основном, приходится использовать R, Python, Scala и Java
Допустим у вас есть проект с большими данными. Вы разбираетесь в предметной области, знаете, какую инфраструктуру использовать, и, возможно, даже решили использовать определенную среду для обработки, и тут в центре внимания оказывается одна проблема: какой язык программирования выбрать? (Или, возможно, вопрос стоит еще острее: на каком языке заставить работать разработчиков и специалистов по обработке и анализу данных?) Это вопрос, ответ на который можно отложить лишь до поры до времени.
[Загрузите справочник InfoWorld: «Научитесь разгрызать большие данные с помощью R». | Подпишитесь на Big Data Report InfoWorld, чтобы оставаться в курсе последних новостей и разработок в этой области.]
Конечно, ничто не помешает обработать большие данные с помощью, скажем, XSLT преобразований (такая первоапрельская шутка, посмотрите на следующий день на лица этих людей). Однако, как правило, сегодня для обработки больших данных предлагается на выбор три языка– R, Python и Scala – плюс несгибаемая под тяжестью лет универсальная «черепаха» Java. Какой язык выбрать и почему ... или когда?
Чтобы помочь принять решение, дадим краткое описание каждого из упомянутых языков.
R
R часто называют «языком статистиков, созданными статистиками». Если вам нужна эзотерическая статистическая модель для вычислений, скорее всего, вы найдете ее на CRAN – и между прочим, она вовсе не называется «Исчерпывающая и всеобъемлющая сеть архивов кода на R. Для анализа и построения графика вы не сможете использовать ggplot2. И, если вам потребуется больше вычислительной мощности, можно воспользоваться запустить R на Spark (с помощью привязки SparkR).
Однако, если вы не специалист по обработке и анализу данных и никогда не использовали Matlab, SAS или OCTAVE, они могут помочь в первоначальной адаптации к языку R. Хотя он отлично подходит для анализа данных, для общих задач он не настолько хорош . Если построив модель на R, вы бы подумали о ее переводе на Scala или Python для промышленного применения, вы вряд ли станете писать систему управления кластерами с использованием языка R (желаю удачи в отладке, если вы все же за это возьметесь).
Python
Если ваши специалисты по обработке и анализу данных не используют R, они, вероятно, досконально владеют Python. Этот язык популярен в науке на протяжении уже более десятка лет, особенно в таких областях, как обработка естественного языка (NLP – Natural Language Processing). В результате, если у вас есть проект, требующий работы с NLP, вы столкнетесь с удручающе огромным количеством вариантов, включая классический NTLK, выделением тем текстов на естественном языке с помощью GenSim или молниеносной быстротой и точность spaCy. Подобным же образом, Python имеет огромные преимущества в прикладных задачах для нейронных сетей, с помощью Theano и Tensorflow; имеется scikit-learn для машинного обучения, а также NumPy и Pandas для анализа данных.
Также имеется Juypter / iPython – веб-сервер, который позволяет использовать микс из кода, графиков, ну и, всего, что может потребоваться в формате журнала. Сначала, казалось, это вероятный убийца Python, но к сейчас эта концепция стала настолько признанной, что распространилась на большинство языков, поддерживающих REPL-концепцию (цикл чтение-вычисление-печать – Read-Evaluate-Print-Loop), включая Scala и R.
Python, как правило, поддерживается фреймворками обработки больших данных, но в то же время он не входит в высшую лигу в этой сфере. Например, новые функции Spark почти всегда выходят в первую очередь для Scala / Java, тогда как для PySpark может потребовать ожидание нескольких новых младших версий (особенно это касается разработки на Spark Streaming / MLLib).
В отличие от R, Python является традиционным объектно-ориентированным языком программирования, поэтому большинству разработчиков будет комфортно с ним работать, тогда как уже начальное знакомство с R или Scala может отпугнуть. Трудностью может стать и соблюдение правильных отступов в форматировании программного кода. Эта особенность делит программистов на две группы: на тех, для кого «это отлично подходит для обеспечения удобочитаемости» и тех, кто считает, что в 2016 году отпадет необходимость бороться с интерпретатором за запуск программы на исполнение, потому что строка является лишним, неуместным символом (вы, наверное, догадываетесь к чему я клоню).
Scala
Ох, Scala – из четырех рассматриваемых языков программирования, Scala – это язык, который любого восхитит своей системой типов. Начиная с JVM, Scala – это, в общем, успешный брак между функциональной и объектно-ориентированной парадигмами, и в настоящее время он нашел весьма успешное применение в финансовой сфере и среди компаний, работающих с большими объемами данных, зачастую плохо структурированных (например, такими как Twitter и LinkedIn). Этот язык к тому же теснит как Spark, так и Kafka.
Поскольку он работает на JVM, это дает бесплатный доступ к экосистеме Java, хотя у него имеется и множество «родных» библиотек для обработки масштабных данных (в частности, Algebird и Summingbird от Twitter). Он также включает очень удобный REPL для интерактивной разработки и анализа, как в Python и R.
Мне очень нравится Scala, поскольку включает множество полезных функций программирования, таких как сопоставление с образцами (паттернами проектирования) и значительно менее многословен, чем стандартный Java. Однако в Scala часто имеется несколько способов что-то сделать и эта особенность языка используется в его рекламе как преимущество. И это хорошо! Но учитывая, что в Scala имеет полную по Тьюрингу систему типов и всевозможные операторы ('/:' для foldLeft и ': \' для foldRight), довольно просто открыв файл с кодом на Scala подумать, что вы видите на особенно отвратительный вариант кода на Perl. Необходим хороший опыт и подробные рекомендаций для успешного написания кода на Scala (имеет смысл посмотреть рекомендации от Databricks).
Еще одним недостатком является медленная работа компилятора Scala, что в каком-то смысле возвращает нас во времена классической «компиляции!» (лента XKCD). Тем не менее, у него есть REPL, поддержка больших данных и веб-тетради в формате Jupyter и Zeppelin, благодаря чему этому языку можно простить его многочисленные причуды.
Java
Наконец, всегда есть Java – нелюбимая, покинутая, принадлежащая компании, которая, единственная, по-видимому, о не только и заботится, которая делает деньги из исков против Google, и совершенно немодная. Только промышленные дроны используют Java! Однако Java может отлично подойти для вашего проекта по большим данным. Рассмотрим Hadoop MapReduce - Java. HDFS? Написан на Java. Даже Storm, Kafka и Spark работают на JVM (в Clojure и Scala), а что означает, что Java является перворазрядным рекордсменом на участие в проектах по большим данным. Также возникаю новые технологии, такие как Google Cloud Dataflow (теперь Apache Beam), которые до недавнего времени поддерживались только на Java.
Java, возможно, сегодня и не является самым предпочитаемым и звездным языком. Но пока большинство перенапрягается при попытках разбраться с обратными вызовами в Node.js-приложениях, применение Java открывает доступ к большой экосистеме профилировщиков, отладчиков, средств мониторинга, библиотек для обеспечения безопасности и, множеству всего прочего, большинство из которых прошли «боевые» испытания в течение последних двух десятков лет. (Прошу прощения, в этом году Java исполняется 21 год, все мы стареем.)
Основными притензиями к Java являются многословность и отсутствие REPL (представленных в R, Python и Scala) для итеративного применения. Я видел десяти строковый Scala-код в Spark в 200-строчном чудовище на Java, в купе с огромным количеством операторов типов, занимающих большую часть экрана. Тем не менее, новая поддержка лямбда в Java 8 привносит многое для исправления этой ситуации. Java никогда не будет такой компактной, как Scala, но Java 8 действительно делает разработку на Java менее болезненной.
А как насчет REPL? Хорошо, тут вы попали в точку. Но Java 9 будет включать JShell, которая сможет удовлетворить всех ваши потребности в REPL.
А теперь - внимание
Какой язык следует использовать для вашего проекта больших данных? Боюсь, я собираюсь просто уйти от прямого ответа, утверждая, что «это зависит от…». Если вы проводите анализ больших данных с загадочными статистическими расчетами, тогда вы будете просто не в своём уме, если откажетесь от использования R. Если вы занимаетесь NLP или интенсивной обработкой данных с помощью нейронных сетей на графических процессорах, то Python – наилучший выбор. А для высокопроизводительных решений с применением всех важных средств обработки отличным выбором станут Java или Scala.
Конечно, не стоит впадать и в другую крайность – или-или. Например, вы можете использовать Spark для моделирования и машинного обучения на хранимых данных с помощью R или Python, а затем создать рабочий (промышленный) вариант, который сможет использоваться вашим приложением на Scala Spark Streaming. Не стоит также пренебрегать и использованием однородного набора языков, обладающих сильными сторонами только с точки зрения обработки больших данных (в противном случае ваша команда может начать быстро страдать от языковой усталости).
Статью перевел Владислав Семёнов.