Treadstream execute error

I am writing a java program to read the error stream from a process . Below is the structure of my code -- ProcessBuilder probuilder = new ProcessBuilder( command ); Process process =

I am writing a java program to read the error stream from a process . Below is the structure of my code —

ProcessBuilder probuilder = new ProcessBuilder( command );              
Process process = probuilder.start(); 
InputStream error = process.getErrorStream();
InputStreamReader isrerror = new InputStreamReader(error);
BufferedReader bre = new BufferedReader(isrerror);
while ((linee = bre.readLine()) != null) {
        System.out.println(linee);
    }

The above code works fine if anything is actually written to the error stream of the invoked process. However, if anything is not written to the error stream, then the call to readLine actually hangs indefinitely. However, I want to make my code generic so that it works for all scenarios. How can I modify my code to achieve the same.

Regards,
Dev

asked Oct 16, 2012 at 6:28

user496934's user avatar

readline() is a blocking call. It will block until there’s a line to be read (terminated by an end of line character) or the underlying stream is closed (returning EOF).

You need to have logic that is checking BufferedReader.ready() or just using BufferedReader.read() and bailing out if you decide you’re waiting long enough (or want to do something else then check again).

Edit to add: That being said, it shouldn’t hang «indefinitely» as-is; it should return once the invoked process terminates. By any chance is your invoked process also outputting something to stdout? If that’s the case … you need to be reading from that as well or the buffer will fill and will block the external process which will prevent it from exiting which … leads to your problem.

answered Oct 16, 2012 at 6:34

Brian Roach's user avatar

Brian RoachBrian Roach

75.6k12 gold badges135 silver badges161 bronze badges

This is a late reply, but the issue hasn’t really solved and it’s on the first page for some searches. I had the same issue, and BufferedReader.ready() would still set up a situation where it would lock.

The following workaround will not work if you need to get a persistent stream. However, if you’re just running a program and waiting for it to close, this should be fine.

The workaround I’m using is to call ProcessBuilder.redirectError(File). Then I’d read the file and use that to present the error stream to the user. It worked fine, didn’t lock. I did call Process.destroyForcibly() after Process.waitFor() but this is likely unnecessary.

Some pseudocode below:

    File thisFile = new File("somefile.ext");
    ProcessBuilder pb = new ProcessBuilder(yourStringList);
    pb.redirectError(thisFile);
    Process p = pb.start();
    p.waitFor();
    p.destroyForcibly();
    ArrayList fileContents = getFileContents(thisFile);

I hope this helps with at least some of your use cases.

answered Oct 7, 2015 at 15:11

sarysa's user avatar

Something like this might also work and avoid the blocking behaviour (without requiring to create a File)

InputStream error = process.getErrorStream();

// Read from InputStream
for (int k = 0; k < error.available(); ++k)
    System.out.println("Error stream = " + error.read());

From the Javadoc of InputStream.available

Returns an estimate of the number of bytes that can be read (orskipped over) from this input stream without blocking by the nextinvocation of a method for this input stream. The next invocationmight be the same thread or another thread. A single read or skip of thismany bytes will not block, but may read or skip fewer bytes.

answered Sep 12, 2022 at 7:55

finrod's user avatar

finrodfinrod

5018 silver badges20 bronze badges

The simplest answer would be to simply redirect the error stream to stdout:

process.getErrorStream().transferTo(System.out);

answered Jan 23 at 22:03

CasseroleBoi's user avatar

Ошибка Stream Read Error возникает, когда серверу приложений ЛОЦМАН не достаточно памяти для того, чтобы вернуть все объекты в базу данных.
Если после возникновения ошибки открыть диспетчер задач, то можно увидеть, что скорее всего использованы все доступные ресурсы оперативной и виртуальной памяти. Проблема скорее системная.

Сервер приложений ЛОЦМАН:PLM не ограничивает размер сохраняемого файла.
Существует ограничение ADO/OLEDB (интерфейс MS SQL Server): при работе с файлами требуется

НЕПРЕРЫВНЫЙ БЛОК ПАМЯТИ РАЗМЕРА СООТВЕТСТВУЮЩЕГО ФАЙЛУ

 , который не всегда доступен в системе (даже небольшого размера) — это зависит от степени фрагментированности оперативной памяти.

При использовании Файлового архива это ограничение не действует,
В СУБД Oracle описанная проблема не возникает.

