作者:SIX道仙人 | 来源:互联网 | 2023-08-08 22:37
Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql)间进行数据的传递,可以将一个关系型数据库(例
Sqoop(发音:skup)
是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
进行增量导入是与效率有关的最受关注的问题,因为Sqoop专门是为大数据集设计的。Sqoop支持增量更新,将新记录添加到最近一次的导出的数据源上,或者指定上次修改的时间戳。
由于Sqoop将数据移入和移出关系型数据库的能力,其对于Hive—Hadoop生态系统里的著名的类SQL数据仓库—有专门的支持不足为奇。命令“create-hive-table”可以用来将数据表定义导入到Hive。
简单的说:sqoop是一款数据迁移工具
工作机制:就是通过内置一些数据导入导出的MR 程序,来为我们的数据迁移需求提供便利
sqoop :内置了一下导入导出数据的mr程序
官方网址:http://sqoop.apache.org/
下载:http://archive.apache.org/dist/sqoop/
sqoop是一个工具,只要在一台机器上安装就可以了,要在hadoop环境中运行。
首先在官网上下载sqoop,然后上传到linux中
解压
tar -zxvf sqoop(压缩包) -C /usr/local/apps
然后进入到sqoop中进行配置修改
cd conf/
修改sqoop-env-template.sh
首先,我们要修改sqoop-env-template.sh他的名称
mv sqoop-env-template.sh sqoop-env.sh
然后我们编辑他
vi sqoop-env.sh
首先配置这个,也就是配置hadoop的安装目录
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/usr/local/apps/hadoop-2.6.5
接下来配置mapreduce HOME 也就是hadoop的安装路径
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/usr/local/apps/hadoop-2.6.5
接下来配置hbase的安装目录
#set the path to where bin/hbase is available
export HBASE_HOME=/usr/local/apps/hbase-0.98.24-hadoop2
配置hive的安装目录
#Set the path to where bin/hive is available
export HIVE_HOME=/usr/local/apps/apache-hive-2.1.1-bin
最后配置zookeeper的conf目录
#Set the path for where zookeper config dir is
export ZOOCFGDIR=/usr/local/apps/zookeeper-3.4.6/conf
保存退出
然后我们在把sqoop配置到我们系统的环境变量里面
vi /etc/profile
在最下面写
export SQOOP_HOME=/usr/local/apps/sqoop-1.4.6.bin__hadoop-2.0.4-alpha
在PATH里面添加
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SQOOP_HOME/bin
保存退出
别忘了让系统的环境变量生效一下
source /etc/profile
接下来我们来调用一下sqoop看能不能正常运行
注意:我们所有的安装包和安装目录最好都安装在root下面,在root下面新建一个安装目录apps
要不然系统会提示错误
Warning: /usr/local/apps/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
sqoop中最常用的的两个命令
import Import a table from a database to HDFS (把外部的数据库中的表导入到hdfs中)
export Export an HDFS directory to a database table(把在hdfs中的表导出到sqoop中)‘
测试sqoop使用(会用就行)
第一类:数据库中的数据导入到hdfs中
首先要确保hdfs和yarn都启动起来
start-dfs.sh
start-yarn.sh
接下来我们运行sqoop的命令
sqoop import --connect jdbc:mysql://hadoop-server-00:3306/baba --username root --password root --table bbs_detail
他是放在了hdfs中
hadoop fs -ls /
hadoop fs -ls /user
hadoop fs -ls /user/root
hadoop fs -ls /user/root/bbs_detail
在这下面就是我们上传的数据 他会把我们的上传的数据基本平均分给几个map去上传默认是分给4个map task去做
在没有指点的情况下他会把我们上传的数据上传到/user/root/bbs_detail 是他自己自动生成的
默认情况下的分隔符为 ','
sqoop导入数据到hdfs的高级用法(注意写命令之间的空格)
第一
指定输出路径(--target-dir '/sqoop/td'),指点数据分隔符(--field-terminated-by '\t')
sqoop import --connect jdbc:mysql://hadoop-server-00:3306/baba --username root --password root --table bbs_detail --target-dir '/sqoop/td' --fields-terminated-by '\t'
指点map task的数量 -m (控制map task的数量可以控制内存小文件多了,效率就会低,如果表很大的话,我们也要把map task 数量变多)
sqoop import --connect jdbc:mysql://hadoop-server-00:3306/baba --username root --password root --table bbs_detail --target-dir '/sqoop/td' --fields-terminated-by '\001'-m 1
(在实际生成中,很好用逗号或者tab建做分隔符的,我们用(\001)不可打印的字符作为分隔符)
增加where条件,注意:条件必须用单引号引起来
sqoop import --connect jdbc:mysql://hadoop-server-00:3306/baba --username root --password root --table bbs_detail --where 'id>30' --target-dir '/sqoop/td2' --fields-terminated-by '\001'-m 1
增加query语句(使用\将语句换行 '\'表示转义回车,因为sqoop语句是要写在一行里面的,太长了写不下,我们就用'\'来转义)
sqoop import --connect jdbc:mysql://hadoop-server-00:3306/baba --username root --password root \
--query 'SELECT id,order_id,product_id FROM bbs_detail where id > 30 AND $CONDITIONS'
--split-by bbs_detail.id --target-dir '/sqoop/td3'
注意:如果使用--query这个命令的时候,需要注意的是where后面的参数,AND $CONDITIONS 这个参数必须加上(AND $CONDITIONS 表示上面写的select条件结尾了,这是固定的)
而且存在单引号与双引号的区别,如果--query后面使用的是双引号,那么需要在$CONDITIONS前加上\即\$CONDITIONS
如果设置map的数量为1个时即-m 1,不用加上--split-by ${tablename.column},否则需要加上(--split-by bbs_detail.id 表示,告诉map task按照bbs_detail.id去划分)
我们一般都是把数据导入到hive(数据仓库)中讲SQL语法表达的数据运算逻辑转换为mapreduce程序在hadoop集群上对海量数据进行分析
从数据库中导入数据到hive中
sqoop import --hive-import --connect jdbc:mysql://hadoop-server-00:3306/baba --username root --password root --table bbs_detail
启动hive
命令为hive
show tables
也可以把数据库中的数据导入到hbase中
sqoop import --hbase-import --connect jdbc:mysql://hadoop-server-00:3306/baba --username root --password root --table bbs_detail
第二类:将hdfs上的数据导出到数据库中
sqoop export --connect jdbc:mysql://hadoop-server-00:3306/baba --username root --password root --export-dir '/sqoop/bak' --table td_bak --columns id,order_id --fields-terminated-by',' -m 2
(baba 表示:库 --export-dir '/sqoop/bak'表示:导出的数据现在在哪个目录 --table td_bak 表示:导入的目标的表是哪个表 导入的目标的这个表必须事先存在的(也就是在mysql中要先创建好td_bak这个表),也就是你要先创建好 --columns id,order_id 表示:把哪些字段导入到表中 --fields-terminated-by','表示:文件分隔符为逗号 map task为2)
由于命令太长,我们可以这样去使用命令:
sqoop export --connect jdbc:mysql://hadoop-server-00:3306/baba \
--username root --password root \
--export-dir '/sqoop/bak' --table td_bak \
--columns id,order_id --fields-terminated-by',' -m 2
注意:以上测试要配置mysql的远程连接
GRANT ALL PRIVILEGES ON mytest.* TO 'root'@'192.168.0.104' IDENTIFIED BY 'itcast' WITH GRANT OPTION;
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON*.*TO'root'@'%'IDENTIFIED BY 'itcast' WITH GRANT OPTION;
设置Mysql远程访问
grant all privileges on . to 'root'@'%' identified by '123456' with grant option;
解决Mysql乱码问题
找一个配置文件,复制到/etc/目录,命名为my.cnf
(有时候没有my.cnf)
cp /usr/share/doc/mysql-server-5.1.73/my-medium.cnf /etc/my.cnf
vim my.cnf
在[client]和[mysqld]下面都添加上
default-character-set=utf8
最后按Esc输入
:wq
保存退出