2 Вопрос: Файл с одной строкой около 4G для загрузки в Spark

вопрос создан в Thu, May 2, 2019 12:00 AM

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

val data= spark.sparkContext.textFile("location") 
data.count 

Невозможно вернуть какое-либо значение.

Пытался прочитать файл как строку со следующим кодом, пытаясь записать в коде Java.

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.Path
import org.apache.hadoop.fs.FileSystem
val inputPath = new Path("File")
val conf = spark.sparkContext.hadoopConfiguration
val fs = FileSystem.get(conf)
  val inputStream = fs.open(inputPath)
import java.io.{BufferedReader, InputStreamReader}
val readLines = new BufferedReader(new InputStreamReader(inputStream)).readLine()

JVM закрывается со следующей ошибкой.

ava HotSpot (TM) Предупреждение о 64-разрядной виртуальной машине для 64-разрядного сервера: INFO: os :: commit_memory (0x00007fcb6ba00000, 2148532224, 0) не удалось; error = 'Невозможно выделить память' (errno = 12)

Недостаточно памяти для продолжения среды выполнения Java.  При выделении собственной памяти (mmap) не удалось сопоставить 2148532224 байта для фиксации зарезервированной памяти.

Проблема в том, что целые данные находятся в одной строке, используя \n для идентификации новой записи (новой строки). Поскольку \n он пытается загрузить в одну строку, что создает проблемы с памятью

Я могу разделить эту длинную строку по длине, добавить символ новой строки для каждых 200 символов (0,200) первой строки. (200 400) - вторая строка.

Пример ввода

This is Achyuth This is ychyath This is Mansoor ... .... this line size is more than 4 gigs.

Вывод

This is Achyuth
This is ychyath
This is Mansoor
. 
. 
.
    
- 1
  1. Вы пытались просто увеличить пространство кучи JVM?
    2019-05-03 00: 16: 31Z
  2. @ cricket_007, yes Увеличен размер примерно до 32 г для загрузки файла 4 гигабайта
    2019-05-03 00: 18: 29Z
  3. Почему такой большой? У тебя так много на одной машине?
    2019-05-03 00: 19: 35Z
  4. Да, у нас есть память. Весь файл представляет собой одну строку, искра или hadoop использует новую строку хартии для обработки их как новой строки. Я поражен там
    2019-05-03 00: 23: 01Z
  5. Непонятно, чего вы на самом деле хотите, кроме чтения всей строки сразу ... BufferedReader имеет больше методов, чем просто readLine()
    2019-05-03 00: 27: 28Z
2 ответа                              2                         

Этот подход работает, если размер файла кратен размеру разделения и кодировка символов имеет фиксированную длину (ASCII, UTF-16, UTF-32, нет кодовых точек выше 127 в UTF-8 или аналогичных ... ). р>

Данный файл

This is AchyuthThis is ychyathThis is Mansoor
val rdd = spark
  .sparkContext
  .binaryRecords(path, 15)
  .map(bytes => new String(bytes))
val df = spark.createDataset(rdd)
df.show()

Вывод:

+---------------+
|          value|
+---------------+
|This is Achyuth|
|This is ychyath|
|This is Mansoor|
+---------------+
    
1
2019-05-02 19: 04: 01Z

Spark не имеет возможности установить разделитель EOL для текстового файла.

Лучший способ справиться с этим - использовать настройку textinputformat.record.delimiter в spark вы получите множество вариантов.

    
0
2019-05-05 21: 00: 30Z
источник размещен Вот
Другие вопросы
2
что делает Mono.defer ()?
спросил 2 месяца назад
0
Постоянная работа с Hangfire с MongoDB
спросил 2 месяца назад