В том случае, если ошибка возникает при наличии файлового архива, в первую очередь необходимо проверить наличие свободного места в архиве. 

Свободное место, доступное для файлового архива указано в ЦУК:
Файловые архивы — [имя файлового архива] справа в информационной области.
Объем памяти, свободный в архиве, и объем памяти доступный на ресурсе где расположен архив не одно и то же!
Так, под архив может быть выделено 50Гб, а на диске свободно 500Гб.
Архив сможет использовать только выделенные ему 50Гб, не зависимо от того, сколько памяти доступно на диске.

Например, в архиве доступно 0,008 Мб, при сохранении файла объемом 30Мб возникает ошибка
Out of memory, Error creating variant or safe array.
Необходимо открыть свойства файлового архива и увеличить максимальный размер архива, в зависимости от потребностей.

 

Рекомендации по избежанию проблемы:

  1. Используйте файловый архив.  
    Перенесите файлы из базы данных в него.  
    Для хранения большого объема файлов лучше использовать файловый архив, а не таблицы базы данных.  
    Подробнее о создании и о работе с файловыми архивами описано в справке на ЦУК/ЛОЦМАН Администратор.
  2. Старайтесь чаще сохранять информацию в БД малыми порциями, тогда вероятность появления упомянутой ошибки снизится.
  3. Установка дополнительных модулей оперативной памяти на машине, где работает сервер приложений ЛОЦМАН.

Содержание

  1. Ошибка ereaderror stream read error
  2. Ошибка ereaderror stream read error
  3. Ошибка Stream Read Error
  4. Сообщения 10
  5. #1 Тема от Dyaka 29 марта 2021 09:58:31
  6. Тема: Ошибка Stream Read Error
  7. #2 Ответ от Олег Зырянов 29 марта 2021 10:07:56
  8. Re: Ошибка Stream Read Error
  9. #3 Ответ от Dyaka 29 марта 2021 10:58:21
  10. Re: Ошибка Stream Read Error
  11. #4 Ответ от Олег Зырянов 29 марта 2021 11:06:08
  12. Re: Ошибка Stream Read Error
  13. #5 Ответ от Dyaka 29 марта 2021 11:17:06
  14. Re: Ошибка Stream Read Error
  15. Ошибка ereaderror stream read error
  16. EReadError (Stream read error) — an error occurred in the application when importing .sql file

Ошибка ereaderror stream read error

Описание ошибки:
Ошибка при запуске базы конфигурации 1С: Управление аптечной сетью 1.4:
Установка параметров СЛК
Укажите параметры соединения с сервером СЛК
Внимание! В клиент-серверном режиме сервер СЛК должен быть доступен на стороне сервера 1С:Предприятие
Ошибка:
(EServerResult.ELicenceNotFound) Ключ защиты серии 6E30 не обнаружены

Возможно, что на сервере, где размещается СЛК произошли какие-то изменения, о которых не оповестили программиста 1С, поэтому данная проблема возникла при запуске конфигурации 1С: Управление аптечной сетью, редакция 1.4 на базе 1С: Управление торговлей редакции 11.4 и не позволяла вести дальнейшую работу с базой.

Нажатие на изображении увеличит его

Надо обратить внимание, что в данном случае в поле «Компьютер» по умолчанию установлено не «localhost», как это устанавливается по умолчанию, а имя сервера, на котором установлена «Консоль сервера СЛК». Ее нужно будет запустить для устранения проблемы. Подробно про Систему лицензирования конфигураций можно прочитать на сайте Рарус.

В браузере откроется «Сервер СЛК». Видно, что есть неопределенные ключи: S/N is not detected Closed: (EReadError) Stream read error

Нажатие на изображении увеличит его

Слева переходим по ссылке «Обновление/восстановление лицензии». И в открывшемся окне нажимаем кнопку «Восстановить/ Обновить автоматически через Интернет» при условии, что интернет на сервере доступен. Если нет, то тогда придется воспользоваться кнопкой «Создать файл» и следовать дальнейшим инструкциям.

Нажатие на изображении увеличит его

В результате успешных операций — Ключ успешно обновлен .

Нажатие на изображении увеличит его

Возвращаемся в активное окно базы 1С 8, если не закрывали и нажимаем кнопку «Применить». Если все удачно, то работа в программе станет возможна. Если базу закрыли, то уже при открытии окно с ошибкой (EServerResult.ELicenceNotFound) Ключ защиты серии 6E30 не обнаружены не возникнет и работа будет возможна.

