Устранение ошибок копирования в AWS Redshift - PullRequest
0 голосов
/ 22 мая 2018

Обновление: если понял это, но все еще заинтересован в объяснении.Проблема заключалась в том, что я выполнял приведенный ниже код, а также подключался к своему кластеру Redshift из SqlWorkbenchJ (оба работают на одном ноутбуке).Когда я отключаю сеанс SqlWorkbenchJ и перезапускаю свой код, он не зависает. Почему?


Обратите внимание: Хотя я упоминаю Java / JDBC в этом вопросе, это строго вопрос об устранении неполадок Redshift и является языком / framework-agnostic !!!


Также вот репозиторий SSCCE, который идеально воспроизводит проблему зависания: https://github.com/bitbythecron/redshift-copy-troubleshooting

Я пытаюсь запустить следующую команду Redshift COPY из кода Java (используяДрайвер Postgres JDBC):

COPY my_schema.mytable
FROM 's3://com.example.mybucket/mydata.csv/part-00000-bc1b179d-b4c1-459f-8f5e-8fe361d4b40f-c000.csv'
iam_role 'arn:aws:iam::blah:role/MyRedshiftRole'
csv;

Если я правильно прочитал документы, это должно:

  1. Считать файл CSV, хранящийся на S3
  2. Скопировать егосодержимое в таблицу Redshift (my_schema.mytable)

Когда я запускаю эту команду в своем клиенте пользовательского интерфейса Redshift (SqlWorkbenchJ), она выполняется правильно и выполняется в течение нескольких секунд.Однако, когда я выполняю следующий код JDBC (используя точный тот же URL-адрес подключения, учетные данные и т. Д.), Код просто зависает в команде executeUpdate:

Connection conn = null;
Statement statement = null;
try {
  Class.forName("org.postgresql.Driver");
  Properties props = new Properties();
  props.setProperty("user", redshiftInfo.username);
  props.setProperty("password", redshiftInfo.password);

  log.info("\n\nAttempting to connect!\n\n");

  conn = DriverManager.getConnection("jdbc:postgresql://<sameExactUrl_thatIUser_inSqlWorkbenchJ>", props);

  log.info("\n\nConnection made!\n\n");

  statement = conn.createStatement();

  String command = "COPY my_schema.my_table FROM 's3://com.example.mybucket/mydata.csv/part-00000-bc1b179d-b4c1-459f-8f5e-8fe361d4b40f-c000.csv' iam_role 'arn:aws:iam::blah:role/MyRedshiftRole' csv";

  log.info("\n\nExecuting...\n\n");

  statement.executeUpdate(command);

  log.info("\n\nHey I think it worked!!!\n\n");

  statement.close();
  conn.close();
} catch (Exception ex) {
    log.info(ExceptionUtils.getStackTrace(ex));
}

Когда это выполняется, в журналах я получаю оператор Executing... log, но затем программное обеспечение просто зависает.Я ждал целых 30 минут, чтобы узнать, было ли это просто медленно по какой-то причине.Я также обновлял свое соединение SqlWorkbenchJ в течение (и после) этих 30 минут и запустил SELECT COUNT(*) FROM my_schema.my_table, и счетчик всегда равен 0. Таким образом, он устанавливает соединение, но затем ничего на самом деле не копируется, или, если это так, не фиксируется.

Я хотел бы посмотреть, что происходит на стороне Redshift: есть ли какие-либо таблицы или журналы (в консоли AWS или иным образом), которые я могу отслеживать или проверять, чтобы копировать записи ипоставили где-нибудь или посмотреть, есть ли какие-либо ошибки, о которых сообщалось с точки зрения Redshift?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Проблема заключалась в том, что я запускал приведенный ниже код, а также подключался к своему кластеру Redshift из SqlWorkbenchJ (оба работают на одном ноутбуке).Когда я отключаю сеанс SqlWorkbenchJ и перезапускаю код, он не зависает.

0 голосов
/ 23 мая 2018

Нет проблем с вашим кодом Java.Он отлично работает, если количество записей меньше.

create table my_table (
  c_name            varchar(25)    not null,
  c_address         varchar(25)    not null,
  c_city            varchar(25)    not null);

Создайте CSV с данными # и поместите его в S3 всего с 2-3 записями,

one,two,three
example1,example2,example3

Затем запуститеВаш код будет отображаться следующим образом.

 Attempting to connect!
 Connection made!
 Executing...
 Hey I think it worked!!!

Теперь выполните

Select * from my_table;

 c_name  | c_address |  c_city
 ----------+-----------+----------
 one      | two       | three
 example1 | example2  | example3

Возвращаясь к вашему вопросу, почему вы видите 0 записей в Select * from my_table;

Факт: Amazon Redshift полностью ACID Complaint, означает, что до тех пор, пока ваша команда копирования не будет завершена и зафиксирована, следовательно, вы не увидите никаких записей в SELECT.

Решение: Выхотели бы посмотреть, что происходит с вашим запросом, выполняется ли он или завершен?

Вы можете выполнить следующую команду, чтобы увидеть все текущие запущенные запросы.

  select pid, user_name, starttime, query from stv_recents where status='Running';

  //OR

  select query, pid, elapsed, substring from svl_qlog where userid = 100 order by starttime desc limit 5;

См. AWS Redshift системный запрос документация для более подробной информации.

...