sqoop 整库导入数据

需求

最近在迁移老数据的时候需要把mysql的整个库全部迁移到hive,由于mysql的表和库比较多,建表麻烦,所以只有祭出神器–sqoop的整库导入。

整库导入

sqoop  import-all-tables --connect jdbc:mysql://ip:3306/dbname  --username user --password password --hive-database abc  -m 10  --create-hive-table  --hive-import --hive-overwrite --autoreset-to-one-mapper

import-all-tables :导入所有表

--connect :连接的url地址

--username:mysql用户名

--password:mysql密码

--hive-database:导入到hive的数据库

-m:指定几个map任务,如果没有主键,只能有一个map    例如:-m 1

--create-hive-table :创建表,如果不创建表,hive里是没有表的。

--hive-import:导入数据到hive里

--hive-overwrite :覆盖导入

--autoreset-to-one-mapper:如果表没有主键,导入时使用一个mapper执行

常用参数

通用参数

--connect <jdbc-uri>:指定JDBC连接字符串。
--connection-manager <class-name>:指定要使用的连接管理器类。
--driver <class-name>:手动指定要使用的JDBC驱动程序类。
--hadoop-mapred-home <dir>:覆盖$ HADOOP_MAPRED_HOME。
--help:打印使用说明。
--password-file:为包含认证密码的文件设置路径。
-P:从控制台读取密码。
--password <password>:设置验证密码。
--username <username>:设置验证用户名。
--verbose:在运行时打印更多信息。
--connection-param-file <filename>:提供连接参数的可选属性文件。
--relaxed-isolation:将mapper的连接事务隔离设置为只读。

导入控制参数

--as-avrodatafile:将数据导入Avro数据文件。
--as-sequencefile:将数据导入到SequenceFiles。
--as-textfile:以纯文本形式导入数据(默认)。
--as-parquetfile:将数据导入Parquet文件。
--direct:使用direct快速导入。
--inline-lob-limit <n>:设置内联LOB的最大大小。
-m,--num-mappers <n>:使用n个mapper任务并行导入。
--warehouse-dir <dir>:表目的地的HDFS父级目录。
-z,--compress:启用压缩。
--compression-codec <c>:使用Hadoop编解码器(默认gzip)。
--exclude-tables <tables>:逗号分隔的表格列表,以便从导入过程中排除。
--autoreset-to-one-mapper:如果表没有主键,导入时使用一个mapper执行。

输出格式参数

--enclosed-by <char>:设置必需的字段包围字符。
--escaped-by <char>:设置转义字符。
--fields-terminated-by <char>:设置字段分隔符。
--lines-terminated-by <char>:设置行尾字符。
--mysql-delimiters:使用MySQL的默认分隔符集:fields:, lines:\n escaped-by:\ optional-enclosed-by:'。
--optionally-enclosed-by <char>:设置字段包含字符。

输入分析参数

--input-enclosed-by <char>:设置必需的字段封闭器。
--input-escaped-by <char>:设置输入转义字符。
--input-fields-terminated-by <char>:设置输入字段分隔符。
--input-lines-terminated-by <char>:设置输入的行尾字符。
--input-optionally-enclosed-by <char>:设置字段包含字符。

Hive参数

--hive-home <dir>:覆盖 $HIVE_HOME。
--hive-import:将表导入Hive(如果没有设置,则使用Hive的默认分隔符。)。
--hive-overwrite:覆盖Hive表中的现有数据。。
--create-hive-table:如果设置,则作业将失败,如果目标配置单元表存在。默认情况下,该属性为false。
--hive-table <table-name>:设置导入到Hive时要使用的表名。
--hive-drop-import-delims:导入到Hive时,从字符串字段中 删除\ n,\ r和\ 01。
--hive-delims-replacement:在导入到Hive时,将字符串字段中的\ n,\ r和\ 01 替换为用户定义的字符串。
--hive-partition-key:分区的配置单元字段的名称被打开
--hive-partition-value <v>:字符串值,用作此作业中导入配置单元的分区键。
--map-column-hive <map>:覆盖从SQL类型到配置列的Hive类型的默认映射。如果在此参数中指定逗号,请使用URL编码的键和值,例如,使用DECIMAL(1%2C%201)而不是DECIMAL(1,1)。

代码生成参数

--bindir <dir>:编译对象的输出目录。
--jar-file <file>:禁用代码生成; 使用指定的jar。
--outdir <dir>:生成代码的输出目录。
--package-name <name>:将自动生成的类放入此包中。
<think>我们被要求回答如何将MySQL数据导入Hive的所有方法、优缺点及技术要求。根据提供的引用,我们可以总结出几种方法,并分析其优缺点和技术要求。引用[3]提供了几种全量备份(初次导入原始数据)的方法:1.先将数据导入HDFS中,然后在Hive中建内部,将数据load进Hive(load后HDFS中的数据会消失)。2.先将数据导入HDFS,然后建Hive外部,设置location为HDFS的路径,做数据关联(源数据路径不变)。3.将数据直接导入已创建好的Hive中(需要手动建)。4.将数据导入Hive中,Hive不存在,导入的时候自动创建Hive。5.使用Sqoop的import-all-tables工具一次性全导入自动生成,但需要满足条件:每个必须有主键或使用--autoreset-to-one-mapper选项;导入所有列;不能使用WHERE条件。引用[4]提到了使用Sqoop将MySQL数据导入Hive分区的方法,但这是针对单的。对于导入,我们可以使用Sqoop的import-all-tables。此外,引用[2]提到Hive是基于Hadoop的数据工具,使用HiveQL查询,适合批处理作业。因此,我们可以将导入的方法归纳为两大类:使用Sqoop工具(特别是import-all-tables)和手动分步骤导入。下面详细说明每种方法:###方法1:使用Sqoop的import-all-tables一次性导入**步骤**:1.使用Sqoop的`import-all-tables`命令,指定MySQL连接参数和Hive数据。2.Sqoop自动将MySQL中所有导入Hive中,并自动创建对应的Hive。**示例命令**:```bashsqoopimport-all-tables\--connectjdbc:mysql://mysql_host:3306/db_name\--usernameuser\--passwordpass\--hive-import\--hive-databasehive_db_name\--create-hive-table\--autoreset-to-one-mapper```**注意**:-`--autoreset-to-one-mapper`:如果没有主键,则使用一个map任务(否则需要每个都有主键)。-默认情况下,Sqoop会使用MapReduce并行导入,但如果没有主键,则需要设置`--autoreset-to-one-mapper`或指定拆分列(`--split-by`)以避免错误。**优点**:-自动化程度高,一条命令即可完成数据导入。-自动创建Hive,无需手动建。**缺点**:-要求MySQL中的每个都必须有主键,或者使用`--autoreset-to-one-mapper`(这样每个都只用一个mapper,效率低)。-不能选择部分或部分列,也不能使用WHERE条件过滤数据。-导入过程中可能会占用大量资源,影响MySQL性能。**技术要求**:-安装并配置Sqoop(需要MySQLJDBC驱动)。-Hadoop和Hive环境正常运行。-确保网络连通性(从Sqoop节点到MySQL和Hadoop集群)。###方法2:分步导入级别控制)如果数据中有没有主键,或者需要更灵活的控制(如只导入部分、部分列或进行过滤),则可以采用分步导入,即对每个单独使用Sqoop导入。**步骤**:1.获取MySQL数据中的所有名。2.针对每个,编写Sqoop导入命令,可以指定列、WHERE条件等。3.可以选择导入Hive内部或外部。**示例命令(单导入)**:```bashsqoopimport\--connectjdbc:mysql://mysql_host:3306/db_name\--usernameuser\--passwordpass\--tabletable_name\--hive-import\--hive-tablehive_db_name.table_name\--create-hive-table```**优点**:-灵活控制每个导入过程(例如,可以指定列、WHERE条件、分区等)。-可以处理没有主键的(通过指定`-m1`或`--autoreset-to-one-mapper`,或者指定拆分列)。-可以导入为外部(通过指定`--hive-import`并且设置外部属性,但Sqoop默认导入为内部,如果需要外部,可以在导入后修改属性,或者在导入后创建外部并加载数据)。**缺点**:-需要编写脚本循环处理每个自动化程度较低。-如果数量多,操作繁琐。**技术要求**:-需要编写脚本(如Shell脚本)来遍历所有并执行导入。-同方法1,需要Sqoop、Hadoop、Hive环境。###方法3:先导入HDFS,再关联Hive这种方法分为两步:先将MySQL数据导入HDFS,然后在Hive中创建(内部或外部)关联到HDFS路径。**步骤**:1.使用Sqoop将MySQL导入到HDFS(不导入Hive)。```bashsqoopimport\--connectjdbc:mysql://mysql_host:3306/db_name\--usernameuser\--passwordpass\--tabletable_name\--target-dir/path/to/hdfs/dir/table_name\--as-textfile#或其他格式```2.在Hive中创建:-内部:创建后,使用`LOADDATAINPATH`将数据加载到Hive中(会移动HDFS文件到Hive目录)。-外部:创建时指定`LOCATION`为HDFS路径,这样数据保留在原位置,Hive直接读取。**优点**:-可以灵活控制数据在HDFS的位置和Hive的类型(内部或外部)。-导入到HDFS后,可以多次创建或修改Hive结构。**缺点**:-步骤较多,需要分别执行导入和建操作。-对于导入,需要为每个执行操作,比较繁琐。**技术要求**:-需要熟悉Hive语句和HDFS路径操作。###方法4:使用Sqoop导入自动创建Hive(单)类似于方法1中的单导入,在导入自动创建Hive。但导入需要结合脚本。###方法5:使用Sqoop导入到已有Hive如果Hive中已经创建了结构,可以直接导入到已有的Hive中。**步骤**:1.在Hive中手动创建所有结构需与MySQL兼容)。2.使用Sqoop的`--hive-import`和`--hive-table`参数导入到已存在的。**优点**:-可以精确控制Hive结构(如数据类型、分区等)。-适合需要调结构(如分区)的场景。**缺点**:-需要预先在Hive中创建所有,工作量大。###总结|方法|优点|缺点|适用场景||------|------|------|----------||Sqoopimport-all-tables|自动导入自动|要求有主键或使用单mapper;不能过滤数据|快速导入,且都有主键或可以接受单mapper||分导入Sqoop脚本循环)|灵活控制每个;可处理无主键;可过滤数据|需要编写脚本;多时繁琐|需要灵活控制导入过程,或无主键||先导入HDFS再关联Hive|灵活选择内部或外部数据保留在指定位置|步骤多;需要手动建|需要保留原始数据位置或需要多次建||导入到已有Hive|精确控制结构;支持分区等|需要预先创建所有|需要调结构(如分区)|###技术要点1.**Sqoop连接参数**:需要MySQL的JDBC驱动,并正确设置连接字符串、用户名和密码。2.**Hive类型**:-内部(ManagedTable):数据Hive管理,删除数据也会被删除。-外部(ExternalTable):数据存储在指定位置,删除数据不会被删除。3.**数据格式**:Sqoop默认导入为文本格式,也可以通过`--as-avrodatafile`或`--as-parquetfile`指定其他格式。4.**分区**:如果导入Hive分区,需要指定分区字段和值(如引用[4]所示),导入中每个单独处理分区比较困难,通常需要分导入。5.**增量导入**:上述方法都是全量导入。如果后续需要增量导入,可以使用Sqoop的增量导入功能(如`--incrementalappend`或`lastmodified`),但这通常针对单。###注意事项-**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值