Cloudera — Sqoop codegen настраиваемый класс ORM при импорте

Я новичок в среде Cloudera, я пытаюсь импортировать данные из СУБД, используя Sqoop, и мне нужно применить некоторые преобразования данных во время импорта. В частности, мне нужно зашифровать некоторые поля перед их сохранением в Hadoop DFS. Для этого я пытаюсь использовать codegen Команда, которая генерирует класс Java ORM, который я могу изменить.

Допустим, у меня есть таблица «продукты» в базе данных MySQL, и я хочу импортировать ее в HDFS с помощью Sqoop и зашифровать поле «бренд». Сначала я запустил эту команду:

sqoop codegen \ 
--connect jdbc:mysql://localhost/test \
--username username --password password \
--table products

Это создает файлы products.java, products.jar и products.class в папке /tmp/sqoop-training/compile/fc8868dda33ef703ad126583cf77477f.

Теперь я изменил метод readFields в products.java следующим образом:

// WARNING: This class is AUTO-GENERATED. Modify at your own risk.
//
// Debug information:
// Generated date: Thu Nov 16 06:55:13 PST 2017
// For connector: org.apache.sqoop.manager.MySQLManager
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapred.lib.db.DBWritable;
import com.cloudera.sqoop.lib.JdbcWritableBridge;
import com.cloudera.sqoop.lib.DelimiterSet;
import com.cloudera.sqoop.lib.FieldFormatter;
import com.cloudera.sqoop.lib.RecordParser;
import com.cloudera.sqoop.lib.BooleanParser;
import com.cloudera.sqoop.lib.BlobRef;
import com.cloudera.sqoop.lib.ClobRef;
import com.cloudera.sqoop.lib.LargeObjectLoader;
import com.cloudera.sqoop.lib.SqoopRecord;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class products extends SqoopRecord  implements DBWritable, Writable {

    // [...]

    public void readFields(ResultSet __dbResults) throws SQLException {
        this.__cur_result_set = __dbResults;
        this.prod_id = JdbcWritableBridge.readInteger(1, __dbResults);
        this.brand = encrypt(JdbcWritableBridge.readString(2, __dbResults));
        this.name = JdbcWritableBridge.readString(3, __dbResults);
        this.price = JdbcWritableBridge.readInteger(4, __dbResults);
        this.cost = JdbcWritableBridge.readInteger(5, __dbResults);
        this.shipping_wt = JdbcWritableBridge.readInteger(6, __dbResults);
    }

    // [...]

}

У меня два вопроса:
1) Как мне перекомпилировать products.java, чтобы получить обновленные версии products.class и products.jar? Я пробовал с

javac products.java

но JVM выдает 82 ошибки, кажется, не может найти пакеты из пространства имен hadoop и cloudera:

error: package org.apache.hadoop.io does not exist
import org.apache.hadoop.io.BytesWritable;
                           ^
products.java:8: error: package org.apache.hadoop.io does not exist
import org.apache.hadoop.io.Text;
                           ^
products.java:9: error: package org.apache.hadoop.io does not exist
import org.apache.hadoop.io.Writable;
                           ^
products.java:10: error: package org.apache.hadoop.mapred.lib.db does not exist
import org.apache.hadoop.mapred.lib.db.DBWritable;
                                      ^
products.java:11: error: package com.cloudera.sqoop.lib does not exist
import com.cloudera.sqoop.lib.JdbcWritableBridge;
                             ^
products.java:12: error: package com.cloudera.sqoop.lib does not exist
import com.cloudera.sqoop.lib.DelimiterSet;
                             ^
products.java:13: error: package com.cloudera.sqoop.lib does not exist
import com.cloudera.sqoop.lib.FieldFormatter;
                             ^
products.java:14: error: package com.cloudera.sqoop.lib does not exist
import com.cloudera.sqoop.lib.RecordParser;
                             ^
products.java:15: error: package com.cloudera.sqoop.lib does not exist
import com.cloudera.sqoop.lib.BooleanParser;
                             ^
products.java:16: error: package com.cloudera.sqoop.lib does not exist
import com.cloudera.sqoop.lib.BlobRef;
                             ^
products.java:17: error: package com.cloudera.sqoop.lib does not exist
import com.cloudera.sqoop.lib.ClobRef;
                             ^
products.java:18: error: package com.cloudera.sqoop.lib does not exist
import com.cloudera.sqoop.lib.LargeObjectLoader;
                             ^
products.java:19: error: package com.cloudera.sqoop.lib does not exist
import com.cloudera.sqoop.lib.SqoopRecord;


2) После того, как я успешно скомпилировал products.java, как я могу использовать Sqoop для импорта данных в HDFS с помощью моего пользовательского класса ORM?



Заранее спасибо!


person revy    schedule 16.11.2017    source источник


Ответы (1)


По первому вопросу:

Добавлять

export CLASSPATH=`hadoop classpath`:/opt/cloudera/parcels/CDH/lib/sqoop/lib

а затем повторите попытку.

пс. В целом по архитектуре, небольшой комментарий на тему «В частности, мне нужно зашифровать некоторые поля перед их сохранением в Hadoop DFS» — почему бы вам не использовать прозрачное шифрование HDFS? https://www.cloudera.com/documentation/enterprise/latest/topics/cdh_sg_hdfs_encryption.html Вы можете добиться того же без какого-либо кодирования.

person Tagar    schedule 16.11.2017
comment
Спасибо! К сожалению, папка /opt/cloudera/parcels/CDH/lib/sqoop не существует. Я вижу только папку /opt/cloudera/parcels/CDH/lib/hue. Выполнив команду «версия Hadoop» на терминале, я вижу, что версия CDH: cdh5.8.0. - person revy; 20.11.2017
comment
У вас установлен sqoop 1 или sqoop 2? Он был установлен в виде посылки или пакета? Вы добавили сервис sqoop 1 через CM? - person Tagar; 20.11.2017