Нажатие на изображении увеличит его

Источник

Ошибка ereaderror stream read error

Ошибка Stream Read Error возникает, когда серверу приложений ЛОЦМАН не достаточно памяти для того, чтобы вернуть все объекты в базу данных.
Если после возникновения ошибки открыть диспетчер задач, то можно увидеть, что скорее всего использованы все доступные ресурсы оперативной и виртуальной памяти. Проблема скорее системная.

Сервер приложений ЛОЦМАН:PLM не ограничивает размер сохраняемого файла.
Существует ограничение ADO/OLEDB (интерфейс MS SQL Server): при работе с файлами требуется НЕПРЕРЫВНЫЙ БЛОК ПАМЯТИ РАЗМЕРА СООТВЕТСТВУЮЩЕГО ФАЙЛУ , который не всегда доступен в системе (даже небольшого размера) — это зависит от степени фрагментированности оперативной памяти.

При использовании Файлового архива это ограничение не действует,
В СУБД Oracle описанная проблема не возникает.

В том случае, если ошибка возникает при наличии файлового архива, в первую очередь необходимо проверить наличие свободного места в архиве.

Свободное место, доступное для файлового архива указано в ЦУК:
Файловые архивы — [имя файлового архива] справа в информационной области.
Объем памяти, свободный в архиве, и объем памяти доступный на ресурсе где расположен архив не одно и то же!
Так, под архив может быть выделено 50Гб, а на диске свободно 500Гб.
Архив сможет использовать только выделенные ему 50Гб, не зависимо от того, сколько памяти доступно на диске.

Например, в архиве доступно 0,008 Мб, при сохранении файла объемом 30Мб возникает ошибка
Out of memory, Error creating variant or safe array.
Необходимо открыть свойства файлового архива и увеличить максимальный размер архива, в зависимости от потребностей.

Рекомендации по избежанию проблемы:

  1. Используйте файловый архив.
    Перенесите файлы из базы данных в него.
    Для хранения большого объема файлов лучше использовать файловый архив, а не таблицы базы данных.
    Подробнее о создании и о работе с файловыми архивами описано в справке на ЦУК/ЛОЦМАН Администратор.
  2. Старайтесь чаще сохранять информацию в БД малыми порциями, тогда вероятность появления упомянутой ошибки снизится.
  3. Установка дополнительных модулей оперативной памяти на машине, где работает сервер приложений ЛОЦМАН.

Источник

Ошибка Stream Read Error

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Сообщения 10

#1 Тема от Dyaka 29 марта 2021 09:58:31

  • Dyaka
  • Участник
  • Неактивен
  • На форуме с 29 марта 2021
  • Сообщений: 5

Тема: Ошибка Stream Read Error

Добрый день! Не нашел решения проблемы по данному вопросу. При входе в программу и выполнении любого действия у пользователя вылетает ошибка Stream read error. У остальных пользователей все нормально. Переустановка не помогает.

#2 Ответ от Олег Зырянов 29 марта 2021 10:07:56

  • Олег Зырянов
  • Технический руководитель
  • Неактивен
  • Откуда: Новосибирск
  • На форуме с 10 декабря 2008
  • Сообщений: 4,174

Re: Ошибка Stream Read Error

Здравствуйте! Запустите конфигурацию TechnologiCS с ключом /skipreg или удалите вручную *.cfg файлы https://help.technologics.ru/7.9/TCSHelp/_876.htm

Больше всего похожена это. Хотя. Что значит при выполнении любого действия? Программа то работает в итоге?

#3 Ответ от Dyaka 29 марта 2021 10:58:21

  • Dyaka
  • Участник
  • Неактивен
  • На форуме с 29 марта 2021
  • Сообщений: 5

Re: Ошибка Stream Read Error

Здравствуйте! Запустите конфигурацию TechnologiCS с ключом /skipreg или удалите вручную *.cfg файлы https://help.technologics.ru/7.9/TCSHelp/_876.htm

Больше всего похожена это. Хотя. Что значит при выполнении любого действия? Программа то работает в итоге?

Работает, пользователь логинится, но после каждого действия вылетает данная ошибка. Запуск с ключом и удаление .cfg файлов не помогло

