ビッグデータ研究ノート(7)

1つ、sqoop

sqoopは、HiveとRDMSの間でデータをインポートおよびエクスポートできるオープンソースのデータ移行ツールです。また、HDFSとRDMS間のデータ移行機能も実現できます。
ここに画像の説明を挿入

1.1Sqoopの動作メカニズム

1.1.1インポートメカニズム

Sqoopのインポート操作は、RDBMSデータをHDFSにインポートすることです。
インポート操作を実行すると、SqoopはJDBCを介してテーブル内の列と列データ型を読み取り、読み取ったデータ型をJavaデータ型にマップし、基になるMapReduceはInputFormatオブジェクトDataを介してデータベースから読み取ります。 DataDrivenDBInputFormatオブジェクトは、クエリ結果に応じてさまざまなマップタスクに分割でき、最後にこれらのタスクは実行のためにMapReduceクラスターに送信され、マップタスクの結果は対応するインスタンスに入力されます。

1.1.2エクスポートメカニズム

Sqoopエクスポート操作は、HDFSのデータをRDBMSにエクスポートすることです。エクスポートする前に、Sqoopはエクスポート方法(通常はJDBC)を選択し、次にSqoopはHDFSのテキストデータを解析して対応する値をテーブルに挿入できるJavaクラスを生成します。JDBCベースのエクスポートメソッドは複数の挿入ステートメントを生成し、各挿入ステートメントは複数のデータをテーブルに挿入します。同時に、異なるI / Oを並行して実行できるようにするために、HDFSからデータを読み取り、データベースと通信するときに、複数のスレッドが同時に実行を開始します。

1.2Sqoopのインストール

ダウンロードアドレス:http://archive.apache.org/dist/sqoop/、ダウンロード後に解凍します。

1.2.1Sqoop構成

cd /export/servers/sqoop-1.4.7/conf
cp sqoop‐env‐template.sh sqoop‐env.sh
vi sqoop-env.sh

次のコンテンツをsqoop-env.shファイルに追加します。

export HADOOP_COMMON_HOME/export/servers/hadoop‐3.1.1
export HADOOP_MAPRED_HOME=/export/servers/hadoop‐3.1.1
export HIVE_HOME=/export/servers/apache‐hive‐3.1.1‐bin

1.2.2依存jarパッケージを追加する

Sqoopは、データベースのドライバーパッケージとjava-jsonの依存関係パッケージを追加する必要があります。jarパッケージを準備したら、それらをsqoopのlibディレクトリに追加します。

追加が完了したら、次のコマンドを実行して、追加が成功したかどうかを確認します。

cd /export/servers/sqoop-1.4.7/
bin/sqoop-version

1.3データのインポート

1.3.1sqoopコマンド

  • mysql内のすべてのデータベースを一覧表示します。
bin/sqoop list‐databases ‐‐connect jdbc:mysql://192.168.31.7:3306/ ‐‐username root ‐‐password root
  • mysqlデータベースにあるテーブルを確認します。
bin/sqoop list‐tables ‐‐connect jdbc:mysql://192.168.31.7:3306/azkaban ‐‐username root ‐‐password root
  • ヘルプドキュメントを表示します。
bin/sqoop list‐databases ‐‐help

1.3.2インポート例

  • テーブルデータ:
create table emp(
	id int primary key auto_increment,
	name varchar(255) not null default '',
	dep varchar(20) default '',
	salary int default 0,
	dept char(2) default ''
);

create table emp_add(
	id int primary key auto_increment,
	hon varchar(20) not null default '',
	street varchar(20) default '',
	city varchar(20) default ''
);

create table emp_conn(
	id int primary key auto_increment,
	phone varchar(11) not null default '',
	email varchar(50) default ''
);

insert into emp values(1201, 'gopal', 'manager', 50000, 'TP');
insert into emp values(1202, 'manisha', 'proof reader', 50000, 'TP');
insert into emp values(1203, 'khalil', 'php dev', 30000, 'AC');
insert into emp values(1204, 'prasanth', 'php dev', 30000, 'AC');
insert into emp values(1205, 'kranthi', 'admin', 20000, 'TP');

insert into emp_add values(1201, '288A', 'vgiri', 'jublee');
insert into emp_add values(1202, '108I', 'aoc', 'sec-bad');
insert into emp_add values(1203, '144Z', 'pgutta', 'hyd');
insert into emp_add values(1204, '78B', 'old city', 'sec-bad');
insert into emp_add values(1205, '720X', 'hitec', 'sec-bad');

insert into emp_conn values(1201, '2356742', '[email protected]');
insert into emp_conn values(1202, '1661663', '[email protected]');
insert into emp_conn values(1203, '8887776', '[email protected]');
insert into emp_conn values(1204, '9988774', '[email protected]');
insert into emp_conn values(1205, '1231231', '[email protected]');

インポートコマンド:

# 将emp表数据导入到HDFS中
bin/sqoop import ‐‐connect jdbc:mysql://192.168.31.7:3306/azkaban ‐‐password root ‐‐username root ‐‐table emp ‐‐m 1

