Sqoop笔记整理
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,[toc]Sqoop笔记整理概述SQOOP ---数据搬用工 可以将外部数据迁移到hdfs目录或者hive表或者hbase表import原理从传统数据库获取元数据信息(schema、tabl
千家信息网最后更新 2025年02月03日Sqoop笔记整理
[toc]
Sqoop笔记整理
概述
SQOOP ---数据搬用工 可以将外部数据迁移到hdfs目录或者hive表或者hbase表
import原理
从传统数据库获取元数据信息(schema、table、field、field type),把导入功能转换为只有Map的Mapreduce作业,在mapreduce中有很多map,每个map读一片数据,进而并行的完成数据的拷贝。
export原理
获取导出表的schema、meta信息,和Hadoop中的字段match;多个map only作业同时运行,完成hdfs中数据导出到关系型数据库中。
Sqoop安装
下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/sqoop/1.4.7/下载之后进行解压: tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /home/uplooking/app重命名: [uplooking@uplooking01 ~]$ mv app/sqoop-1.4.7.bin__hadoop-2.6.0/ app/sqoop配置SQOOP_HOME到环境变量中 export SQOOP_HOME=/home/uplooking/app/sqoop export PATH=$PATH:$SQOOP_HOME配置$SQOOP_HOME/conf/sqoop-env.sh export HADOOP_COMMON_HOME=/home/uplooking/app/hadoop export HADOOP_MAPRED_HOME=/home/uplooking/app/hadoop export HBASE_HOME=/home/uplooking/app/hbase export HIVE_HOME=/home/uplooking/app/hive export ZOOCFGDIR=/home/uplooking/app/zookeeper/conf 下面这个在1.4.7中需要配置,否则在执行数据导入到hive时会报错 export HIVE_CONF_DIR=/home/uplooking/app/hive/conf注意:1、数据库驱动: 在执行sqoop命里的受需要拷贝相关数据库驱动jar包到$SQOOP_HOME/lib目录下,例如mysql需要mysql-connector-java-5.1.32-bin.jar以上版本支持。2、JDK版本 JDK版本最好1.7以上。3、hive的核心包拷贝(这个在1.4.7中需要配置,否则在执行数据导入到hive时会报错) 将$HIVE_HOME/lib/hive-exec.jar拷贝到$SQOOP_HOME/lib目录下,不然会报 18/03/15 15:50:54 ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly. 18/03/15 15:50:54 ERROR tool.ImportTool: Import failed: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
数据导入import
由mysql导入数据到HDFS
people表中的数据:
+----+-----------+------+--------+| id | name | age | height |+----+-----------+------+--------+| 1 | 小甜甜 | 18 | 168 || 2 | 小丹丹 | 19 | 167 || 3 | 大神 | 25 | 181 || 4 | 团长 | 38 | 158 || 5 | 记者 | 22 | 169 |+----+-----------+------+--------+
数据导入:
sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people将msyql数据test中的表people,导入到hdfs目录,该目录在/user/用户/people下面,其中people为导入的表名,
这是sqoop导入到的默认目录,如果要想导入到指定的目录,添加一个选项--target-dir:
sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people --target-dir /output/sqoop/people
因为默认执行sqoop会有4个maptasks任务,为了满足业务的需要,可以进行修改,只需要在命令后面加一个选项-m:
sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people --target-dir /output/sqoop/people -m 2
执行的过程中,如果输出目录已经存在,报错,要想输出到该目录 使用选项--delete-target-dir:
sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people --target-dir /output/sqoop/people -m 2 --delete-target-dir
如果想在原来的基础之上追加新的数据,只需要添加一个选项--append,但是注意,--append和--delete-target-dir不能同时存在:
sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people --target-dir /output/sqoop/people -m 2 --append
条件导入:
sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people --target-dir hdfs://ns1/input/sqoop/people --append -m 1 --where "age < 20 and height > 167"
通过sql导入:
#!/bin/bashSQOOP_HOME=/home/uplooking/app/sqoopsqoop import \--connect jdbc:mysql://192.168.43.116:3306/test \--username root \--password root \--target-dir hdfs://ns1/input/sqoop/people \--query "select id, name, age, height from people where age < 30 and height > 168 and \$CONDITIONS" \--append -m 1 \
由mysql导入到hive
sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username 'root' --password 'root' --table people --hive-import -m 1覆盖数据(只覆盖数据,不覆盖表结构)sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username 'root' --password 'root' --table people --hive-import -m 1 --hive-overwrite创建表名sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username 'root' --password 'root' --table people --hive-import -m 1 --hive-table "hpeople" --hive-overwrite导出所有的表到hive中sqoop import-all-tables --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --hive-import --fields-terminated-by "\001" --lines-terminated-by "\n"# 这里指定了行和列的分隔符,因为默认情况下,MySQL导入到hive的数据是以逗号作为分隔符的,# 数据从hive(准确说应该是HDFS)导出到mysql时默认也是以逗号作为列分隔符的,这点尤其需要注意
由mysql导入到HBase
sqoop import \--connect jdbc:mysql://192.168.43.116:3306/test \--username 'root' \--password 'root' \--table people \--hbase-create-table \--hbase-row-key id \--hbase-table hpeople \--column-family cf导入Hbase的时候,默认使用主键做key,没有主键使用--split-by,暂时处理不了联合主键,最好现在hbase中建立相关的表结构
查看HBase中表的数据:
hbase(main):002:0> scan 'hpeople'ROW COLUMN+CELL 1 column=cf:age, timestamp=1521846328316, value=18 1 column=cf:height, timestamp=1521846328316, value=168.0 1 column=cf:name, timestamp=1521846328316, value=\xE5\xB0\x8F\xE7\x94\x9C\xE7\x94\x9C 2 column=cf:age, timestamp=1521846328096, value=19 2 column=cf:height, timestamp=1521846328096, value=167.0 2 column=cf:name, timestamp=1521846328096, value=\xE5\xB0\x8F\xE4\xB8\xB9\xE4\xB8\xB9 3 column=cf:age, timestamp=1521846329182, value=25 3 column=cf:height, timestamp=1521846329182, value=181.0 3 column=cf:name, timestamp=1521846329182, value=\xE5\xA4\xA7\xE7\xA5\x9E 4 column=cf:age, timestamp=1521846328454, value=38 4 column=cf:height, timestamp=1521846328454, value=158.0 4 column=cf:name, timestamp=1521846328454, value=\xE5\x9B\xA2\xE9\x95\xBF 5 column=cf:age, timestamp=1521846330135, value=22 5 column=cf:height, timestamp=1521846330135, value=169.0 5 column=cf:name, timestamp=1521846330135, value=\xE8\xAE\xB0\xE8\x80\x85 5 row(s) in 0.1620 seconds
数据导出export
数据导出到mysql,默认以逗号作为分隔符
从HDFS导出到mysql
导出的时候字段需要一一对应sqoop export \--connect jdbc:mysql://192.168.43.116:3306/test \--username root --password root \--table people \--export-dir hdfs://ns1/input/sqoop/people 中文乱码:sqoop export \--connect "jdbc:mysql://192.168.43.116:3306/test?useUnicode=true&characterEncoding=utf-8" \--username root \--password root \--table people \--export-dir hdfs://ns1/input/sqoop/people插入或更新如果存在就更新,不存在就插入(指的是某一条记录,而不是表本身)sqoop export --connect "jdbc:mysql://192.168.43.116:3306/test?useUnicode=true&characterEncoding=utf-8" \--username root \--password root \--table people--export-dir /export -m 1 \--update-key id \--update-mode allowinsert
从Hive导出到mysql
和导入类似 -input-fields-terminated-by解析HDFS上面的数据到数据库时使用参数sqoop export \--connect jdbc:mysql://192.168.43.116:3306/test \--username root \--password root \--table people \--export-dir /user/hive/warehouse/hpeople--input-fields-terminated-by '\001'
从HBase导出到mysql
目前没有直接从HBase导出的方法,但是可以先将数据导出到HDFS中(通过Hive和HBase的整合),然后再从HDFS导出到mysql中。
数据
目录
数据库
分隔符
拷贝
配置
版本
逗号
会报
信息
原理
同时
字段
时候
最好
结构
作业
更新
输出
驱动
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
报文解析数据库代码
北京社交软件开发公司
云服务器租用哪家好
南宁九星互联网科技有限公司
网络安全比赛稿
九江web安全网络安全培训
我的世界大宝哥的服务器
网络安全工作包括哪些岗位
宁波财务软件开发高端的
软件开发调级自我评价
gt7服务器正在维护
网络安全教育三字经
金蝶专业版服务器连接不上
软件开发青岛工资
数据库事务原理及并发 死锁
网络安全用什么编程语言好
数据库6680端口安全隐患
软件开发公司内幕
浙江3c消费电子软件开发
网店的网络安全防护包括哪些
skyblock服务器地址
网络安全监察员
软件开发常用的有几种语言
大理在线java软件开发
数据库的引用和复制
数据库原理与应用教程第五章视图
如何抓取服务器数据库
java数据库更新操作
社科类综合性外文数据库
海南农商行软件开发待遇