#4 Ответ от Олег Зырянов 29 марта 2021 11:06:08

  • Олег Зырянов
  • Технический руководитель
  • Неактивен
  • Откуда: Новосибирск
  • На форуме с 10 декабря 2008
  • Сообщений: 4,174

Re: Ошибка Stream Read Error

А можно точную версию TechnologiCS , и более подробное описание того что просходит, послеlовательно по шагам.
В идеале чтобы шаги эти повторялись, а не были случайными. То есть делаем — ошибка. Еще раз делаем — та же ошибка. Перезапустили TCS, повторяем -снова ошибка эта.

#5 Ответ от Dyaka 29 марта 2021 11:17:06

  • Dyaka
  • Участник
  • Неактивен
  • На форуме с 29 марта 2021
  • Сообщений: 5

Re: Ошибка Stream Read Error

А можно точную версию TechnologiCS , и более подробное описание того что просходит, послеlовательно по шагам.
В идеале чтобы шаги эти повторялись, а не были случайными. То есть делаем — ошибка. Еще раз делаем — та же ошибка. Перезапустили TCS, повторяем -снова ошибка эта.

У пользователя версия 5.7.0.0. Я не большой эксперт этой программы, опишу, как могу. Пользователь логинится, программа загружается, пишет о новых сообщениях, закрываем окно, и вылетает окошко с ошибкой Stream read error. Пользователь его закрывает, делает любой отчет, макрос, ошибка снова вылетает, но действие выполняется. В целом, все работает, просто после каждого действия пользователя с момента входа вылетает окошко с ошибкой.

Источник

Ошибка ereaderror stream read error

Пожалуйста, выделяйте текст программы тегом [сode=pas] . [/сode] . Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как «свернуть» программу в трей.
3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры — внедрение в удаленное адресное прстранство)
. (продолжение следует) .
Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки — бан.
Мат в разделе — бан на три месяца.
Полезные ссылки:
MSDN Library FAQ раздела Поиск по разделу Как правильно задавать вопросы

Выразить свое отношение к модераторам раздела можно здесь: Rouse_, Krid

Источник

EReadError (Stream read error) — an error occurred in the application when importing .sql file

I have googled the problem and found this: http://stackoverflow.com/questions/31242480/importing-sql-file-to-heidisql but I’m sure this file has not been used anywhere else. I guess the reason could be the .sql has tables with Chinese and Japanese characters in it? Any idea?

allocated memory : 73.57 MB largest free block : 8181.43 GB executable : heidisql.exe exec. date/time : 2015-12-08 11:16 version : 9.3.0.5024 compiled with : Delphi XE5 madExcept version : 4.0.12 callstack crc : $e27ced9b, $dc4655bf, $dc4655bf exception number : 1 exception class : EReadError exception message : Stream read error.

main thread ($3d04): 005be30d heidisql.exe System.Classes TStream.ReadBuffer 00969349 heidisql.exe helpers 1288 +15 ReadTextfileChunk 00c2430b heidisql.exe Main 3395 +28 TMainForm.RunQueryFile 00c23759 heidisql.exe Main 3329 +65 TMainForm.RunQueryFiles 00c22d21 heidisql.exe Main 3237 +9 TMainForm.actLoadSQLExecute 005da760 heidisql.exe System.Classes TBasicAction.Execute 00665ae3 heidisql.exe Vcl.ActnList TCustomAction.Execute 005da494 heidisql.exe System.Classes TBasicActionLink.Execute 007eb5dc heidisql.exe Vcl.Menus TMenuItem.Click 007edf0f heidisql.exe Vcl.Menus TMenu.DispatchCommand 007f0464 heidisql.exe Vcl.Menus TPopupList.WndProc 007f0365 heidisql.exe Vcl.Menus TPopupList.MainWndProc 005dbd13 heidisql.exe System.Classes StdWndProc 770e98d5 USER32.dll DispatchMessageW 008145ef heidisql.exe Vcl.Forms TApplication.ProcessMessage 00814663 heidisql.exe Vcl.Forms TApplication.HandleMessage 00814b4f heidisql.exe Vcl.Forms TApplication.Run 00c707d7 heidisql.exe heidisql 78 +24 initialization 76fc5a4b kernel32.dll BaseThreadInitThunk

International characters should not be a problem, but others reported that too, so I must say this can be a problem. I only don’t have a solution for that as I’m unsure about the cause of it.

Please login to leave a reply, or register at first.

Источник

Тема этой главы, потоки в Node.JS. Мы постараемся разобраться в этой теме хорошо и подробно, по сколько, с одной стороны , так получается, что потоки в обычной браузерной JavaScript разработке отсутствуют, а с другой стороны, уверенное владение потоками необходимо для грамотной серверной разработке, по скольку поток, является универсальным способом работы с источниками данных, которые используются повсеместно.

Можно выделить два основных типа потоков.

Первый поток — stream.Readable — чтение.
stream.Readable это встроенный класс, который реализует потоки для чтения, как правило сам он не используется, а используются его наследники. В частности для чтения из файла есть fs.ReadSream. Для чтения запроса посетителя, server.on(‘request’, …req…), при его обработки, есть специальный объект, который мы раньше видели под именем req, первый аргумент обработчика запроса.

Второй поток — stream.Writable — запись.
stream.Writable это универсальный способ записи и здесь тоже, сам stream.Writable обычно не используется, но используются его наследники.
…в файл: fs.WriteStream
…в ответ посетителю: server.on(‘request’, …res…)

Есть и некоторые другие типы потоков, но наиболее востребованные это предыдущие два и производные от них.

Самый лучший способ разобраться с потоками это посмотреть как они работают на практике. Поэтому сейчас мы начнем с того, что используем fs.ReadStream для чтения файла.

var fs = require(‘fs’);

//fs.ReadStream наследует от stream.Readable

var stream = new fs.ReadStream(__filename);

stream.on(‘readable’, function(){

    var data = stream.read();

    console.log(data);

});

stream.on(‘end’, function(){

    console.log(«THE END»);

});

Итак, здесь я подключаю модуль fs  и создаю поток. Поток это JavaScript объект, который получает информацию о ресурсе, в данном случае путь к файлу — «__filename» и который умеет с этим ресурсом работать. fs.ReadStream реализует стандартный интерфейс чтения который описан в классе stream.Readable. Посмотрим его на схеме

screenshot_25_01

Когда создается объект потока — «new stream.Readable», он подключается к источнику данных, в нашем случае это файл, и пытается начать из него читать. Когда он что то прочитал, то он эмитирует событие — «readable», это событие означает, что данные просчитаны и находятся во внутреннем буфере потока, который мы можем получить используя вызов «read()». Затем мы можем что то сделать с данными — «data» и подождать следующего «readable» и снова если придется, и так дальше. Когда источник данных иссяк, бывают конечно источники которые не иссякают, например датчики случайных чисел, но размер файла то ограничен, поэтому в конце будет событие «end», которое означает, что данных больше не будет. Так же, на любом этапе работы с потоком, я могу вызвать метод «destroy()» потока. Этот метод означает, что мы больше не нуждаемся в потоке и можно его закрыть, и закрыть соответствующие источники данных, полностью все очистить.

А теперь вернемся к исходному коду. Итак здесь мы создаем ReadStream

//fs.ReadStream наследует от stream.Readable

var stream = new fs.ReadStream(__filename);

и он тут же хочет открыть файл. Но тут же, в данном случае вовсе не означает на этой же строке, потому что как мы помним, все операции с вводом выводом, реализуются через «LibUV», а «LibUV» устроено так, что все синхронные обработчики ввода вывода сработают на следующей итерации событийного цикла, то есть заведомо после того, как весь текущий JavaScript закончит работу. Это означает, что я могу без проблем навесить все обработчики и я твердо знаю что они будут установлены до того как будет считан первый фрагмент данных. Запускаю этот код и смотрим, что вывелось в консоле

screenshot_25_02

Первое сработало событие ‘readable’ и оно вывело данные, сейчас это обычный буфер, но я могу преобразовать его к строке используя кодировку utf-8 обычным вызовом toString

screenshot_25_03

Еще один вариант, указать кодировку непосредственно при открытии потока

screenshot_25_04

тогда преобразование будет автоматическим и toString() нам не нужен.

Наконец когда файл закончился,

stream.on(‘end’, function(){

    console.log(«THE END»);

});

то событие ‘end’ вывело мне в консоль «THE END». Здесь фай закончился почти сразу, поскольку он был очень маленький. Сейчас я не много модифицирую пример, сделаю вместо «__filename», то есть вместо текущего файла, файл «big.html», который в текущей директории находится.

screenshot_25_05