インポートが成功したら、HDFSコマンドを実行してインポート結果を表示します。

hdfs dfs -cat /user/root/emp/part*

-target-dirパラメーターを指定して、エクスポートされたHDFSディレクトリーを指定することもできます。といった:

bin/sqoop import --connect jdbc:mysql://192.168.31.7:3306/azkaban --username root --password root --delete-target-dir --table emp --target-dir /sqoop/emp -m 1

デフォルトでは、sqoopはコンマ「、」を使用して各列のデータを区切ります。区切り文字を指定する場合は、-fields-terminated-byパラメーターを指定できます。といった:

bin/sqoop import --connect jdbc:mysql://192.168.31.7:3306/azkaban --username root --password  root --delete-target-dir --table emp --target-dir /sqoop/emp2 -m 1 --fields-terminated-by '\t'

データをHiveにエクスポートすることもできます。エクスポート手順は次のとおりです。

  • まず、hive‐exec‐3.1.1.jarパッケージをsqoopのlibディレクトリにコピーます。
cp /export/servers/apache‐hive‐3.1.1‐bin/lib/hive‐exec‐3.1.1.jar /export/servers/sqoop‐1.4.7/lib
  • エクスポートする前に、ハイブで必要なテーブルを作成する必要があります。
create database sqooptohive;
use sqooptohive;
create external table emp_hive(id int,name string,dep string,salary int ,dept string) row format delimited fields terminated by '\001';
  • エクスポート操作を実行します。
bin/sqoop import ‐‐connect jdbc:mysql://192.168.31.7:3306/azkaban ‐‐username root ‐‐password root ‐‐table emp ‐‐fields‐terminated‐by '\001' ‐‐hive‐import ‐‐hive‐table sqooptohive.emp_hive ‐‐hive‐overwrite ‐‐delete‐target‐dir ‐‐m 1

パラメータの説明::
‐‐hive‐importコマンドがインポート操作を実行することを指定し
--hive-tableます;:エクスポートするHiveテーブルの名前;:
--hive-overwrite上書きするソースデータを
-m指定します;:同時に実行されるマップタスクの数を指定します;

--hive-databaseパラメータを指定することで、mysqlデータとテーブル構造をハイブに直接インポートできます。

bin/sqoop import ‐‐connect jdbc:mysql://192.168.31.7:3306/azkaban ‐‐username root ‐‐password root ‐‐table emp_conn ‐‐hive‐import ‐m 1 ‐‐hive‐database sqooptohive

条件を満たすデータのみをエクスポートする必要がある場合は、--whereパラメーターを指定できます。

bin/sqoop import --connect jdbc:mysql://192.168.31.7:3306/azkaban --username root --password root --table emp_add --target‐dir /sqoop/emp_add -m 1 --delete‐target‐dir --where "city = 'sec‐bad'"

--queryパラメータを指定して、実行するSQLコマンドを指定することもできます。

bin/sqoop import --connect jdbc:mysql://192.168.31.7:3306/azkaban --username root --password root -m 1 --query 'select * from emp_add where city="sec-bad" and $CONDITIONS' --target-dir /sqoop/emp_add --delete-target-dir

上記のインポートコマンドを繰り返すと、後続のインポート操作で以前にインポートされたデータが上書きされることがわかります。Sqoopは增量导入、後でインポートされたデータが以前にインポートされたデータを上書きしないこともサポートしています。あなたが増分インポートを使用している場合は、次の3つのを指定する必要があります--incrementalパラメータを:--check-column--last-value、。

// 导入emp表中id大于1202的记录。
bin/sqoop import --connect jdbc:mysql://192.168.31.7:3306/azkaban --username root --password root --table emp --incremental append --check-column id --last-value 1202 -m 1 --target-dir /sqoop/increment

--whereより正確な制御は、パラメータを介して実現することもできます。

bin/sqoop import --connect jdbc:mysql://192.168.31.7:3306/azkaban --username root --password root --table emp --incremental append --check-column id --where "id > 1202" -m 1 --target-dir /sqoop/increment

注:インクリメンタルインポートでは、-delete-target-dirパラメーターを指定できません。

1.4データのエクスポート

データのエクスポートとは、HDFSからRDMBSにデータをエクスポートすることです。エクスポートされたデータの内容は次のとおりです。
ここに画像の説明を挿入

データのエクスポート手順:

  • ステップ1:mysqlデータベースにテーブルを作成します。テーブルフィールドは、HDFSでエクスポートされるデータのタイプと数と同じである必要があります。

注:データのエクスポートを実行する前に、ターゲットテーブルがすでに存在している必要があります。

create table emp_out(id int, name varchar(100), dep varchar(50), sal int, dept varchar(10), create_time timestamp);
  • ステップ2:エクスポートを実行します。
bin/sqoop export --connect jdbc:mysql://192.168.31.7:3306/azkaban --username root --password root --table emp_out --export-dir /sqoop/emp --input-fields-terminated-by ","

おすすめ

転載: blog.csdn.net/zhongliwen1981/article/details/107342672