Sqoop入门常用命令

Sqoop 查询

使用sqoop列出mysql中数据库database

sql 复制代码
sqoop list-databases 
--connect jdbc:mysql://192.168.249.130:3306 
--username root 
--password Mzp_2022!

如果出现下面这个报错,说明mysql的jdbc没有配置好

这个包放到这个位置

这实际是sqoop连接不上MySQL了

JDBC = Java Database Connectivity ,翻译过来是:Java 数据库连接技术

✅ 大白话解释:JDBC 是一套Java 语言写的「通用接口 / 工具包」 ,作用是:让 Java 程序,能连接上各种数据库(MySQL/Oracle 等),并且对数据库执行增删改查 SQL 语句

正常是这样的

使用sqoop列出mysql中指定数据库duoduo_db中的所有表

/database的名字

sql 复制代码
-- 使用sqoop列出mysql中指定数据库duoduo_db中的所有表
sqoop list-tables 
--connect jdbc:mysql://192.168.249.130:3306/duoduo_db 
--username root 
--password Mzp_2022!


sqoop list-tables --connect jdbc:mysql://192.168.249.130:3306/database的名字 --username root --password Mzp_2022!

MySQL迁移到HDFS

从mysql数据库duoduo_db中导出表base_category1到HDFS平台/bi2513/category1

sqoop import

--connect jdbc:mysql://192.168.249.130:3306/duoduo_db

--username root

--password Mzp_2022!

--table base_category1

-m 1

--target-dir /bi2513/category1

--delete-target-dir

--driver com.mysql.jdbc.Driver

sqoop import------把 MySQL 数据库里的表数据,导入到 HDFS 中

--username root --password Mzp_2022! ------用账号root、密码Mzp_2022! 访问duoduo_db数据库

--table base_category1 ------访问duoduo_db数据库,将该库下的base_category1表的全部数据

-m 1 ------用1 个 Map 任务

--target-dir /bi2513/category1 ------导入到 HDFS 的/bi2513/category1目录下

--delete-target-dir------

执行这条 Sqoop 导入命令之前,自动检测 HDFS 上的目标目录/bi2513/category1 是否存在:

✅ 如果存在 → 自动删除这个目录(包括目录下所有文件),然后再重新创建该目录,执行数据导入;

✅ 如果不存在 → 什么都不做,直接创建目录,执行数据导入。

--driver com.mysql.jdbc.Driver------指定使用 MySQL 的 JDBC 驱动类完成连接

从MySQL取数据中插入特定要求的 行 到hdfs中

结尾加query

sql 复制代码
sqoop import \
--connect jdbc:mysql://192.168.249.130:3306/duoduo_db \
--username root \
--password Mzp_2022! \
--target-dir /user/category3 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'SELECT * FROM base_category3 WHERE id<=100  and $CONDITIONS;'
sql 复制代码
sqoop import \
--connect jdbc:mysql://192.168.249.130:3306/duoduo_db \
--username root \
--password Mzp_2022! \
--target-dir /user/category3 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query "SELECT * FROM base_category3 WHERE NAME LIKE '%机%'  and \$CONDITIONS;"

提示:query的结尾必须加'CONDITIONS', must contain 'CONDITIONS' in WHERE clause.

如果query后使用的是双引号,则$CONDITIONS前必须加转义符,防止shell识别为自己的变量。

但是你一定要注意**--query** 不可 与 -- table 同用。 --query是调用符合条件的部分数据。--table是整个表导入进去。

加where 列=条件

sql 复制代码
sqoop import \
--connect jdbc:mysql://192.168.249.130:3306/duoduo_db \
--username root \
--password Mzp_2022! \
--target-dir /user/category3 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query "SELECT * FROM base_category3 WHERE NAME LIKE '%机%'  and \$CONDITIONS;"

或:
sqoop import \
--connect jdbc:mysql://192.168.249.130:3306/duoduo_db \
--username root \
--password Mzp_2022! \
--target-dir /user/category3 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table base_category3 \
--where "id=10"

迁移特定的列

方法1

sql 复制代码
sqoop import \
--connect jdbc:mysql://192.168.249.130:3306/duoduo_db \
--username root \
--password Mzp_2022! \
--target-dir /user/category3 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns id,name \
--table base_category3

-- 方法2

sql 复制代码
sqoop import \
--connect jdbc:mysql://192.168.249.130:3306/duoduo_db \
--username root \
--password Mzp_2022! \
--target-dir /user/category3 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'SELECT id,name FROM base_category3 WHERE id<=100  and $CONDITIONS;'

HDFS迁移到MySQL

在Sqoop中,"导出"概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS)中传输数据,叫做:导出,即使用export关键字。HIVE/HDFS到RDBMS

sqoop export \

--connect jdbc:mysql://192.168.249.130:3306/duoduo_db \

--username root \

--password Mzp_2022! \

--table student \

--num-mappers 1 \

--export-dir /user/hive/warehouse/ping_bank.db/student6 \