Файл big.html большой, по этому событие readable срабатывало многократно и каждый раз мы получали очередной фрагмент данных в виде буфера. Так же обратите внимание на вывод null который нас постоянно преследует, о причине этого вывода вы можете прочесть в документации, там сказано, что после того как данные заканчиваются readable возвращает null. Возвращаясь к нашему буферу, давайте я выведу в консоль его размер и заодно сделаю проверку на но то чтоб вывод был не null

var fs = require(‘fs’);

//fs.ReadStream наследует от stream.Readable

var stream = new fs.ReadStream(«big.html»);

stream.on(‘readable’, function(){

    var data = stream.read();

    if(data != null)console.log(data.length);

});

stream.on(‘end’, function(){

    console.log(«THE END»);

});

screenshot_25_06

Эти числа, не что иное как длина прочитанного фрагмента файла, потому что поток когда открывает файл, он читает из него не весь файл конечно же, а только кусок и помещает его в свою внутреннюю переменную и максимальный размер, это как раз шестьдесят четыре килобайта. Пока мы не вызовем stream.read(), он дальше читать не будет. После того как я получил очередные данные, то внутренний буфер очищается и он может еще фрагмент прочитать, и так далее и так далее, последний фрагмент имеет длину остатка данных. На этом примере мы отлично видим важное преимущество использования потоков, они экономят память, какой бы большой файл не был, все равно, единовременно мы обрабатываем вот такой небольшой фрагмент. Второе, менее очевидное преимущество, это универсальность интерфейса. Здесь

var stream = new fs.ReadStream(«big.html»);

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

var fs = require(‘fs’);

var stream = new OurStream(«our resourse»);

stream.on(‘readable’, function(){

    var data = stream.read();

    if(data != null)console.log(data.length);

});

stream.on(‘end’, function(){

    console.log(«THE END»);

});

Потому что потоки это в первую очередь интерфейс, то есть в теории, если наш поток реализует необходимые события и методы, в частности наследует от stream.Readable, то все должно работать хорошо, но это конечно же только в том случае если мы не использовали специальных возможностей, которые есть у файловых потоков. В частности у потока ReadStream есть дополнительные события

var fs = require(‘fs’);

//fs.ReadStream наследует от stream.Readable

var stream = new fs.ReadStream(«big.html»);

stream.on(‘readable’, function(){

    var data = stream.read();

    if(data != null)console.log(data.length);

});

stream.on(‘end’, function(){

    console.log(«THE END»);

});

Здесь изображена схема именно для fs.ReadStram и новые события изображены красным

screenshot_25_07

Вначале это открытие файла, а в конце закрытие. Обратим внимание, что если файл полностью дочитан, то возникает событие «end» затем «close», а если файл не дочитан, например из за ошибки или при вызове метода destroy(), то «end» не будет, поскольку файл не закончился, но всегда гарантируется, при закрытии файла, событие «close».

И наконец, последняя по коду, но не последняя по важности деталь, обработка ошибок. Например посмотрим что будет если файла нет

screenshot_25_08

упс, все упало. Обратите внимание, потоки наследуют от event EventEmitter,  про него была глава, если происходит ошибка, то весь процесс node.js падает. Это в том случае конечно, если  на эту ошибку нет обработчиков, по этому если мы хотим, чтоб Node.JS вообще не упал, то нужно обязательно обработчик поставить

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

var fs = require(‘fs’);

//fs.ReadStream наследует от stream.Readable

var stream = new fs.ReadStream(«none.html»);

stream.on(‘readable’, function(){

    var data = stream.read();

    if(data != null)console.log(data.length);

});

stream.on(‘end’, function(){

    console.log(«THE END»);

});

stream.on(‘error’, function(err){

    if(err.code == ‘ENOENT’){

        console.log(«Файл не найден»);

    }else{

        console.error(err);

    }

});

screenshot_25_09

Итак, для работы с источниками данных в Node.JS используются потоки, здесь мы рассмотрели общую схему по которой они работают

screenshot_25_10

и ее конкретную реализацию, а именно fs.ReadStrem

screenshot_25_11

которая умеет читать из файла.

I am writing a java program to read the error stream from a process . Below is the structure of my code —

ProcessBuilder probuilder = new ProcessBuilder( command );              
Process process = probuilder.start(); 
InputStream error = process.getErrorStream();
InputStreamReader isrerror = new InputStreamReader(error);
BufferedReader bre = new BufferedReader(isrerror);
while ((linee = bre.readLine()) != null) {
        System.out.println(linee);
    }

