Могу ли я обработать 100 ГБ данных, используя Apache Spark на моей локальной машине? - PullRequest
0 голосов
/ 26 февраля 2020

У меня около 100 ГБ данных пользователей, и я хочу обработать их с помощью Apache Spark на своем ноутбуке. Я установил oop и Spark, и для теста я загрузил файл размером около 9 ГБ в HDFS и получил доступ к & запросил его, используя pyspak .

В тестовом файле всего 113959238 записей / строк, когда я запросил данные для конкретного пользователя, т.е.

select * from table where userid=???? 

, для получения записей этого пользователя потребовалось около 6 минут, и если я запустите весь файл, тогда это займет много времени. Анализ, который я должен выполнить для этих данных, состоит в том, чтобы извлечь записи пользователей, выполнить некоторые операции с ними, а затем обработать данные второго пользователя и так далее для всех пользователей в файле. Данные, запрашиваемые пользователем, не будут много, поэтому они могут быть загружены в память и операции могут быть выполнены быстрее. Но запрос записи о пользователе из этого большого файла требует времени и замедлит процесс.

Говорят, что Spark светится быстро, поэтому я наверняка что-то упущу, поэтому так долго. Одна вещь, которую я заметил при выполнении запросов, это то, что Spark не использовал полную оперативную память, а почти 100% ЦП.

Мои характеристики машины:

enter image description here

Я также запрашивал данные непосредственно из текстового файла, используя Spark вместо файла HDFS, но не было большой разницы во времени. Код python, который я написал, -

 from pyspark import SparkContext, SparkConf
 from pyspark.sql import SparkSession, HiveContext,SQLContext
 import time
 conf=SparkConf()
 conf.set("spark.executor.memory", "8g")
 conf.set("spark.driver.memory", "8g")
 sparkSession = SparkSession.builder.appName("example-pyspark-read-and-write").getOrCreate()
 sc=sparkSession.sparkContext.getOrCreate(conf)
 sqlContext=SQLContext(sc)
 #df_load = sparkSession.read.format("csv").option("header","true").load("hdfs://0.0.0.0:19000/test.txt")
 df_load = sparkSession.read.format("csv").option("header","true").load("C:/Data/test_file/test.txt")
 table=df_load.registerTempTable('test')
 sp_tstart=time.time()
 df=sqlContext.sql("select * from test where user_id='12345'")
 db=df.rdd.collect()
 sp_tend=time.time()
 t_time=sp_tend-sp_tstart
 df.show()
 print(t_time/60)

Учитывая мои машинные характеристики, Spark занимает нормальное время или мне нужно что-то настраивать? Нужно ли обновлять спецификации или достаточно для этих данных?

Ответы [ 4 ]

2 голосов
/ 16 марта 2020

Одна из вещей, которую нужно понять со Spark, oop и другими поставщиками больших данных, заключается в том, что они не стремятся получить максимально возможную пропускную способность от отдельной машины. Они нацелены на то, чтобы вы могли эффективно распределить обработку по нескольким машинам. Они жертвуют определенным количеством пропускной способности отдельных машин, чтобы обеспечить горизонтальную масштабируемость.

Хотя Spark можно запустить только на одной машине, основные причины для этого - изучить Spark или написать тестовый код для последующего развертывания на работать с кластером с большим количеством данных.

Как уже отмечали другие, если вы просто хотите обрабатывать данные на одном компьютере, то есть библиотеки, которые будут более эффективными в этом сценарии. 100 ГБ - это не огромное количество для обработки на одной машине.

Судя по всему, вам лучше импортировать эти данные в базу данных и добавить подходящую индексацию. Еще одна вещь, которую нужно понять, заключается в том, что большая часть систем больших данных заключается в поддержке анализа и обработки большей части или всех данных. Традиционные системы баз данных, такие как Postgres или SQL Server, могут хорошо работать с терабайтами данных, когда вы в основном запрашиваете небольшие объемы данных, используя индексы.

1 голос
/ 16 марта 2020

Если ваша задача - проанализировать 100 ГБ данных с использованием python, и для искры не требуется, вы также можете взглянуть на результаты. https://dask.org/ Его проще настроить и использовать с python.

Например, кадр данных dask: https://docs.dask.org/en/latest/dataframe.html

>>> import dask.dataframe as dd
>>> df = dd.read_csv('2014-*.csv')
>>> df.head()
   x  y
0  1  a
1  2  b
2  3  c
3  4  a
4  5  b
5  6  c

>>> df2 = df[df.y == 'a'].x + 1
0 голосов
/ 11 марта 2020

Тип работы, который вы описали, это процесс с высокой загрузкой процессора, который, к сожалению, значительно ускорится, если выполнить много параллельных запросов для разделов набора данных. Усугубьте проблему с нехваткой системной памяти для хранения всего набора данных, и теперь вы также ограничены значительным чтением / записью на жесткий диск.

Это тип задачи, в которой Spark действительно сияет. Причина, по которой вы не испытываете никакого улучшения производительности, заключается в том, что в одной системе вы полностью упускаете преимущество Spark, а именно возможность разбивать набор данных на несколько разделов и распределять их по множеству компьютеров, которые могут работать на многих разные идентификаторы пользователей одновременно.

Каждый рабочий узел в вашем кластере будет иметь меньший набор данных для просмотра, что означает, что на каждом узле весь набор данных, который он просматривает, может быть легко сохранен в памяти. Каждую функцию поиска и замены (по одной на идентификатор пользователя) можно отправить на одно ядро ​​ЦП, что означает, что если у вас есть 5 рабочих с 16 ядрами в каждом, вы можете обрабатывать 80 идентификаторов за раз, из памяти, на оптимизированном размере раздела.

Google CloudPro c и Azure Блоки данных - это супер-платформы для этого. Просто выберите количество рабочих, которое вам нужно, и процессор / память каждого узла, и запустите кластер. Подключитесь к своим данным и начните использовать код PySpark. Он может обрабатывать эти данные так быстро, что даже если вы платите за каждую минуту за кластер, он окажется очень дешевым (возможно, 10-20 долларов).

0 голосов
/ 26 февраля 2020

Вам не нужен Had oop для локальной обработки файла.

Преимущества Had oop применимы только в том случае, если вы используете более одного компьютера, так как ваш файл будет разбит на части и распределен по многим процессы сразу.

Аналогично, 100 ГБ открытого текста на самом деле не являются «большими данными»; он по-прежнему умещается на одном компьютере и, если он хранится в лучшем формате, например, OR C или Parquet, будет значительно меньше по размеру

. Кроме того, для ускорения работы не используйте collect ()

Если вы просто хотите искать данные по идентификатору, используйте базу данных значений ключей, такую ​​как Redis или Accumulo, а не Hadoop / Spark

...