2015-03-09 4 views
1

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

Я попытался отправить простую работу WordCount, и это удалось. Даже с очень упрощенной версией моей собственной работы все в порядке. Но когда я добавляю больше кода (добавляя преобразование GroupByKey), я больше не могу его отправлять.

Кто-нибудь знает, что означает эта ошибка?

Спасибо, G

 
Exception in thread "main" java.lang.RuntimeException: Failed to create a workflow job: Invalid JSON payload received. Unknown token. 
     { 8r W 
^ 
    at com.google.cloud.dataflow.sdk.runners.DataflowPipelineRunner.run(DataflowPipelineRunner.java:219) 
    at com.google.cloud.dataflow.sdk.runners.BlockingDataflowPipelineRunner.run(BlockingDataflowPipelineRunner.java:96) 
    at com.google.cloud.dataflow.sdk.runners.BlockingDataflowPipelineRunner.run(BlockingDataflowPipelineRunner.java:47) 
    at com.google.cloud.dataflow.sdk.Pipeline.run(Pipeline.java:145) 
    at snippet.WordCount.main(WordCount.java:165) 
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request 
{ 
    "code" : 400, 
    "errors" : [ { 
    "domain" : "global", 
    "message" : "Invalid JSON payload received. Unknown token.\n\u001F \b\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \t{ 8r\u0000 W\n^", 
    "reason" : "badRequest" 
    } ], 
    "message" : "Invalid JSON payload received. Unknown token.\n\u001F \b\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \t{ 8r\u0000 W\n^", 
    "status" : "INVALID_ARGUMENT" 
} 

ответ

1

Чтобы отладить эту проблему, мы хотим, чтобы подтвердить, что запрос, который делается справедливо и найти неверную часть полезной нагрузки JSON. Для этого мы:

  1. Увеличение каротаж многословие
  2. Повторно запустите приложение и сохраните журналы
  3. Найти соответствующую секцию в журналах, представляющих JSON полезной нагрузки
  4. Сверяет JSON полезной нагрузки

Увеличение каротаж многословие

Добавляя следующие строки к вашему основному моменту, прежде чем вы конструируете свой конвейер, вы скажете реализацию Java logger, чтобы увеличить многословие для пакета «com.google.api». Это, в свою очередь, будет регистрировать HTTP-запрос/ответы для API Google.

import java.util.logging.ConsoleHandler; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
public class MyDataflowProgram { 
    public static void main(String[] args) { 
    ConsoleHandler consoleHandler = new ConsoleHandler(); 
    consoleHandler.setLevel(Level.ALL); 
    Logger googleApiLogger = Logger.getLogger("com.google.api"); 
    googleApiLogger.setLevel(Level.ALL); 
    googleApiLogger.setUseParentHandlers(false); 
    googleApiLogger.addHandler(consoleHandler); 
    ... Pipeline Construction ... 
} 

Повторно запустите приложение и захватить журналы

Вы хотите повторно запустить приложение DataFlow и захватить журналы. Это зависит от среды разработки, какой ОС и/или среды IDE вы используете. Например, при использовании Eclipse журналы будут отображаться в окне консоли. Сохранение этих журналов поможет вам сохранить отчет об этой проблеме.

Найти соответствующую секцию в журналах, представляющих JSON полезной нагрузки

Во время повторного выполнения Вашей Dataflow работы, вы хотите, чтобы найти журналы, связанные с представлением Dataflow работы. Эти журналы будут содержать запрос HTTP с последующим ответом и будет выглядеть следующим образом:

POST https://dataflow.googleapis.com/v1b3/projects/$GCP_PROJECT_NAME/jobs 
Accept-Encoding: gzip 
... Additional HTTP headers ... 
... JSON request payload for creation ... 
{"environment":{"clusterManagerApiService":"compute.googleapis.com","dataset":"bigquery.googleapis.com/cloud_dataflow","sdkPipelineOptions": ... 

-------------- RESPONSE -------------- 
HTTP/1.1 200 OK 
... Additional HTTP headers ... 
... JSON response payload ... 

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

Сверяет JSON полезной нагрузки

Есть много JSON валидаторы, которые могут быть использованы, но я предпочитаю использовать http://jsonlint.com/ из-за своей простоты. Если вы в состоянии, пожалуйста, поделитесь своими результатами либо путем обновления вопроса, либо если вы застряли, не стесняйтесь присылать мне личное сообщение.

+0

Спасибо Lukasz, что я обнаружил при проверке вывода json, что он был довольно большой (около 1 МБ).Я мог бы уменьшить размер, лениво инициализируя некоторые члены класса «SerializableFunction», когда они сначала используются вместо того, чтобы делать это конструктором функции. Когда несжатый размер составлял около 100 тыс., Я смог отправить задание. –

+0

Хорошо знать, что вы нашли проблему и смогли найти решение. Мы продолжим дальнейший анализ того, что происходит, когда вы пытаетесь сериализовать большую DoFn/SerializableFunction. –

Смежные вопросы