The above code works fine if anything is actually written to the error stream of the invoked process. However, if anything is not written to the error stream, then the call to readLine actually hangs indefinitely. However, I want to make my code generic so that it works for all scenarios. How can I modify my code to achieve the same.

Regards,
Dev

asked Oct 16, 2012 at 6:28

user496934's user avatar

readline() is a blocking call. It will block until there’s a line to be read (terminated by an end of line character) or the underlying stream is closed (returning EOF).

You need to have logic that is checking BufferedReader.ready() or just using BufferedReader.read() and bailing out if you decide you’re waiting long enough (or want to do something else then check again).

Edit to add: That being said, it shouldn’t hang «indefinitely» as-is; it should return once the invoked process terminates. By any chance is your invoked process also outputting something to stdout? If that’s the case … you need to be reading from that as well or the buffer will fill and will block the external process which will prevent it from exiting which … leads to your problem.

answered Oct 16, 2012 at 6:34

Brian Roach's user avatar

Brian RoachBrian Roach

75.6k12 gold badges135 silver badges161 bronze badges

This is a late reply, but the issue hasn’t really solved and it’s on the first page for some searches. I had the same issue, and BufferedReader.ready() would still set up a situation where it would lock.

The following workaround will not work if you need to get a persistent stream. However, if you’re just running a program and waiting for it to close, this should be fine.

The workaround I’m using is to call ProcessBuilder.redirectError(File). Then I’d read the file and use that to present the error stream to the user. It worked fine, didn’t lock. I did call Process.destroyForcibly() after Process.waitFor() but this is likely unnecessary.

Some pseudocode below:

    File thisFile = new File("somefile.ext");
    ProcessBuilder pb = new ProcessBuilder(yourStringList);
    pb.redirectError(thisFile);
    Process p = pb.start();
    p.waitFor();
    p.destroyForcibly();
    ArrayList fileContents = getFileContents(thisFile);

I hope this helps with at least some of your use cases.

answered Oct 7, 2015 at 15:11

sarysa's user avatar

Something like this might also work and avoid the blocking behaviour (without requiring to create a File)

InputStream error = process.getErrorStream();

// Read from InputStream
for (int k = 0; k < error.available(); ++k)
    System.out.println("Error stream = " + error.read());

From the Javadoc of InputStream.available

Returns an estimate of the number of bytes that can be read (orskipped over) from this input stream without blocking by the nextinvocation of a method for this input stream. The next invocationmight be the same thread or another thread. A single read or skip of thismany bytes will not block, but may read or skip fewer bytes.

answered Sep 12, 2022 at 7:55

finrod's user avatar

finrodfinrod

5018 silver badges20 bronze badges

The simplest answer would be to simply redirect the error stream to stdout:

process.getErrorStream().transferTo(System.out);

answered Jan 23 at 22:03

CasseroleBoi's user avatar

Я осознаю:

FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.MapRedTask

При попытке сделать копию секционированной таблицы с помощью команд в консоли куста:

CREATE TABLE copy_table_name LIKE table_name;
INSERT OVERWRITE TABLE copy_table_name PARTITION(day) SELECT * FROM table_name;

Сначала я получил некоторые ошибки семантического анализа и должен был установить:

set hive.exec.dynamic.partition=true
set hive.exec.dynamic.partition.mode=nonstrict

Хотя я не уверен, что делают вышеуказанные свойства?

Полный вывод из консоли улья:

Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapred.reduce.tasks=<number>
Starting Job = job_201206191101_4557, Tracking URL = http://jobtracker:50030/jobdetails.jsp?jobid=job_201206191101_4557
Kill Command = /usr/lib/hadoop/bin/hadoop job  -Dmapred.job.tracker=master:8021 -kill job_201206191101_4557
2012-06-25 09:53:05,826 Stage-1 map = 0%,  reduce = 0%
2012-06-25 09:53:53,044 Stage-1 map = 100%,  reduce = 100%
Ended Job = job_201206191101_4557 with errors
FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.MapRedTask

10 ответы

Это не настоящая ошибка, вот как ее найти:

Перейдите на веб-панель Hadoop jobtracker, найдите неудачные задания hive mapreduce и просмотрите журналы неудачных задач. Это покажет вам реальные ошибка.

