Spark jar работает слишком долго [дубликат]

Если строка, которую вам нужно добавить, это SVG, и вы добавляете правильное пространство имен, вы можете проанализировать строку как XML и добавить к родительскому.

var xml = jQuery.parseXML('<circle xmlns="http://www.w3.org/2000/svg" cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/>');
$("svg").append(xml.documentElement))
6
задан zero323 24 August 2015 в 20:04
поделиться

2 ответа

Подходит ли несериализованная таблица к 40 ГБ?

В любом случае, когда вы используете стандартный JDBC с синтаксисом ansi SQL, вы используете механизм БД, поэтому, если teradata (я не знаю teradata) содержит статистику вашего таблица, классический «select count (*) из таблицы» будет очень быстрым. Вместо этого искру загружает 100 миллионов строк в памяти с чем-то вроде «select * from table», а затем будет выполнять подсчет строк RDD. Это отличная рабочая нагрузка.

5
ответ дан axlpado - Agile Lab 16 August 2018 в 03:59
поделиться
  • 1
    Я думаю, что это было бы, и я также пытался увеличить память до 100 ГБ, но не видел никаких улучшений. Я не пытаюсь загрузить 100 миллионов строк в памяти, но выполняю некоторую агрегированную операцию, такую ​​как count() в dataframe или count(*) в таблице temp, но Spark занимает слишком много времени. Я также попытался зарегистрировать DF как временную таблицу и сделал простой счет, но занимает примерно одно и то же время. ra1.registerTempTable("ra_dt"); total = sqlContext.sql("select count(*) from ra_dt") – Dev Patel 24 August 2015 в 18:41
  • 2
    Да, но я думаю, что искра не обрезает операцию подсчета на БД-движке, поэтому она будет загружать все строки в памяти, а затем будет выполнять подсчет DF. – axlpado - Agile Lab 24 August 2015 в 18:48
  • 3
    Сколько столбцов у вас в этой таблице, с 100 миллионами строк довольно легко достичь 100 ГБ неэтериализованных объектов. Не могли бы вы разместить схему таблиц? – axlpado - Agile Lab 24 August 2015 в 18:52
  • 4
    Я думаю, что вы правы, я читал несколько других сообщений в Интернете и обнаружил, что Spark пытается загрузить данные перед применением операции подсчета. В таком случае, что было бы идеальным способом быстрее читать этот тип данных в Spark? Другими словами, был бы самый быстрый способ чтения данных в искры apache? Вот моя схема таблицы: root | - field1: decimal (18,0) (nullable = true) | - field2 : string (nullable = true) | - field3: date (nullable = true) | - field4: date (nullable = true) | - field5: integer (nullable = true) | - field6: string (nullable = true ) – Dev Patel 24 August 2015 в 19:46
  • 5
    Spark - это распределенный процессор обработки, поэтому лучший способ загрузить данные в искру - это распределенная файловая система или dbms. В вашем случае, работая над экземпляром signle, я думаю, что вы можете улучшить производительность, указав partitionColumn, lowerBound, upperBound, numPartition, чтобы улучшить параллелизм чтения. Если вам нужно выполнить другие запросы после подсчета, вы можете кэшировать DF перед подсчетом, поэтому первый счет займет свое время, но затем следующие запросы будут в памяти и будут быстрее. – axlpado - Agile Lab 24 August 2015 в 20:22

Все операции агрегации выполняются после того, как весь набор данных будет извлечен в память в коллекцию DataFrame. Таким образом, счет в Spark никогда не будет таким эффективным, как это было бы непосредственно в TeraData. Иногда стоит подталкивать некоторые вычисления в базу данных, создавая представления, а затем сопоставляя эти представления с помощью JDBC API.

Каждый раз, когда вы используете драйвер JDBC для доступа к большой таблице, вы должны указать стратегию разделения в противном случае вы создадите DataFrame / RDD с одним разделом, и вы перегрузите одно соединение JDBC.

Вместо этого вы хотите попробовать следующий AI (начиная с Spark 1.4.0 +):

sqlctx.read.jdbc(
  url = "<URL>",
  table = "<TABLE>",
  columnName = "<INTEGRAL_COLUMN_TO_PARTITION>", 
  lowerBound = minValue,
  upperBound = maxValue,
  numPartitions = 20,
  connectionProperties = new java.util.Properties()
)

Существует также возможность отбрасывать некоторую фильтрацию.

Если у вас нет равномерно распределенного интегрального столбца, вы хотите создать некоторые пользовательские разделы, указав пользовательские предикаты (where). Например, предположим, что у вас есть столбец timestamp и вы хотите разделить по диапазонам дат:

    val predicates = 
  Array(
    "2015-06-20" -> "2015-06-30",
    "2015-07-01" -> "2015-07-10",
    "2015-07-11" -> "2015-07-20",
    "2015-07-21" -> "2015-07-31"
  )
  .map {
    case (start, end) => 
      s"cast(DAT_TME as date) >= date '$start'  AND cast(DAT_TME as date) <= date '$end'"
  }

 predicates.foreach(println) 

// Below is the result of how predicates were formed 
//cast(DAT_TME as date) >= date '2015-06-20'  AND cast(DAT_TME as date) <= date '2015-06-30'
//cast(DAT_TME as date) >= date '2015-07-01'  AND cast(DAT_TME as date) <= date '2015-07-10'
//cast(DAT_TME as date) >= date '2015-07-11'  AND cast(DAT_TME as date) <= date //'2015-07-20'
//cast(DAT_TME as date) >= date '2015-07-21'  AND cast(DAT_TME as date) <= date '2015-07-31'


sqlctx.read.jdbc(
  url = "<URL>",
  table = "<TABLE>",
  predicates = predicates,
  connectionProperties = new java.util.Properties()
)

Он сгенерирует DataFrame, где каждый раздел будет содержать записи каждого подзапроса, связанные с различными предикатами.

Проверьте исходный код на DataFrameReader.scala

10
ответ дан Ram Ghadiyaram 16 August 2018 в 03:59
поделиться
  • 1
    @ zero323 , @Gianmario Spacagna , если мне действительно нужно прочитать всю таблицу MySQL (а не просто получить count), тогда как я могу улучшить вялая производительность Spark-SQL? Я уже распараллеливаю операцию чтения с использованием метода spark.read.jdbc(..numPartitions..) . – y2k-shubham 6 March 2018 в 13:26
  • 2
    Моя таблица MySQL (InnoDB) имеет ~ записи 186M , которые находятся вокруг 149 GB (согласно статистике, показанной phpMyAdmin), и я использую numPartitions = 32 , [ Spark 2.2.0 ] Я нахожусь на EMR 5.12.0 с 1 master, 1 task и 1 core (все r3.xlarge , 8 vCore, Память 30.5 GiB, память 80 SSD GB). Я обнаружил, что чтение MySQL таблицы в DataFrame завершается с ошибкой, если я НЕ limit записи в ~ 1.5-2M . Он дает длинную трассировку стека , которая имеет javax.servlet.ServletException: java.util.NoSuchElementException: None.get & amp; java.sql.SQLException: Incorrect key file for table.. – y2k-shubham 6 March 2018 в 13:48
Другие вопросы по тегам:

Похожие вопросы: