sqoop简介
Sqoop是Hadoop生态系统”中的其中一员——Apache Sqoop。
Apache Sqoop(TM) is a tool designed for efficiently transferringbulk data between ApacheHadoopandstructured datastoressuch as relational databases.
Sqoop是一个为高效传输海量数据而设计的工具,一般用在从关系型数据库同步数据到非关系型数据库中。
使用Sqoop进行数据的导入、导出,其本质上是运行Mapreduce程序,充分利用了MR的并行化和容错性。
因为Sqoop专门是为大数据集设计的。Sqoop支持增量更新,将新记录添加到最近一次的导出的数据源上,或者指定上次修改的时间戳。
一、安装
通过在CDH平台添加服务安装Sqoop组件。
二、使用Sqoop操作各种数据库
在使用sqoop连接到各种数据库之前,首先得在sqoop环境中加入各种数据库的驱动包
下载驱动包上传到/opt/cloudera/parcels/CDH-5.12.2-1.cdh5.12.2.p0.4/lib/sqoop/lib
目录下,然后给驱动包授权 chmod 777 xxx
sqoop连接到Mysql数据库
获取Mysql数据库中的数据库名称
sqoop list-database -connect 'jdbc:mysql://10.1.96.xx:3306' -username test -password test
注意:不能使用mysql的超级管理员root,否则可能会出现错误
sqoop连接到sqlserver数据库
获取sqlserver数据库的某个数据库下的所有表的名称
sqoop list-tables -connect'jdbc:sqlserver://192.168.12.xx:1433;database=pems;username=sa;password=v3pems@2020'
sqoop 将oracle数据库中的某个库中的所有表导入到hive中
sqoop import-all-tables -connect jdbc:oracle:thin:@10.89.142.207:1521:orcl -username scott -password tiger -hive-database eda -hive-import -create-hive-table -m 1
注意:thin后面还是有个:的。否则会报错
使用Sqoop执行sql语句
sqoop eval -connect 'jdbc:sqlserver://192.168.12.65:1433;database=PEMS_DATA;username=sa;password=V3pems@2021' -query'select count(*) from rep_energy_tar'
注意:sqoop的抽取数据的时候目标源表名是区分大小写的
三、Sqoop导入数据出现的问题
出现上述问题的时候,先去cm的ui界面查看bug提示,报错提示中有url,复制到浏览器打开即可,然后滑动至最下方查看详细日志。
根据日志提示,大概是如下错误:
org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=EXECUTE, inode="/tmp/hadoop-yarn":grid:supergroup:drwx------
从上面的错误看出该用户 没有执行权限 查看了一下
hadoop fs -ls /tmp
确实 ,权限不够,只能切换到超级用户 su hdfs 赋予root 相应的权限
[hdfs@h1 root]$ hadoop fs -chown -R root:root /tmp
执行命令后,登陆root 账户
再次执行sqoop导入命令。
sqoop 导入数据到Hive
注:sqoop从导入数据的时候可以不用在目标源库下建立表,sqoop可以在导入的时候自动建立表。
sqoop从sqlserver导入数据到hive
sqoop import -connect 'jdbc:sqlserver://192.168.12.xx:1433;database=pems_data;username=sa;password=user' -table tablename -hive-import -hie-database fmcs -create-hive-table -m 1
还有可能出现的错误:
Output directory hdfs://hadoop:8020/user/root/output already exists
这是因为每次MR都会生成一个output目录但是不能自动删除,所以我们就把HDFS的输出目录删除:
hadoop fs -ls -R:查看目录
hadoop fs -rmr output:删除输出目录
四、sqoop常见操作命令
使用参数说明
1.数据导入:sqoop import
可通过 sqoop import --help 命令查看参数 说明
普通参数
- –connect 指定JDBC连接字符串
- –connection-manager 指定连接管理器类名
- –connection-param-file 指定连接参数文件
- –driver 手动指定要使用的JDBC驱动程序类
- –hadoop-home 覆盖 $HADOOP_MAPR ED_HOME_ARG 参数
- –hadoop-mapred-home 覆盖 $HADOOP_MAPR ED_HOME_ARG 参数
- –help 打印使用说明
- –metadata-transaction-isolation-level 为元数据查询定义事务隔离级别
- –oracle-escaping-disabled 禁用Oracle/OraOop连接管理器的转义机制
- -P 从控制台读取密码
- –password 设置密码验证
- –password-alias 凭据提供程序密码别名
- –password-file 在密码文件路径上设置验证
- –relaxed-isolation 对导入使用read-uncommi隔离
- –skip-dist-cache 跳过将jar复制到分布式缓存
- –temporary-rootdir 定义导入的临时根目录
- –throw-on-error 在作业期间发生错误时,重新抛出RuntimeException
- –username 设置身份验证的用户名
- –verbose 工作时打印更多信息
导入的控制参数
- –append 以追加模式导入数据
- –as-avrodatafile 将导入数据以avro文件存储
- –as-parquetfile 将导入数据以parquet文件存储
- –as-sequencefile 将导入数据以SequenceFile文件存储
- –as-textfile 以纯文本形式导入数据(默认)
- –autoreset-to-one-mapper 如果没有拆分键可用,则将映射器的数量重置为一个映射器
- –boundary-query 设置边界查询,检索主键的最大值和最小值
- –columns <col,col,col…> 指定需要导入的列
- –compression-codec 用于导入的压缩编解码器
- –delete-target-dir 以删除模式导入数据(如果目标文件存在则删除再导入. 不指定时如果目标路径存在则报错)
- –direct 使用直接导入快速路径
- –direct-split-size 在直接模式导入时,将输入流按“n”字节分割
- -e,–query 导入SQL“语句”的结果
- –fetch-size 当需要更多行时,设置从数据库中获取的行数’n’,设置内联LOB的最大大小
- -m,–num-mappers 使用n个map任务并行导入.默认并行度为4
- –mapreduce-job-name 为生成的mapreduce作业设置名称
- –merge-key 要用于合并结果的Key列(用于增量导入时重复数据的合并)
- –split-by 用于分割工作单元的表的列
- –split-limit 日期/时间/时间戳和整数类型的拆分列每次拆分的行上限。对于日期或时间戳字段,以秒为单位计算。拆分极限应该大于0
- –table 读取的表名(要导入的表)
- –target-dir 导入的表存放于HDFS中的目标路径
- –validate 使用配置的验证器验证副本
- –validation-failurehandler ValidationFailureHandler的完全限定类名
- –validation-threshold ValidationThreshold的完全限定类名
- –validator Validator的完全限定类名
- –warehouse-dir 要导入hdfs的父路径
- –where 导入时使用WHERE条件过滤
- -z,–compress 启用压缩
增量导入参数
- –check-column 源列,以检查增量更改
- –incremental 定义类型为“append”或“lastmodified”的增量导入
- –last-value 增量检查列中最后导入的值
输出行格式化参数
- –enclosed-by 设置所需字段的封闭字符
- –escaped-by 设置转义字符
- –fields-terminated-by 设置字段分隔符
- –lines-terminated-by 设置行尾字符
- –mysql-delimiters 使用MySQL默认的分隔符集: 字段:, ;行:n ;转义字符: ;字段包围符:’
- –optionally-enclosed-by 设置包含字符的字段
输入解析参数
- –input-enclosed-by 设置所需的字段罩
- –input-escaped-by 设置输入转义字符
- –input-fields-terminated-by 设置输入字段分隔符
- –input-lines-terminated-by 设置输入行结束字符
- –input-optionally-enclosed-by 设置包含字符的字段
Hive参数
- –create-hive-table 导入时自动创建Hive表.如果目标hive表存在,则失败
- –hive-database 设置导入到hive时要使用的数据库名称
- –hive-delims-replacement 用用户定义的字符串替换导入字符串字段中的Hive record 0x01和行分隔符(nr)
- –hive-drop-import-delims 从导入的字符串字段中删除Hive记录0x01和行分隔符(nr)
- –hive-home 覆盖 $HIVE_HOME 配置参数
- –hive-import 将表导入到Hive中(如果没有设置任何分隔符,则使用Hive的默认分隔符)
- –hive-overwrite 重写Hive表中的现有数据(覆盖导入)
- –hive-partition-key 设置导入到hive时要使用的分区键
- –hive-partition-value 设置导入到hive时要使用的分区值
- –hive-table 设置导入到hive时要使用的表名
- –map-column-hive 覆盖指定列到hive类型的映射
HCatalog参数(Hive元数据导入参数)
- –hcatalog-database HCatalog数据库名称(即Hive数据库)
- –hcatalog-home 覆盖 $HCAT_HOME(即HIVE_HOME)
- –hcatalog-partition-keys 设置导入到hive时要使用的分区键
- –hcatalog-partition-values 设置导入到hive时要使用的分区值
- –hcatalog-table HCatalog表名(即Hive表)
- –hive-home 覆盖 $HIVE_HOME
- –hive-partition-key 设置导入到hive时要使用的分区键
- –hive-partition-value 设置导入到hive时要使用的分区值
- –map-column-hive 覆盖指定列到hive类型的映射
HCatalog导入特定选项
- –create-hcatalog-table 在导入之前创建HCatalog
- –drop-and-create-hcatalog-table 在导入之前删除并创建HCatalog
- –hcatalog-storage-stanza 用于创建表的HCatalog存储节
HBase参数
- –column-family 设置导入的目标列族
- –hbase-bulkload 启用HBase批量加载
- –hbase-create-table 如果指定,创建缺少的HBase表
- –hbase-row-key 指定要使用哪个输入列作为行键
- –hbase-table 导入到HBase中的表名
Accumulo参数
- –accumulo-batch-size 批处理大小(以字节为单位)
- –accumulo-column-family 设置导入的目标列族
- –accumulo-create-table 如果指定,则创建缺少的累加Accumulo表
- –accumulo-instance Accumulo实例名
- –accumulo-max-latency 最大写延迟(以毫秒为单位)
- –accumulo-password Accumulo密码
- –accumulo-row-key 指定要使用哪个输入列作为行键
- –accumulo-table 导入到Accumulo中的表
- –accumulo-user Accumulo用户名
- –accumulo-visibility 要应用于导入的所有行的可见性令牌
- –accumulo-zookeepers 逗号分隔的zookeeper列表(主机:端口号)
代码生成的参数
- –bindir 编译对象的输出目录
- –class-name 设置生成的类名,覆盖 --package-name. 当与–jar-file组合时,设置input类.
- –escape-mapping-column-names 禁用列名中转义的特殊字符
- –input-null-non-string 输入空非字符串表示
- –input-null-string 输入空字符串表示
- –jar-file 禁用代码生成;使用指定的jar
- –map-column-java 覆盖特定列到java类型的映射
- –null-non-string 空非字符串表示(数值型默认初始化值:0)
- –null-string 空字符串表示(即String默认初始化值:"")
- –outdir 生成代码的输出目录
- –package-name 将自动生成的类放在这个包中