Sqoop 心已赠人 2022-04-25 01:46 224阅读 0赞 Sqoop的基本原理和相关参数配置: ## 简介 ## Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库*(例如 : MySQL ,Oracle ,Postgres等)*中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。 Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。 ## 原理 ## ### 导入 ### 在导入开始之前,Sqoop使用JDBC来检查将要导入的表。他检索出表中所有的列以及列的SQL数据类型。这些SQL类型(VARCHAR、INTEGER)被映射到Java数据类型(String、Integer等),在MapReduce应用中将使用这些对应的java类型来保存字段的值。Sqoop的代码生成器使用这些信息来创建对应表的类,用于保存从表中抽取的记录。例如前面提到过的example类。 对于导入来说,更关键的是DBWritable接口的序列化方法,这些方法能使Widget类和JDBC进行交互: Public void readFields(resultSet \_dbResults)throws SQLException; Public void write(PreparedStatement \_dbstmt)throws SQLException; JDBC的ResultSet接口提供了一个用户从检查结果中检索记录的游标;这里的readFields()方法将用ResultSet中一行数据的列来填充Example对象的字段。 Sqoop启动的MapReduce作业用到一个InputFormat,他可以通过JDBC从一个数据库表中读取部分内容。Hadoop提供的DataDriverDBInputFormat能够为几个Map任务对查询结果进行划分。为了获取更好的导入性能,查询会根据一个“划分列”来进行划分的。Sqoop会选择一个合适的列作为划分列(通常是表的主键)。 在生成反序列化代码和配置InputFormat之后,Sqoop将作业发送到MapReduce集群。Map任务将执行查询并将ResultSet中的数据反序列化到生成类的实例,这些数据要么直接保存在SequenceFile文件中,要么在写到HDFS之前被转换成分割的文本。 Sqoop不需要每次都导入整张表,用户也可以在查询中加入到where子句,以此来限定需要导入的记录:Sqoop –query (SQL)。 导入和一致性:在向HDFS导入数据时,重要的是要确保访问的是数据源的一致性快照。从一个数据库中并行读取数据的MAP任务分别运行在不同的进程中。因此,他们不能共享一个数据库任务。保证一致性的最好方法就是在导入时不允许运行任何进行对表中现有数据进行更新。 ![FqsIJO.png][] ### 导出 ### Sqoop导出功能的架构与其导入功能非常相似,在执行导出操作之前,sqoop会根据数据库连接字符串来选择一个导出方法。一般为jdbc。然后,sqoop会根据目标表的定义生成一个java类。这个生成的类能够从文本文件中解析记录,并能够向表中插入类型合适的值。接着会启动一个MapReduce作业,从HDFS中读取源数据文件,使用生成的类解析记录,并且执行选定的导出方法。 基于jdbc的导出方法会产生一批insert语句,每条语句都会向目标表中插入多条记录。多个单独的线程被用于从HDFS读取数据并与数据库进行通信,以确保涉及不同系统的I/O操作能够尽可能重叠执行。 虽然HDFS读取数据的MapReduce作业大多根据所处理文件的数量和大小来选择并行度(map任务的数量),但sqoop的导出工具允许用户明确设定任务的数量。由于导出性能会受并行的数据库写入线程数量的影响,所以sqoop使用combinefileinput类将输入文件分组分配给少数几个map任务去执行。 系统使用固定大小的缓冲区来存储事务数据,这时一个任务中的所有操作不可能在一个事务中完成。因此,在导出操作进行过程中,提交过的中间结果都是可见的。在导出过程完成前,不要启动那些使用导出结果的应用程序,否则这些应用会看到不完整的导出结果。 更有问题的是,如果任务失败,他会从头开始重新导入自己负责的那部分数据,因此可能会插入重复的记录。当前sqoop还不能避免这种可能性。在启动导出作业前,应当在数据库中设置表的约束(例如,定义一个主键列)以保证数据行的唯一性。 Sqoop还可以将存储在SequenceFile中的记录导出到输出表,不过有一些限制。SequenceFile中可以保存任意类型的记录。Sqoop的导出工具从SequenceFile中读取对象,然后直接发送到OutputCollector,由他将这些对象传递给数据库导出OutputFormat。为了能让Sqoop使用,记录必须被保存在SequenceFile键值对格式的值部分,并且必须继承抽象类com.cloudera.sqoop.lib.SqoopRecord。 ![FqyClQ.png][] ## 安装 ## 1. 下载软件 : [http://mirrors.hust.edu.cn/apache/sqoop/1.4.6/][http_mirrors.hust.edu.cn_apache_sqoop_1.4.6] 2. 上传安装包sqoop-1.4.6.bin\_\_hadoop-2.0.4-alpha.tar.gz到虚拟机中 3. 软件到指定目录 <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br></pre></td> <td><pre><span>[hadoop@datanode1 software]$ tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/module/</span><br><span>[hadoop@datanode1 module]$ mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha/ sqoop</span><br></pre></td> </tr> </tbody> </table> 4. 修改配置文件 <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br></pre></td> <td><pre><span>[hadoop@datanode1 conf]$ mv sqoop-env-template.sh sqoop-env.sh</span><br><span>[hadoop@datanode1 conf]$ mv sqoop-site-template.xml sqoop-site.xml</span><br></pre></td> </tr> </tbody> </table> 1. 修改配置文件sqoop-env.sh <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br><span>9</span><br><span>10</span><br><span>11</span><br><span>12</span><br><span>13</span><br><span>14</span><br><span>15</span><br></pre></td> <td><pre><span>#Set path to where bin/hadoop is available</span><br><span>export HADOOP_COMMON_HOME=/opt/module/hadoop</span><br><span></span><br><span>#Set path to where hadoop-*-core.jar is available</span><br><span>export HADOOP_MAPRED_HOME=/opt/module/hadoop</span><br><span></span><br><span>#set the path to where bin/hbase is available</span><br><span>export HBASE_HOME=/opt/module/hbase</span><br><span></span><br><span>#Set the path to where bin/hive is available</span><br><span>export HIVE_HOME=/opt/module/hive</span><br><span></span><br><span>#Set the path for where zookeper config dir is</span><br><span>export ZOOKEEPER_HOME=/opt/module/zookeeper-3.4.10/</span><br><span>export ZOOCFGDIR=$ZOOKEEPER_HOME/conf</span><br></pre></td> </tr> </tbody> </table> 1. 拷贝JDBC驱动sqoop的lib目录下 <table> <tbody> <tr> <td><pre><span>1</span><br></pre></td> <td><pre><span>cp -a mysql-connector-java-5.1.27-bin.jar /opt/module/sqoop/lib</span><br></pre></td> </tr> </tbody> </table> 1. 验证Sqoop <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br><span>9</span><br><span>10</span><br><span>11</span><br><span>12</span><br><span>13</span><br><span>14</span><br><span>15</span><br><span>16</span><br><span>17</span><br><span>18</span><br><span>19</span><br><span>20</span><br><span>21</span><br><span>22</span><br><span>23</span><br><span>24</span><br><span>25</span><br><span>26</span><br><span>27</span><br></pre></td> <td><pre><span>[hadoop@datanode1 sqoop]$ bin/sqoop help</span><br><span>Warning: /opt/module/sqoop/bin/../../hcatalog does not exist! HCatalog jobs will fail.</span><br><span>Please set $HCAT_HOME to the root of your HCatalog installation.</span><br><span>Warning: /opt/module/sqoop/bin/../../accumulo does not exist! Accumulo imports will fail.</span><br><span>Please set $ACCUMULO_HOME to the root of your Accumulo installation.</span><br><span>-----------------------------------------------------------------------------------------</span><br><span><span>#</span><span><span>#上面的警告可以忽略</span></span></span><br><span>19/01/08 13:35:58 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6</span><br><span>usage: sqoop COMMAND [ARGS]</span><br><span></span><br><span>Available commands:</span><br><span> codegen Generate code to interact with database records</span><br><span> create-hive-table Import a table definition into Hive</span><br><span> eval Evaluate a SQL statement and display the results</span><br><span> export Export an HDFS directory to a database table</span><br><span> help List available commands</span><br><span> import Import a table from a database to HDFS</span><br><span> import-all-tables Import tables from a database to HDFS</span><br><span> import-mainframe Import datasets from a mainframe server to HDFS</span><br><span> job Work with saved jobs</span><br><span> list-databases List available databases on a server</span><br><span> list-tables List available tables in a database</span><br><span> merge Merge results of incremental imports</span><br><span> metastore Run a standalone Sqoop metastore</span><br><span> version Display version information</span><br><span></span><br><span>See 'sqoop help COMMAND' for information on a specific command.</span><br></pre></td> </tr> </tbody> </table> 1. 测试是否成功连接数据库 <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br><span>9</span><br><span>10</span><br></pre></td> <td><pre><span>[hadoop@datanode1 sqoop]$ bin/sqoop list-databases --connect jdbc:mysql://datanode1:3306/ --username root --password 123456</span><br><span>19/01/08 13:38:11 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6</span><br><span>19/01/08 13:38:11 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.</span><br><span>19/01/08 13:38:12 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.</span><br><span>information_schema</span><br><span>metastore</span><br><span>mysql</span><br><span>mysqlsource</span><br><span>performance_schema</span><br><span>[hadoop@datanode1 sqoop]$</span><br></pre></td> </tr> </tbody> </table> ## 案例 ## ### 导入数据 ### #### RDBMS到HDFS #### <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br></pre></td> <td><pre><span>mysql) create database student;</span><br><span>mysql) create table student.class(id int(4) primary key not null auto_increment, name varchar(255), age int);</span><br></pre></td> </tr> </tbody> </table> 数据库脚本 <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br><span>9</span><br><span>10</span><br><span>11</span><br><span>12</span><br><span>13</span><br></pre></td> <td><pre><span>[hadoop@datanode1 sqoop]$ vim mysql.sh</span><br><span>STNAME="192.168.1.101" #数据库信息</span><br><span>PORT="3306"</span><br><span>USERNAME="root"</span><br><span>PASSWORD="123456"</span><br><span></span><br><span>DBNAME="student" #数据库名称</span><br><span>TABLENAME="class" #数据库中表的名称</span><br><span></span><br><span>for ((i=1;i(=100;i++)) ##添加100条数据</span><br><span>do</span><br><span>insert_sql="insert into ${TABLENAME}(name,age) values('student_$i',($RANDOM%4)+18)"</span><br><span>mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${insert_sql}"</span><br></pre></td> </tr> </tbody> </table> ##### 全部导入 ##### <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br><span>9</span><br></pre></td> <td><pre><span>bin/sqoop import \</span><br><span>--connect jdbc:mysql://datanode1:3306/student \</span><br><span>--username root \</span><br><span>--password 123456 \</span><br><span>--table class \</span><br><span>--target-dir /student/class \</span><br><span>--delete-target-dir \</span><br><span>--num-mappers 1 \</span><br><span>--fields-terminated-by "\t"</span><br></pre></td> </tr> </tbody> </table> ##### **查询导入** ##### <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br><span>9</span><br></pre></td> <td><pre><span> bin/sqoop import \</span><br><span>--connect jdbc:mysql://datanode1:3306/student \</span><br><span>--username root \</span><br><span>--password 123456 \</span><br><span>--target-dir /student/class_query \</span><br><span>--delete-target-dir \</span><br><span>--num-mappers 1 \</span><br><span>--fields-terminated-by "\t" \</span><br><span>--query 'select name,age from class where id (=20 and $CONDITIONS;'</span><br></pre></td> </tr> </tbody> </table> 注意:must contain ‘$CONDITIONS’ in WHERE clause. 如果query后使用的是双引号,则$CONDITIONS前必须加转移符,防止shell识别为自己的变量。 —query选项,不能同时与—table选项使用 ##### 导入指定列 ##### <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br><span>9</span><br><span>10</span><br></pre></td> <td><pre><span>bin/sqoop import \</span><br><span>--connect jdbc:mysql://datanode1:3306/student \</span><br><span>--username root \</span><br><span>--password 123456 \</span><br><span>--target-dir /student/ \</span><br><span>--delete-target-dir \</span><br><span>--num-mappers 1 \</span><br><span>--fields-terminated-by "\t" \</span><br><span>--columns id,name \</span><br><span>--table class</span><br></pre></td> </tr> </tbody> </table> 注意:columns中如果涉及到多列,用逗号分隔,分隔时不要添加空格 ##### 使用sqoop关键字筛选查询导入数据 ##### <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br><span>9</span><br><span>10</span><br></pre></td> <td><pre><span>bin/sqoop import \</span><br><span>--connect jdbc:mysql://datanode1:3306/student \</span><br><span>--username root \</span><br><span>--password 123456 \</span><br><span>--target-dir /student/limit \</span><br><span>--delete-target-dir \</span><br><span>--num-mappers 1 \</span><br><span>--fields-terminated-by "\t" \</span><br><span>--table class \</span><br><span>--where "id(10"</span><br></pre></td> </tr> </tbody> </table> #### RDBMS到Hive #### <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br><span>9</span><br><span>10</span><br><span>11</span><br></pre></td> <td><pre><span> bin/sqoop import \</span><br><span>--connect jdbc:mysql://datanode1:3306/student \</span><br><span>--username root \</span><br><span>--password 123456 \ </span><br><span>--table class \</span><br><span>--num-mappers 1 \</span><br><span>--hive-import \</span><br><span>--fields-terminated-by "\t" \</span><br><span>--columns name,age \</span><br><span>--hive-overwrite \</span><br><span>--hive-table class_hive</span><br></pre></td> </tr> </tbody> </table> 该过程分为两步: 第一步将数据导入到HDFS 默认临时目录是/user/admin/表名 第二步将导入到HDFS的数据迁移到Hive仓库 #### RDBMS到HBase #### <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br></pre></td> <td><pre><span>bin/sqoop import \</span><br><span>--connect jdbc:mysql://datanode1:3306/student \</span><br><span>--username 'root' \</span><br><span>--password '123456' \</span><br><span>--table 'class' \</span><br><span>--hbase-table 'test' \</span><br><span>--hbase-row-key 'id' \</span><br><span> --column-family 'info'</span><br></pre></td> </tr> </tbody> </table> 需要先创建hbase表 ### 导出数据 ### #### HIVE到RDBMS #### <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br></pre></td> <td><pre><span>bin/sqoop export \</span><br><span>--connect jdbc:mysql://datanode1:3306/student \</span><br><span>--username root \</span><br><span>--password 123456 \</span><br><span>--table class_from_hive \</span><br><span>--num-mappers 1 \</span><br><span>--export-dir /user/hive/warehouse/class_hive \</span><br><span>--input-fields-terminated-by "\t"</span><br></pre></td> </tr> </tbody> </table> 表要先创先好 #### HDFS到RDBMS #### <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br><span>9</span><br><span>10</span><br><span>11</span><br><span>12</span><br><span>13</span><br><span>14</span><br><span>15</span><br><span>16</span><br><span>17</span><br><span>18</span><br></pre></td> <td><pre><span>mkdir opt</span><br><span> vi opt/job_HDFS2RDBMS.opt</span><br><span>export --connect</span><br><span>jdbc:mysql://linux01:3306/company</span><br><span>--username</span><br><span>root</span><br><span>--password</span><br><span>123456</span><br><span>--table</span><br><span>staff</span><br><span>--num-mappers</span><br><span>1</span><br><span>--export-dir</span><br><span>/user/hive/warehouse/staff_hive</span><br><span>--input-fields-terminated-by</span><br><span>"\t"</span><br><span></span><br><span> bin/sqoop --options-file opt/job_HDFS2RDBMS.opt</span><br></pre></td> </tr> </tbody> </table> #### Sqoop 常用参数 #### <table> <thead> <tr> <th><strong>序号</strong></th> <th><strong>命令</strong></th> <th><strong>类</strong></th> <th><strong>说明</strong></th> </tr> </thead> <tbody> <tr> <td>1</td> <td>import</td> <td>ImportTool</td> <td>将数据导入到集群</td> </tr> <tr> <td>2</td> <td>export</td> <td>ExportTool</td> <td>将集群数据导出</td> </tr> <tr> <td>3</td> <td>codegen</td> <td>CodeGenTool</td> <td>获取数据库中某张表数据生成Java并打包Jar</td> </tr> <tr> <td>4</td> <td>create-hive-table</td> <td>CreateHiveTableTool</td> <td>创建Hive表</td> </tr> <tr> <td>5</td> <td>eval</td> <td>EvalSqlTool</td> <td>查看SQL执行结果</td> </tr> <tr> <td>6</td> <td>import-all-tables</td> <td>ImportAllTablesTool</td> <td>导入某个数据库下所有表到HDFS中</td> </tr> <tr> <td>7</td> <td>job</td> <td>JobTool</td> <td>用来生成一个sqoop的任务,生成后,该任务并不执行,除非使用命令执行该任务。</td> </tr> <tr> <td>8</td> <td>list-databases</td> <td>ListDatabasesTool</td> <td>列出所有数据库名</td> </tr> <tr> <td>9</td> <td>list-tables</td> <td>ListTablesTool</td> <td>列出某个数据库下所有表</td> </tr> <tr> <td>10</td> <td>merge</td> <td>MergeTool</td> <td>将HDFS中不同目录下面的数据合在一起,并存放在指定的目录中</td> </tr> <tr> <td>11</td> <td>metastore</td> <td>MetastoreTool</td> <td>记录sqoop job的元数据信息,如果不启动metastore实例,则默认的元数据存储目录为:~/.sqoop,如果要更改存储目录,可以在配置文件sqoop-site.xml中进行更改。</td> </tr> <tr> <td>12</td> <td>help</td> <td>HelpTool</td> <td>打印sqoop帮助信息</td> </tr> <tr> <td>13</td> <td>version</td> <td>VersionTool</td> <td>打印sqoop版本信息</td> </tr> </tbody> </table> ##### import ##### <table> <thead> <tr> <th><strong>序号</strong></th> <th><strong>参数</strong></th> <th><strong>说明</strong></th> </tr> </thead> <tbody> <tr> <td>1</td> <td>—enclosed-by (char)</td> <td>给字段值前后加上指定的字符</td> </tr> <tr> <td>2</td> <td>—escaped-by (char)</td> <td>对字段中的双引号加转义符</td> </tr> <tr> <td>3</td> <td>—fields-terminated-by (char)</td> <td>设定每个字段是以什么符号作为结束,默认为逗号</td> </tr> <tr> <td>4</td> <td>—lines-terminated-by (char)</td> <td>设定每行记录之间的分隔符,默认是\n</td> </tr> <tr> <td>5</td> <td>—mysql-delimiters</td> <td>Mysql默认的分隔符设置,字段之间以逗号分隔,行之间以\n分隔,默认转义符是\,字段值以单引号包裹。</td> </tr> <tr> <td>6</td> <td>—optionally-enclosed-by (char)</td> <td>给带有双引号或单引号的字段值前后加上指定字符。</td> </tr> </tbody> </table> ##### export ##### <table> <thead> <tr> <th><strong>序号</strong></th> <th><strong>参数</strong></th> <th><strong>说明</strong></th> </tr> </thead> <tbody> <tr> <td>1</td> <td>—input-enclosed-by (char)</td> <td>对字段值前后加上指定字符</td> </tr> <tr> <td>2</td> <td>—input-escaped-by (char)</td> <td>对含有转移符的字段做转义处理</td> </tr> <tr> <td>3</td> <td>—input-fields-terminated-by (char)</td> <td>字段之间的分隔符</td> </tr> <tr> <td>4</td> <td>—input-lines-terminated-by (char)</td> <td>行之间的分隔符</td> </tr> <tr> <td>5</td> <td>—input-optionally-enclosed-by (char)</td> <td>给带有双引号或单引号的字段前后加上指定字符</td> </tr> </tbody> </table> ##### hive ##### <table> <thead> <tr> <th><strong>序号</strong></th> <th><strong>参数</strong></th> <th><strong>说明</strong></th> </tr> </thead> <tbody> <tr> <td>1</td> <td>—hive-delims-replacement (arg)</td> <td>用自定义的字符串替换掉数据中的\r\n和\013 \010等字符</td> </tr> <tr> <td>2</td> <td>—hive-drop-import-delims</td> <td>在导入数据到hive时,去掉数据中的\r\n\013\010这样的字符</td> </tr> <tr> <td>3</td> <td>—map-column-hive (map)</td> <td>生成hive表时,可以更改生成字段的数据类型</td> </tr> <tr> <td>4</td> <td>—hive-partition-key</td> <td>创建分区,后面直接跟分区名,分区字段的默认类型为string</td> </tr> <tr> <td>5</td> <td>—hive-partition-value (v)</td> <td>导入数据时,指定某个分区的值</td> </tr> <tr> <td>6</td> <td>—hive-home (dir)</td> <td>hive的安装目录,可以通过该参数覆盖之前默认配置的目录</td> </tr> <tr> <td>7</td> <td>—hive-import</td> <td>将数据从关系数据库中导入到hive表中</td> </tr> <tr> <td>8</td> <td>—hive-overwrite</td> <td>覆盖掉在hive表中已经存在的数据</td> </tr> <tr> <td>9</td> <td>—create-hive-table</td> <td>默认是false,即,如果目标表已经存在了,那么创建任务失败。</td> </tr> <tr> <td>10</td> <td>—hive-table</td> <td>后面接要创建的hive表,默认使用MySQL的表名</td> </tr> <tr> <td>11</td> <td>—table</td> <td>指定关系数据库的表名</td> </tr> </tbody> </table> #### Sqoop常用命令 #### ##### import ##### 1. 导入数据到HIVE中 <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br></pre></td> <td><pre><span>bin/sqoop import \</span><br><span>--connect jdbc:mysql://datanode1:3306/student \</span><br><span>--username root \</span><br><span>--password 123456 \</span><br><span>--table class \</span><br><span>--hive-import</span><br></pre></td> </tr> </tbody> </table> 1. 增量导入数据到hive中,mode=append 给MySQL添加几条数据 <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br><span>9</span><br><span>10</span><br><span>11</span><br></pre></td> <td><pre><span> bin/sqoop import \</span><br><span>--connect jdbc:mysql://datanode1:3306/student \</span><br><span>--username root \</span><br><span>--password 123456 \</span><br><span>--table class \</span><br><span>--num-mappers 1 \</span><br><span>--fields-terminated-by "\t" \</span><br><span>--target-dir /user/hive/warehouse/class \</span><br><span>--check-column id \</span><br><span>--incremental append \</span><br><span>--last-value 3</span><br></pre></td> </tr> </tbody> </table> 注意:append不能与—hive-等参数同时使用(Append mode for hive imports is not yet supported. Please remove the parameter —append-mode) 使用lastmodified方式导入数据要指定增量数据是要—append(追加)还是要—merge-key(合并):last-value指定的值是会包含于增量导入的数据中 <table> <thead> <tr> <th><strong>序号</strong></th> <th><strong>参数</strong></th> <th><strong>说明</strong></th> </tr> </thead> <tbody> <tr> <td>1</td> <td>—append</td> <td>将数据追加到HDFS中已经存在的DataSet中,如果使用该参数,sqoop会把数据先导入到临时文件目录,再合并。</td> </tr> <tr> <td>2</td> <td>—as-avrodatafile</td> <td>将数据导入到一个Avro数据文件中</td> </tr> <tr> <td>3</td> <td>—as-sequencefile</td> <td>将数据导入到一个sequence文件中</td> </tr> <tr> <td>4</td> <td>—as-textfile</td> <td>将数据导入到一个普通文本文件中</td> </tr> <tr> <td>5</td> <td>—boundary-query (statement)</td> <td>边界查询,导入的数据为该参数的值(一条sql语句)所执行的结果区间内的数据。</td> </tr> <tr> <td>6</td> <td>—columns </td> <td>指定要导入的字段</td> </tr> <tr> <td>7</td> <td>—direct</td> <td>直接导入模式,使用的是关系数据库自带的导入导出工具,以便加快导入导出过程。</td> </tr> <tr> <td>8</td> <td>—direct-split-size</td> <td>在使用上面direct直接导入的基础上,对导入的流按字节分块,即达到该阈值就产生一个新的文件</td> </tr> <tr> <td>9</td> <td>—inline-lob-limit</td> <td>设定大对象数据类型的最大值</td> </tr> <tr> <td>10</td> <td>—m或–num-mappers</td> <td>启动N个map来并行导入数据,默认4个。</td> </tr> <tr> <td>11</td> <td>—query或—e (statement)</td> <td>将查询结果的数据导入,使用时必须伴随参—target-dir,—hive-table,如果查询中有where条件,则条件后必须加上$CONDITIONS关键字</td> </tr> <tr> <td>12</td> <td>—split-by <column-name)</td> <td>按照某一列来切分表的工作单元,不能与—autoreset-to-one-mapper连用(请参考官方文档)</td> </tr> <tr> <td>13</td> <td>—table (table-name)</td> <td>关系数据库的表名</td> </tr> <tr> <td>14</td> <td>—target-dir (dir)</td> <td>指定HDFS路径</td> </tr> <tr> <td>15</td> <td>—warehouse-dir (dir)</td> <td>与14参数不能同时使用,导入数据到HDFS时指定的目录</td> </tr> <tr> <td>16</td> <td>—where</td> <td>从关系数据库导入数据时的查询条件</td> </tr> <tr> <td>17</td> <td>—z或—compress</td> <td>允许压缩</td> </tr> <tr> <td>18</td> <td>—compression-codec</td> <td>指定hadoop压缩编码类,默认为gzip(Use Hadoop codec default gzip)</td> </tr> <tr> <td>19</td> <td>—null-string (null-string)</td> <td>string类型的列如果null,替换为指定字符串</td> </tr> <tr> <td>20</td> <td>—null-non-string (null-string)</td> <td>非string类型的列如果null,替换为指定字符串</td> </tr> <tr> <td>21</td> <td>—check-column (col)</td> <td>作为增量导入判断的列名</td> </tr> <tr> <td>22</td> <td>—incremental (mode)</td> <td>mode:append或lastmodified</td> </tr> <tr> <td>23</td> <td>—last-value (value)</td> <td>指定某一个值,用于标记增量导入的位置</td> </tr> </tbody> </table> ##### export ##### 从HDFS(包括Hive和HBase)中把数据导出到关系型数据库中。 <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br></pre></td> <td><pre><span>bin/sqoop export \</span><br><span>--connect jdbc:mysql://datanode1:3306/student \</span><br><span>--username root \</span><br><span>--password 123456 \</span><br><span>--table class2mysql \</span><br><span>--export-dir /student \</span><br><span>--input-fields-terminated-by "\t" \</span><br><span>--num-mappers 1</span><br></pre></td> </tr> </tbody> </table> <table> <thead> <tr> <th><strong>序号</strong></th> <th><strong>参数</strong></th> <th><strong>说明</strong></th> </tr> </thead> <tbody> <tr> <td>1</td> <td>—direct</td> <td>利用数据库自带的导入导出工具,以便于提高效率</td> </tr> <tr> <td>2</td> <td>—export-dir </td> <td>存放数据的HDFS的源目录</td> </tr> <tr> <td>3</td> <td>-m或—num-mappers </td> <td>启动N个map来并行导入数据,默认4个</td> </tr> <tr> <td>4</td> <td>—table </td> <td>指定导出到哪个RDBMS中的表</td> </tr> <tr> <td>5</td> <td>—update-key </td> <td>对某一列的字段进行更新操作</td> </tr> <tr> <td>6</td> <td>—update-mode </td> <td>updateonly allowinsert(默认)</td> </tr> <tr> <td>7</td> <td>—input-null-string </td> <td>请参考import该类似参数说明</td> </tr> <tr> <td>8</td> <td>—input-null-non-string </td> <td>请参考import该类似参数说明</td> </tr> <tr> <td>9</td> <td>—staging-table </td> <td>创建一张临时表,用于存放所有事务的结果,然后将所有事务结果一次性导入到目标表中,防止错误。</td> </tr> <tr> <td>10</td> <td>—clear-staging-table</td> <td>如果第9个参数非空,则可以在导出操作执行前,清空临时事务结果表</td> </tr> </tbody> </table> ##### codegen ##### 将关系型数据库中的表映射为一个Java类,在该类中有各列对应的各个字段。 <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br></pre></td> <td><pre><span> bin/sqoop codegen \</span><br><span>--connect jdbc:mysql://datanode1:3306/student \</span><br><span>--username root \</span><br><span>--password 123456 \</span><br><span>--table class \</span><br><span>--bindir /opt/moudle \</span><br><span>--class-name class_mysql \</span><br><span>--fields-terminated-by "\t"</span><br></pre></td> </tr> </tbody> </table> <table> <thead> <tr> <th><strong>序号</strong></th> <th><strong>参数</strong></th> <th><strong>说明</strong></th> </tr> </thead> <tbody> <tr> <td>1</td> <td>—bindir </td> <td>指定生成的Java文件、编译成的class文件及将生成文件打包为jar的文件输出路径</td> </tr> <tr> <td>2</td> <td>—class-name </td> <td>设定生成的Java文件指定的名称</td> </tr> <tr> <td>3</td> <td>—outdir </td> <td>生成Java文件存放的路径</td> </tr> <tr> <td>4</td> <td>—package-name </td> <td>包名,如com.z,就会生成com和z两级目录</td> </tr> <tr> <td>5</td> <td>—input-null-non-string </td> <td>在生成的Java文件中,可以将null字符串或者不存在的字符串设置为想要设定的值(例如空字符串)</td> </tr> <tr> <td>6</td> <td>—input-null-string </td> <td>将null字符串替换成想要替换的值(一般与5同时使用)</td> </tr> <tr> <td>7</td> <td>—map-column-java </td> <td>数据库字段在生成的Java文件中会映射成各种属性,且默认的数据类型与数据库类型保持对应关系。该参数可以改变默认类型,例如:—map-column-java id=long, name=String</td> </tr> <tr> <td>8</td> <td>—null-non-string </td> <td>在生成Java文件时,可以将不存在或者null的字符串设置为其他值</td> </tr> <tr> <td>9</td> <td>—null-string </td> <td>在生成Java文件时,将null字符串设置为其他值(一般与8同时使用)</td> </tr> <tr> <td>10</td> <td>—table </td> <td>对应关系数据库中的表名,生成的Java文件中的各个属性与该表的各个字段一一对应</td> </tr> </tbody> </table> ##### eval ##### 可以快速的使用SQL语句对关系型数据库进行操作,经常用于在import数据之前,了解一下SQL语句是否正确,数据是否正常,并可以将结果显示在控制台。 <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br></pre></td> <td><pre><span>bin/sqoop eval \</span><br><span>--connect jdbc:mysql://datanode1:3306/student \</span><br><span>--username root \</span><br><span>--password 123456 \</span><br><span>--query "SELECT * FROM class"</span><br></pre></td> </tr> </tbody> </table> <table> <thead> <tr> <th><strong>序号</strong></th> <th><strong>参数</strong></th> <th><strong>说明</strong></th> </tr> </thead> <tbody> <tr> <td>1</td> <td>—query或—e</td> <td>后跟查询的SQL语句</td> </tr> </tbody> </table> ##### import-all-tables ##### 可以将RDBMS中的所有表导入到HDFS中,每一个表都对应一个HDFS目录 <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br></pre></td> <td><pre><span>bin/sqoop import-all-tables \</span><br><span>--connect jdbc:mysql://datanode1:3306/student \</span><br><span>--username root \</span><br><span>--password 123456 \</span><br><span>--warehouse-dir /all_tables</span><br></pre></td> </tr> </tbody> </table> <table> <thead> <tr> <th><strong>序号</strong></th> <th><strong>参数</strong></th> </tr> </thead> <tbody> <tr> <td>1</td> <td>—as-avrodatafile</td> </tr> <tr> <td>2</td> <td>—as-sequencefile</td> </tr> <tr> <td>3</td> <td>—as-textfile</td> </tr> <tr> <td>4</td> <td>—direct</td> </tr> <tr> <td>5</td> <td>—direct-split-size </td> </tr> <tr> <td>6</td> <td>—inline-lob-limit </td> </tr> <tr> <td>7</td> <td>—m或—num-mappers </td> </tr> <tr> <td>8</td> <td>—warehouse-dir </td> </tr> <tr> <td>9</td> <td>-z或—compress</td> </tr> <tr> <td>10</td> <td>—compression-codec</td> </tr> </tbody> </table> ##### job ##### 用来生成一个sqoop任务,生成后不会立即执行,需要手动执行。 <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br></pre></td> <td><pre><span>$ bin/sqoop job \</span><br><span> --create myjob -- import-all-tables \</span><br><span> --connect jdbc:mysql://datanode1:3306/student \</span><br><span> --username root \</span><br><span> --password 123456</span><br><span>$ bin/sqoop job --list</span><br><span>$ bin/sqoop job --exec myjob</span><br></pre></td> </tr> </tbody> </table> list-databases <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br></pre></td> <td><pre><span>bin/sqoop list-databases \</span><br><span>--connect jdbc:mysql://datanode1:3306/ \</span><br><span>--username root \</span><br><span>--password 123456</span><br></pre></td> </tr> </tbody> </table> ##### list-tables ##### <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br></pre></td> <td><pre><span>bin/sqoop list-tables \</span><br><span>--connect jdbc:mysql://datanode1:3306/student \</span><br><span>--username root \</span><br><span>--password 123456</span><br></pre></td> </tr> </tbody> </table> ##### merge ##### <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br></pre></td> <td><pre><span>bin/sqoop codegen \</span><br><span>--connect jdbc:mysql://datanode1/student \</span><br><span>--username root \</span><br><span>--password 123456 \</span><br><span>--table class \</span><br><span>--bindir /home/hadoop \</span><br><span>--class-name student \</span><br><span>--fields-terminated-by "\t"</span><br></pre></td> </tr> </tbody> </table> <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br></pre></td> <td><pre><span> bin/sqoop merge \</span><br><span>--new-data /test/new \</span><br><span>--onto /test/old \</span><br><span>--target-dir /test/merged \</span><br><span>--jar-file /home/hadoop/student.jar \</span><br><span>--class-name student \</span><br><span>--merge-key id</span><br></pre></td> </tr> </tbody> </table> <table> <thead> <tr> <th><strong>序号</strong></th> <th><strong>参数</strong></th> <th><strong>说明</strong></th> </tr> </thead> <tbody> <tr> <td>1</td> <td>—new-data (path)</td> <td>HDFS 待合并的数据目录,合并后在新的数据集中保留</td> </tr> <tr> <td>2</td> <td>—onto(path)</td> <td>HDFS合并后,重复的部分在新的数据集中被覆盖</td> </tr> <tr> <td>3</td> <td>—merge-key (col)</td> <td>合并键,一般是主键ID</td> </tr> <tr> <td>4</td> <td>—jar-file (file)</td> <td>合并时引入的jar包,该jar包是通过Codegen工具生成的jar包</td> </tr> <tr> <td>5</td> <td>—class-name (class)</td> <td>对应的表名或对象名,该class类是包含在jar包中的</td> </tr> <tr> <td>6</td> <td>—target-dir (path)</td> <td>合并后的数据在HDFS里存放的目录</td> </tr> </tbody> </table> ##### metastore ##### 记录了Sqoop job的元数据信息,如果不启动该服务,那么默认job元数据的存储目录为~/.sqoop,可在sqoop-site.xml中修改。 <table> <tbody> <tr> <td><pre><span>1</span><br></pre></td> <td><pre><span>bin/sqoop metastore</span><br></pre></td> </tr> </tbody> </table> <table> <thead> <tr> <th><strong>序号</strong></th> <th><strong>参数</strong></th> <th><strong>说明</strong></th> </tr> </thead> <tbody> <tr> <td>1</td> <td>—shutdown</td> <td>关闭metastore</td> </tr> </tbody> </table> #### 参考资料 #### [https://student-lp.iteye.com/blog/2157983][https_student-lp.iteye.com_blog_2157983] 尚硅谷Sqoop [FqsIJO.png]: /images/20220210/0ba0ff3000a841ad90a068c34e35470c.png [FqyClQ.png]: /images/20220210/d406508a61d44113ab3a524bc0ddd316.png [http_mirrors.hust.edu.cn_apache_sqoop_1.4.6]: http://mirrors.hust.edu.cn/apache/sqoop/1.4.6/ [https_student-lp.iteye.com_blog_2157983]: https://student-lp.iteye.com/blog/2157983
相关 Sqoop 一、Sqoop 1 官网 http://sqoop.apache.org/ 2 概述 1、用于结构化数据存储(如传统关系型数据库)和Ha... 小咪咪/ 2024年04月20日 08:37/ 0 赞/ 48 阅读
相关 Sqoop 1 Sqoop简介 Apache Sqoop(SQL-to-Hadoop)项目旨在协助RDBMS与Hadoop之间进行高效的大数据交流。用户可以在 Sqoop 谁践踏了优雅/ 2023年06月15日 09:52/ 0 赞/ 6 阅读
相关 Sqoop 文章目录 一、Sqoop简介 二、Sqoop安装 三、Sqoop导入数据 3.1 RDBMS到HDFS 3.2 RDBMS到H àì夳堔傛蜴生んèń/ 2023年02月21日 06:21/ 0 赞/ 26 阅读
相关 sqoop sqoop有什么用? sqoop 用来在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递 ----------------- 秒速五厘米/ 2022年06月06日 01:08/ 0 赞/ 219 阅读
相关 sqoop 笔记 ![Center][] ![Center 1][] ![Center 2][] ![Center 3][] ![Center 4][] ![C £神魔★判官ぃ/ 2022年06月04日 04:56/ 0 赞/ 514 阅读
相关 sqoop_使用 <table> <tbody> <tr> <td><p>命令</p></td> <td><p>说明</p></td> </tr> 一时失言乱红尘/ 2022年05月25日 08:48/ 0 赞/ 193 阅读
相关 Sqoop Sqoop的基本原理和相关参数配置: 简介 Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgre 心已赠人/ 2022年04月25日 01:46/ 0 赞/ 225 阅读
相关 Sqoop Sqoop优化 参考这个https://blog.csdn.net/u010185220/article/details/79085119 如何判断读取的数据是否完整?可 柔情只为你懂/ 2022年03月15日 02:24/ 0 赞/ 250 阅读
相关 Hadoop Sqoop 一、概述: Sqoop是一款开源的工具,主要用于在Hadoop(如Hive、HDFS)与传统的数据库(mysql、Oracle ...)间进行数据的传递,可以将一个关系型数据 古城微笑少年丶/ 2022年01月17日 04:17/ 0 赞/ 244 阅读
相关 Sqoop sqoop flume数据采集 采集日志数据 sqoop数据迁移 hdfs->mysql azkaban任务调度 flume->hdfs->shell->hive- 矫情吗;*/ 2021年12月03日 07:01/ 0 赞/ 295 阅读
还没有评论,来说两句吧...