Ошибки вывода консоли бесполезны, в основном потому, что у нее нет представления об отдельных заданиях/задачах, чтобы вытащить настоящие ошибки (могут быть ошибки в нескольких задачах)

Надеюсь, это поможет.

Создан 28 июн.

Я знаю, что опоздал на 3 года в этой теме, но все же вношу свои 2 цента за подобные случаи в будущем.

Недавно я столкнулся с той же проблемой/ошибкой в ​​своем кластере. JOB всегда приводил к сокращению примерно на 80%+ и терпел неудачу с той же ошибкой, и в журналах выполнения также ничего не происходило. После нескольких итераций и исследований я обнаружил, что среди множества загружаемых файлов некоторые не соответствовали структуре, предусмотренной для базовой таблицы (таблица, используемая для вставки данных в секционированную таблицу).

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

TL;DR: проверьте входящие данные/файлы на несогласованность в структурировании, поскольку HIVE следует философии Schema-On-Read.

ответ дан 07 апр.

Добавлю здесь немного информации, так как мне потребовалось некоторое время, чтобы найти веб-панель Hadoop Jobtracker в HDInsight (Azure’s Hadoop), и мой коллега наконец показал мне, где она находится. На головном узле есть ярлык «Статус пряжи Hadoop», который является просто ссылкой на локальную http-страницу (http://headnodehost:9014/cluster в моем случае). При открытии приборная панель выглядела так:

Введите описание изображения здесь

В этой панели вы можете найти свое неудачное приложение, а затем, нажав на него, вы можете посмотреть журналы отдельной карты и уменьшить количество заданий.

В моем случае показалось все еще нехватка памяти в редьюсерах, хотя я уже провернул память в конфигурации. По какой-то причине он не показывал ошибки «java outofmemory», которые я получил ранее.

Создан 09 сен.

Я удалил файл _SUCCESS из выходного пути EMR в S3, и он работал нормально.

ответ дан 10 апр.

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

Создан 14 сен.

Я также столкнулся с той же ошибкой, когда вставлял данные во внешнюю таблицу HIVE, которая указывала на эластичный поисковый кластер.

Я заменил старый JAR elasticsearch-hadoop-2.0.0.RC1.jar в elasticsearch-hadoop-5.6.0.jar, и все работало нормально.

Мое предложение: используйте конкретный JAR в соответствии с эластичной версией поиска. Не используйте старые JAR-файлы, если вы используете более новую версию эластичного поиска.

Благодаря этому сообщению Hive-Elasticsearch Операция записи #409

Создан 15 сен.

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

Caused by: org.apache.hadoop.hive.serde2.SerDeException: org.codehaus.jackson.JsonParseException: Unexpected end-of-input within/between OBJECT entries

Работая с меньшим количеством файлов, это сработало. В моем случае причиной была согласованность формата.

Создан 15 сен.

Я столкнулся с той же проблемой, потому что у меня не было разрешения на запрос базы данных, которую я пытался сделать.

В случае, если у вас нет разрешения на запрос таблицы/базы данных, помимо Return Code 2 from org.apache.hadoop.hive.ql.exec.MapRedTask ошибка, вы увидите, что в Cloudera Manager даже не регистрируется ваш запрос.

ответ дан 07 мая ’20, 21:05

Получил эту ошибку при объединении двух таблиц. И одна таблица большая по размеру, а другая маленькая, влезла бы в память диска. В таком случае используйте

set hive.auto.convert.join = false

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

  1. Тайна конфигурации Hive Map-Join
  2. Hive.auto.convert.join = true, что это значит?

Создан 15 июн.

Я получил ту же ошибку при создании таблицы кустов в beeline, а затем попытался создать ее через spark-shell, которая выдала фактическую ошибку. В моем случае ошибка была связана с квотой дискового пространства для каталога hdfs.

org.apache.hadoop.ipc.RemoteException: превышена квота DiskSpace для /user/hive/warehouse/XXX_XX.db: квота = 6597069766656 B = 6 ТБ, но занятое дисковое пространство = 6597493381629 B = 6.00 ТБ

Создан 05 янв.

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

hadoop
mapreduce
hive

or задайте свой вопрос.

Понравилась статья? Поделить с друзьями:
  • Traymenu exe error h is not a valid key name windows 10
  • Traymenu exe error h is not a valid key name the current thread will exit
  • Trainz 19 ошибка ve34
  • Traymenu exe error h 007 как исправить
  • Trailing data error