前言
Sqoop 是一个设计用于在 Apache Hadoop 和结构化数据存储(如关系数据库、数据仓库)之间高效传输大规模数据的工具。其名称来源于 SQL 和 Hadoop 的结合。
Sqoop 的主要功能包括:
从 RDBMS 导入数据到 Hadoop:支持将数据导入到 HDFS、Hive、HBase 等。
从 Hadoop 导出数据到 RDBMS:支持将 HDFS 或 Hive 中的数据导出回关系数据库。
支持多种数据库和数据源:如 MySQL、PostgreSQL、Oracle、SQL Server 等。
提供高效并行化的传输:利用 MapReduce 实现高效的数据导入和导出。
自动生成代码:可生成 Java 类,用于和表进行交互。
教程案例 MySQL 数据导入 HDFS
数据准备
假设我们有一个 MySQL 数据库 test_db
,其中包含表 employees
:
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
department VARCHAR(50)
);
INSERT INTO employees (name, age, department)
VALUES
('Alice', 30, 'HR'),
('Bob', 35, 'Engineering'),
('Charlie', 28, 'Marketing');
将数据导入到 HDFS
1. 导入数据
运行以下命令将 employees
表导入到 HDFS:
sqoop import \
--connect "jdbc:mysql://localhost:3306/test_db" \
--username root \
--password yourpassword \
--table employees \
--target-dir /user/hadoop/employees \
--fields-terminated-by ',' \
--lines-terminated-by '\n' \
--num-mappers 1
2. 参数说明
--connect
:数据库连接字符串。
--username
/ --password
:数据库用户名和密码。
--table
:要导入的表名。
--target-dir
:HDFS 目标路径。
--fields-terminated-by
:指定字段分隔符。
--lines-terminated-by
:指定行分隔符。
--num-mappers
:指定并行任务数。
3. 验证数据
查看 HDFS 中的文件:
hdfs dfs -ls /user/hadoop/employees
输出文件内容:
hdfs dfs -cat /user/hadoop/employees/part-m-00000
将 HDFS 数据导出回 MySQL
假设我们修改了 employees
表的数据,并希望将它导出回一个新的 MySQL 表 employees_exported
。
1. 创建目标表
CREATE TABLE employees_exported (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
department VARCHAR(50)
);
2. 导出数据
运行以下命令将 HDFS 数据导出到 MySQL:
sqoop export \
--connect "jdbc:mysql://localhost:3306/test_db" \
--username root \
--password yourpassword \
--table employees_exported \
--export-dir /user/hadoop/employees \
--input-fields-terminated-by ',' \
--input-lines-terminated-by '\n'
3. 验证数据
查询 employees_exported
表:
SELECT * FROM employees_exported;
<h2><a id="_0"></a>前言</h2>
<p>Sqoop 是一个设计用于在 Apache Hadoop 和结构化数据存储(如关系数据库、数据仓库)之间高效传输大规模数据的工具。其名称来源于 SQL 和 Hadoop 的结合。</p>
<p>Sqoop 的主要功能包括:</p>
<p>从 RDBMS 导入数据到 Hadoop:支持将数据导入到 HDFS、Hive、HBase 等。<br />
从 Hadoop 导出数据到 RDBMS:支持将 HDFS 或 Hive 中的数据导出回关系数据库。<br />
支持多种数据库和数据源:如 MySQL、PostgreSQL、Oracle、SQL Server 等。<br />
提供高效并行化的传输:利用 MapReduce 实现高效的数据导入和导出。<br />
自动生成代码:可生成 Java 类,用于和表进行交互。</p>
<h2><a id="_MySQL__HDFS_13"></a>教程案例 MySQL 数据导入 HDFS</h2>
<h3><a id="_15"></a>数据准备</h3>
<p>假设我们有一个 MySQL 数据库 <code>test_db</code>,其中包含表 <code>employees</code>:</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">CREATE</span> DATABASE test_db;
USE test_db;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> employees (
id <span class="hljs-type">INT</span> <span class="hljs-keyword">PRIMARY</span> KEY AUTO_INCREMENT,
name <span class="hljs-type">VARCHAR</span>(<span class="hljs-number">50</span>),
age <span class="hljs-type">INT</span>,
department <span class="hljs-type">VARCHAR</span>(<span class="hljs-number">50</span>)
);
<span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> employees (name, age, department)
<span class="hljs-keyword">VALUES</span>
(<span class="hljs-string">'Alice'</span>, <span class="hljs-number">30</span>, <span class="hljs-string">'HR'</span>),
(<span class="hljs-string">'Bob'</span>, <span class="hljs-number">35</span>, <span class="hljs-string">'Engineering'</span>),
(<span class="hljs-string">'Charlie'</span>, <span class="hljs-number">28</span>, <span class="hljs-string">'Marketing'</span>);
</code></div></pre>
<h3><a id="_HDFS_37"></a>将数据导入到 HDFS</h3>
<h4><a id="1__39"></a>1. 导入数据</h4>
<p>运行以下命令将 <code>employees</code> 表导入到 HDFS:</p>
<pre><div class="hljs"><code class="lang-shell">sqoop import \
--connect "jdbc:mysql://localhost:3306/test_db" \
--username root \
--password yourpassword \
--table employees \
--target-dir /user/hadoop/employees \
--fields-terminated-by ',' \
--lines-terminated-by '\n' \
--num-mappers 1
</code></div></pre>
<h4><a id="2__55"></a>2. 参数说明</h4>
<ul>
<li><code>--connect</code>:数据库连接字符串。</li>
<li><code>--username</code> / <code>--password</code>:数据库用户名和密码。</li>
<li><code>--table</code>:要导入的表名。</li>
<li><code>--target-dir</code>:HDFS 目标路径。</li>
<li><code>--fields-terminated-by</code>:指定字段分隔符。</li>
<li><code>--lines-terminated-by</code>:指定行分隔符。</li>
<li><code>--num-mappers</code>:指定并行任务数。</li>
</ul>
<h4><a id="3__65"></a>3. 验证数据</h4>
<p>查看 HDFS 中的文件:</p>
<pre><div class="hljs"><code class="lang-shell">hdfs dfs -ls /user/hadoop/employees
</code></div></pre>
<p>输出文件内容:</p>
<pre><div class="hljs"><code class="lang-shell">hdfs dfs -cat /user/hadoop/employees/part-m-00000
</code></div></pre>
<hr />
<h3><a id="_HDFS__MySQL_81"></a>将 HDFS 数据导出回 MySQL</h3>
<p>假设我们修改了 <code>employees</code> 表的数据,并希望将它导出回一个新的 MySQL 表 <code>employees_exported</code>。</p>
<h4><a id="1__85"></a>1. 创建目标表</h4>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> employees_exported (
id <span class="hljs-type">INT</span> <span class="hljs-keyword">PRIMARY</span> KEY AUTO_INCREMENT,
name <span class="hljs-type">VARCHAR</span>(<span class="hljs-number">50</span>),
age <span class="hljs-type">INT</span>,
department <span class="hljs-type">VARCHAR</span>(<span class="hljs-number">50</span>)
);
</code></div></pre>
<h4><a id="2__96"></a>2. 导出数据</h4>
<p>运行以下命令将 HDFS 数据导出到 MySQL:</p>
<pre><div class="hljs"><code class="lang-shell">sqoop export \
--connect "jdbc:mysql://localhost:3306/test_db" \
--username root \
--password yourpassword \
--table employees_exported \
--export-dir /user/hadoop/employees \
--input-fields-terminated-by ',' \
--input-lines-terminated-by '\n'
</code></div></pre>
<h4><a id="3__111"></a>3. 验证数据</h4>
<p>查询 <code>employees_exported</code> 表:</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">SELECT</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">FROM</span> employees_exported;
</code></div></pre>
留言