--input-fields-terminated-by "\001

一次性同步所有的表到hdfs

冗长版

#!/bin/bash

通过 Shell 脚本,实现「不传参就全量导入 MySQL 的 duoduo_db 所有表到 HDFS」、「传表名就只导入指定单张表」

定义sqoop的绝对路径

sqoop=/bigdata/sqoop-1.4.7.bin__hadoop-2.6.0/bin/sqoop

#定义一个变量t_name,默认值为all表示导入所有的表;
t_name="all"

判断是否传入了表名参数

[[ -n "$1" ]] :这是判断条件,$1 是 Shell 的位置参数 ,代表「执行脚本时传入的第 1 个参数」;-n 代表「判断字符串是否不为空」;整句话意思:判断执行脚本时是否传入了第 1 个参数

if [[ -n "1" \]\]; then t_name=1
fi

#脚本默认导入所有表(t_name不做修改,还是原来的all),如果执行脚本时传了表名参数,就只导入你传入的这个表名(如果你写的是all,那就是all,否则取你输入的那个表名)

====================== 定义核心导入公用函数 ======================

import_data(){
sqoop import \\ --connect jdbc:mysql://192.168.229.136:3306/duoduo_db \\ --username root \\ --password Mzp_2022! \\ --table 1 \
-m 1 \
--target-dir /hive-duoduo-db/$1 \
--delete-target-dir \
--driver com.mysql.jdbc.Driver \
--null-string '\\N' \
--null-non-string '\\N'
}

====================== 定义各表的导入函数 ======================

打印。

#-e 是让 echo 支持颜色和转义字符,必须加;

# \033[32m 是「绿色字体的开始标记」,\033[0m 是「恢复默认字体的标记」;

在控制台用绿色字体打印「正在导入表数据:activity_info」,让你能清晰看到脚本执行到哪一步了。

函数import_data 输入参数activity_info,完成了sqoop数据迁移的行为

shell的函数不同于python,不是这个形式"函数名(参数)",而是"函数名 参数"

import_activity_info(){
echo -e '\033[32m正在导入表数据:activity_info\033[0m'
import_data activity_info
}
import_activity_order(){
echo -e '\033[32m正在导入表数据:activity_order\033[0m'
import_data activity_order
}
import_activity_rule(){
echo -e '\033[32m正在导入表数据:activity_rule\033[0m'
import_data activity_rule
}
import_activity_sku(){
echo -e '\033[32m正在导入表数据:activity_sku\033[0m'
import_data activity_sku
}
import_base_category1(){
echo -e '\033[32m正在导入表数据:base_category1\033[0m'
import_data base_category1
}
import_base_category2(){
echo -e '\033[32m正在导入表数据:base_category2\033[0m'
import_data base_category2
}
import_base_category3(){
echo -e '\033[32m正在导入表数据:base_category3\033[0m'
import_data base_category3
}
import_base_dic(){
echo -e '\033[32m正在导入表数据:base_dic\033[0m'
import_data base_dic
}
import_base_province(){
echo -e '\033[32m正在导入表数据:base_province\033[0m'
import_data base_province
}
import_base_region(){
echo -e '\033[32m正在导入表数据:base_region\033[0m'
import_data base_region
}
import_base_trademark(){
echo -e '\033[32m正在导入表数据:base_trademark\033[0m'
import_data base_trademark
}
import_cart_info(){
echo -e '\033[32m正在导入表数据:cart_info\033[0m'
import_data cart_info
}
import_comment_info(){
echo -e '\033[32m正在导入表数据:comment_info\033[0m'
import_data comment_info
}
import_coupon_info(){
echo -e '\033[32m正在导入表数据:coupon_info\033[0m'
import_data coupon_info
}
import_coupon_use(){
echo -e '\033[32m正在导入表数据:coupon_use\033[0m'
import_data coupon_use
}
import_date_info(){
echo -e '\033[32m正在导入表数据:date_info\033[0m'
import_data date_info
}
import_favor_info(){
echo -e '\033[32m正在导入表数据:favor_info\033[0m'
import_data favor_info
}
import_holiday_info(){
echo -e '\033[32m正在导入表数据:holiday_info\033[0m'
import_data holiday_info
}
import_holiday_year(){
echo -e '\033[32m正在导入表数据:holiday_year\033[0m'
import_data holiday_year
}
import_order_detail(){
echo -e '\033[32m正在导入表数据:order_detail\033[0m'
import_data order_detail
}
import_order_info(){
echo -e '\033[32m正在导入表数据:order_info\033[0m'
import_data order_info
}
import_order_refund_info(){
echo -e '\033[32m正在导入表数据:order_refund_info\033[0m'
import_data order_refund_info
}
import_order_status_log(){
echo -e '\033[32m正在导入表数据:order_status_log\033[0m'
import_data order_status_log
}
import_payment_info(){
echo -e '\033[32m正在导入表数据:payment_info\033[0m'
import_data payment_info
}
import_sku_info(){
echo -e '\033[32m正在导入表数据:sku_info\033[0m'
import_data sku_info
}
import_spu_info(){
echo -e '\033[32m正在导入表数据:spu_info\033[0m'
import_data spu_info
}
import_user_info(){
echo -e '\033[32m正在导入表数据:user_info\033[0m'
import_data user_info
}

