兄弟们,今天咱们聊个大数据圈的「搬运小能手」——Sqoop!可能有人会问:这玩意儿跟 Flume 啥区别?简单来说:
它的名字咋来的?SQL + Hadoop,直接告诉你核心技能:在关系型数据库(比如 MySQL)和 Hadoop 家族(HDFS、Hive、HBase)之间疯狂倒腾数据!
核心原理:开着 MapReduce 卡车干活
Sqoop 干活的底层逻辑很有意思 —— 它用 MapReduce 来加速数据传输。啥意思呢?就是说它搬运数据的时候,不是一个人吭哧吭哧干,而是喊来一堆「搬运工」(Map 任务)并行干活!不过注意哦,它只能批量处理(批处理),实时搬运它可搞不定~
它能搬啥?往哪搬?
第一步:解压安装包,改名换姓
# 上传安装包后解压到指定目录
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /opt/installs/
# 给它起个简单的名字
mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop
# 或者用另一种方式解压(直接获取一层目录)
mkdir /opt/installs/sqoop && tar -xzvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /opt/installs/sqoop --strip-components 1
第二步:配置环境变量,让系统认识它
# 编辑环境变量文件
vi /etc/profile
# 在最后加上这两行
export SQOOP_HOME=/opt/installs/sqoop
export PATH=$PATH:$SQOOP_HOME/bin
# 让配置生效
source /etc/profile
第三步:处理警告,做个淡定的大佬
安装完执行sqoop version
可能会看到一堆警告:
Warning: 找不到HBase/HCatalog/Accumulo...
别慌!这说明你没装这些组件,不影响基本使用~真正需要注意的是:必须给 Sqoop 配 MySQL 驱动!
第四步:扔驱动包到指定位置
去官网下一个 MySQL 8.0 的驱动包(mysql-connector-java-8.0.xx.jar
),然后:
# 把驱动包丢到Sqoop的lib目录
cp mysql-connector-java-8.0.xx.jar /opt/installs/sqoop/lib/
# 查看MySQL里有哪些数据库
sqoop list-databases \
--connect jdbc:mysql://localhost:3306/ \
--username root \
--password 123456
小技巧:如果报错说找不到commons-lang
包,用find /opt/installs -name commons-lang-*.jar
找到包,丢到 Sqoop 的 lib 目录就搞定~
# 把MySQL的emp表数据导入到HDFS的/emp目录
sqoop import \
--connect jdbc:mysql://localhost:3306/test \
--username root \
--password 123456 \
--table emp \
--target-dir /emp \
--num-mappers 4 # 用4个Map任务并行导入
导入后你需要知道的 3 件事:
part-m-xxxx
开头,这是 MapReduce 的默认格式--num-mappers
默认是 4,可以自己改# 只导入薪资>5000的员工数据
sqoop import \
--connect jdbc:mysql://localhost:3306/test \
--username root \
--password 123456 \
--table emp \
--target-dir /emp_salary \
--where "salary > 5000"
# 把MySQL数据直接导入Hive表
sqoop import \
--connect jdbc:mysql://localhost:3306/test \
--username root \
--password 123456 \
--table emp \
--hive-import \
--hive-table mydb.emp_hive # 指定Hive中的表名
注意:Hive 的数据库需要提前创建,但表不用,Sqoop 会自动生成!如果报错说目录已存在,直接删了就行:hdfs dfs -rm -R /user/root/emp
# 前提:MySQL里先创建好目标表!
create table emp_hdfs (
id int,
name string,
salary double
);
# 从HDFS导出数据到MySQL
sqoop export \
--connect jdbc:mysql://localhost:3306/test \
--username root \
--password 123456 \
--table emp_hdfs \
--export-dir /emp_salary \
--columns id,name,salary # 列名顺序要和表一致
# 前提:MySQL先创建好表,Hive里要有数据!
create table emp_analysis (
dept string,
avg_salary double
);
# 从Hive导出数据到MySQL
sqoop export \
--connect jdbc:mysql://localhost:3306/test \
--username root \
--password 123456 \
--table emp_analysis \
--hcatalog-database mydb \
--hcatalog-table emp_analysis_hive
报错解决:如果出现 JSON 相关错误,试试这三步:
at org.json.JS0NObject,(JS0NObject,java:144)
java-json.jar
包sqoop-env.sh
里加export HCAT_HOME=/opt/installs/hive/hcatalog
hive-exec-3.1.2.jar
包参数名 | 作用描述 | 例子 |
---|---|---|
--connect |
指定数据库连接地址 | --connect jdbc:mysql://... |
--username |
数据库用户名 | --username root |
--password |
数据库密码(建议用-P 从控制台输) |
--password 123456 |
--table |
要导入 / 导出的表名 | --table emp |
--num-mappers |
并行 Map 任务数(默认 4) | --num-mappers 8 |
--where |
导入条件 | --where "salary>5000" |
--hive-import |
导入到 Hive | 必加参数 |
--export-dir |
导出数据的 HDFS 目录 | --export-dir /emp_salary |
Sqoop 这玩意儿,说白了就是个「数据搬运工」,但人家是「持证上岗」的 —— 拿着 MapReduce 的「驾照」,开着并行处理的「卡车」,在数据库和大数据平台之间来回折腾~
记住它的核心场景:
遇到问题别慌,先看报错信息,缺啥包补啥包,配置错了改配置,大佬都是这么过来的!
# 最后送大家一句口诀:
Sqoop搬家很简单,连接参数先写全
导入导出分清楚,驱动包别忘扔里边
遇到报错别着急,看日志改配置
大数据搬运哪家强?Sqoop在手不用慌!