====================== 补全所有case分支(原脚本核心缺失部分) ======================

#如果输入的参数不是all,而是一个具体的表名。就执行下面这些具体表名的函数。反之如果输入的参数是all,则会进入到运行所有函数的那个条件判断分支
case $t_name in
"activity_info")
import_activity_info
;;
"activity_order")
import_activity_order
;;
"activity_rule")
import_activity_rule
;;
"activity_sku")
import_activity_sku
;;
"base_category1")
import_base_category1
;;
"base_category2")
import_base_category2
;;
"base_category3")
import_base_category3
;;
"base_dic")
import_base_dic
;;
"base_province")
import_base_province
;;
"base_region")
import_base_region
;;
"base_trademark")
import_base_trademark
;;
"cart_info")
import_cart_info
;;
"comment_info")
import_comment_info
;;
"coupon_info")
import_coupon_info
;;
"coupon_use")
import_coupon_use
;;
"date_info")
import_date_info
;;
"favor_info")
import_favor_info
;;
"holiday_info")
import_holiday_info
;;
"holiday_year")
import_holiday_year
;;
"order_detail")
import_order_detail
;;
"order_info")
import_order_info
;;
"order_refund_info")
import_order_refund_info
;;
"order_status_log")
import_order_status_log
;;
"payment_info")
import_payment_info
;;
"sku_info")
import_sku_info
;;
"spu_info")
import_spu_info
;;
"user_info")
import_user_info
;;
"all")
import_activity_info
import_activity_order
import_activity_rule
import_activity_sku
import_base_category1
import_base_category2
import_base_category3
import_base_dic
import_base_province
import_base_region
import_base_trademark
import_cart_info
import_comment_info
import_coupon_info
import_coupon_use
import_date_info
import_favor_info
import_holiday_info
import_holiday_year
import_order_detail
import_order_info
import_order_refund_info
import_order_status_log
import_payment_info
import_sku_info
import_spu_info
import_user_info
echo -e '\033[31m======= 所有表数据导入完成 =======\033[0m'
;;
*)
echo -e '\033[31m错误:输入的表名不存在,请检查表名是否正确!\033[0m'
exit 1
;;
esac

简化版

#!/bin/bash
sqoop=/bigdata/sqoop-1.4.7.bin__hadoop-2.6.0/bin/sqoop

数据库配置

DB_USER="root"
DB_PASS="Mzp_2022!"
DB_NAME="duoduo_db"
HDFS_DIR="/user/hadoop/data" # 指定HDFS中的存储路径

获取所有表名并逐一导入到HDFS

$(xxx) 是 Shell 的 命令替换语法,作用是:执行括号里的命令,把命令执行后的「输出结果」,作为值赋值给前面的变量。

这是一条 直接在 Linux 终端执行的 MySQL 客户端命令

-s :silent 静默模式,只返回纯文本结果,去掉 mysql 默认的表头、边框等多余格式;

-e :execute 执行,后面双引号里的内容是「要执行的 MySQL 语句」;

TABLES=(mysql -u DB_USER -pDB_PASS DB_NAME -se "SHOW TABLES;")
echo '同步开始。。。'
for TABLE in TABLES do sqoop import \
--connect jdbc:mysql://192.168.10.130:3306/DB_NAME \\ --username DB_USER \
--password DB_PASS \\ --table TABLE \
--target-dir HDFS_DIR/TABLE \
--m 1 \
--delete-target-dir \
--driver com.mysql.jdbc.Driver
done
echo '同步完成。。。'

连接错误

Caused by: java.net.ConnectException: 拒绝连接 (Connection refused)

遇到这种错误,就是连接的ip地址写错了,去检查。

相关推荐
资深web全栈开发2 小时前
pg on delete 策略探讨
数据库·pg
玖日大大2 小时前
Milvus 深度解析:开源向量数据库的技术架构、实践指南与生态生态
数据库·开源·milvus
雪域迷影2 小时前
Node.js中使用node-redis库连接redis服务端并存储数据
数据库·redis·node.js
W001hhh2 小时前
260111
java·数据库
inksci2 小时前
Python 中使用 SQL 连接池
服务器·数据库·python
正在走向自律3 小时前
金仓数据库KingbaseES基础语法详解与实践指南
数据库·国产数据库·ddl·dml·kingbasees·sql语法·电科金仓
alonewolf_993 小时前
MySQL全局优化详解与8.0新特性全面解读
数据库·mysql
ASS-ASH3 小时前
快速处理虚拟机磁盘扩容问题
linux·数据库·vmware·虚拟机·磁盘扩容
爱写bug的野原新之助3 小时前
数据库及navicat工具
数据库·网络爬虫·工具