Sqoop学习,2024年最新高级java工程师面试宝典下载安装

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

sqoop重要的几个关键词

  • import: 从关系型数据库到hadoop

  • export: 从hadoop到关系型数据库

Sqoop的安装

==========================================================================

注意:在安装sqoop之前要配置好本机的Java环境和Hadoop环境

先把spoop的安装包sqoop-1.4.7.bin__.hadoop-2.6.0.tar . gz拷贝在系统目录下的/root/soft下面

解压配置环境变量

#解压tar-gz包

[root@tianqinglong01 local] tar -zxvf /root/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /usr/local/

#把sqoop的安装路径修改为sqoop,方便以后配置和调用

[root@tianqinglong01 local]# mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop

[root@tianqinglong01 sqoop]# vi /etc/profile

#追加内容如下:

export SQOOP_HOME=/usr/local/sqoop

export PATH= P A T H : PATH: PATH:SQOOP_HOME/bin

:wq

[root@tianqinglong01 sqoop]#source /etc/profile/

新建配置文件

[root@tianqinglong01 sqoop]# mv ./conf/sqoop-env-template.sh ./conf/sqoop-env.sh

修改配置文件

配置文件:

[root@tianqinglong01 sqoop]# vi ./conf/sqoop-env.sh

按照本系统实际安装的Hadoop系列目录配置好下面的路径:

export HADOOP_COMMON_HOME=/usr/local/hadoop

export HADOOP_MAPRED_HOME=/usr/local/hadoop

export HIVE_HOME=/usr/local/hive

export ZOOCFGDIR=/usr/local/zookeeper

拷贝mysql驱动

因为我们现在通过JDBC让Mysql和HDFS等进行数据的导入导出,所以我们先必须把JDBC的驱动包拷贝到sqoop/lib路径下,如下

[root@tianqinglong01 softwares]# cp /root/mysql-connector-java-5.1.18.jar $SQOOP_HOME/lib

验证安装

#查看sqoop的版本

[root@tianqinglong01 sqoop]# sqoop version

Import的控制参数

=============================================================================

连接数据库

[root@tianqinglong01 scpoop]# sqoop import --connect jdbc:mysql://database.example.com/employees

指定连接的服务地址是database.examployee.com ,要连接的数据库是employees

在这里插入图片描述

sqoop导入案例 mysql到hdfs

======================================================================================

Sqoop运行的时候不需要启动后台进程,直接执行sqoop命令加参数即可.简单举例如下:

通过参数用下面查看数据库

[root@tianqinglong01 scpoop]# sqoop list-databases --connect jdbc:mysql://tianqinglong03:3306 --username root --password 123456;

指定表导入

数据准备

在这里插入图片描述

sqoop的典型导入都是把关系数据库中的表导入到HDFS中,使用--table参数可以指定具体的表导入到hdfs,譬如用--table emp, 默认情况下是全部字段导入如下:

[root@tianqinglong01 sqoop]# bin/sqoop import --connect jdbc:mysql://tianqinglong03:3306/qfdb \

–username root --password 123456 \

–table emp \

–target-dir hdfs://tianqinglong01:8020/sqoop/emp \

–delete-target-dir

可以快速使用hdfs的命令查询结果

[root@tianqinglong01 sqoop]# hdfs dfs -cat /sqoop/emp/*

指定列导入

如果想导入某几列,可以使用--columns,如下:

[root@tianqinglong01 sqoop]# bin/sqoop import --connect jdbc:mysql://tianqinglong03:3306/qfdb \

–username root --password 123456 \

–table emp \

–columns ‘empno,mgr’ \

–target-dir hdfs://tianqinglong01:8020/sqoop/emp \

–delete-target-dir

可以快速使用hdfs的命令查询结果

[root@tianqinglong01 sqoop]# hdfs dfs -cat /sqoop/emp/*

指定条件导入

在导入表的时候,也可以通过指定where条件来导入,具体参数使用--where ,譬如要导入员工号大于7800的记录,可以用下面参数:

[root@tianqinglong01 sqoop]# bin/sqoop import --connect jdbc:mysql://tianqinglong03:3306/qfdb \

–username root --password 123456 \

–table emp \

–columns ‘empno,mgr’ \

–where ‘empno>7800’ \

–target-dir hdfs://tianqinglong01:8020/sqoop/emp \

–delete-target-dir

命令查询结果

[root@tianqinglong01 sqoop]# hdfs dfs -cat /sqoop/emp/*

指定sql导入

上面的可以通过表字段,条件进行导入但是还不够灵活,其实soop还可以通过自定义的sql来进行导入可以通过--query参数来进行导入这样就最大化的用到了Sq的灵活性.如下:

[root@tianqinglong01 sqoop]# bin/sqoop import --connect jdbc:mysql://tianqinglong03:3306/qfdb \

–username root --password 123456 \

–query ‘select empno,mgr,job from emp where empno>7800 and $CONDITIONS’ \

–target-dir hdfs://tianqinglong01:8020/sqoop/emp \

–delete-target-dir \

–spilt-by empno \

-m 1

注意:在通过--query来导入数据时,必须要指定--target-dir

如果你想通过并行的方式导入结果,每个map task需要执行sq|查询语句的副本,结果会根据sqoop推测的边界条件分区。query必须包含$CONDITIONS。这样每个scoop程序都会被替换为一个独立的条件。同时你必须指定--split-by .分区

-m 1是指定通过一个Mapper来执行流程

命令查询结果

[root@tianqinglong01 sqoop]# hdfs dfs -cat /sqoop/emp/*

单引号双引号区别

在导入数据时,默认的字符引号是单引号,这样sqoop在解析的时候就按照字面量来解析,不会做转移:例如:;

–query ‘select empno,mgr,job from emp WHERE empno>7800 and $CONDITIONS’

如果使用了双引号,那么Sqoop在解析的时候会做转义的解析,这时候就必须要加转义字符:如下;

–query “select empno,mgr,job from emp WHERE empno>7800 and $CONDITIONS” \

mysql缺主键问题

1、如果mysql的表没有主键,将会报错:

19/12/0210:39:0 ERROR tool . ImportTool: Import

failed: No primary key could be found for table u1. Please specify one with

– split- by or perform a sequential import with ‘-m 1’

解决方案:

通过–split-by 来指定要分片的列

代码如下:

[root@tianqinglong01 sqoop]# bin/sqoop import --connect jdbc:mysql://localhost:3306/ qfdb \

–username root --password 123123、

–query ‘select empno,mgr,job from emp WHERE empno>7800 and $CONDITIONS’ \

–target-dir hdfs://qianfeng01:9000/sqoop/emp \

–delete-target-dir \

–split-by empno \

-m 1

Mysql到hive

============================================================================

说明

​ Sqoop的导入工具的主要功能是将数据上传到HDFS中的文件中。如果您有一个与HDFS集群相关联的Hive,Sqoop还可以通过生成和执行CREATETABLE 语句来定义Hive中的数据,从而将数据导入到Hive中。将数据导入到Hive中就像在Sqoop命令行中添加--hive-import选项。

​ 如果Hive表已经存在,则可以指定--hive-overwrite选项,以指示必须替换单元中的现有表。在将数据导入HDFS或省略此步骤之后,Sqoop将生成一个Hive脚本,其中包含使用Hive的类型定义列的CREATE表操作,并生成LOAD Data INPATH语句将数据文件移动到Hive的仓库目录中。

在导入Hive之前先要配置Hadoop的Classpath才可以,否则会报类找不到错误,在/etc/profile未尾添加如下配置:

export HADOOP_CLASSPATH= H A D O O P C C L A S S P A T H : HADOOP_CCLASSPATH: HADOOPCCLASSPATH:HIVE_HOME/lib/*

刷新配置

source /etc/profile

参数说明

在这里插入图片描述

实际导入案例

提示:为了看到演示效果,可以先在Hive删除emp表

[root@tianqinglong01 sqoop]# bin/sqoop import --connect jdbc:mysql://tianqinglong03:3306/ qfdb \

–username root --password 123456 \

–table emp \

–hive-import \

[–hive-overwrite ]

[–fields-terminated-by ‘,’] #注意表也要改分隔符

[–hive-table ‘qfdb.emp1’]

-m 1

在hive中查看表

hive> show tables;

#结果如下

OK

emp

可以在hive中查看数据是否导入

select * from emp;

结果如下

7369 SMITH CLERK 7902 1980-12-17 800.0 NULL 20

7499 ALLEN SALESgAN 7698 1981-02-20 1600.0 300.0 30

7521 WARD SALESdw 7698 1981-02-22 1250.0 500.030

7566 JONES MAAGER 7839 1981-04-02 2975.0 NULL20

7654 MARTIN SALESAN 7698 1981-09-28 1250.0 1400.0 30

7698 BLAKE MANAGER 7839 1981-e5-e1 2850.0 NULL 30

7782 CLARK MANAGER 7839 1981-06-09 2450.0 NULL 10

7783 SC0T ANALYST 7566 1987-04-19 3000,0 MULL 20

7839 KING PRESIDENT NULL 1981-11-17 5000.0 NULL10

7844 TURNER SALESMAN 7698 1981-09-08 1500.0 0.0 30

7876 ADAMS CLERK 7788 1987-05-23 1100.0 NULL 20

7900 JAMES CLERK 7698 1981-12-03 950.0 NULL 30

7902 FORDA NALYST 7566 1981-12-03 3000.0 NULL 20

7934 MILLER CLERK 7782 1982-01-23 1300.0 NULL 10

导入数据库没有主键的问题

==============================================================================

sqoop-import

案例1

表没有主键,需要指定map task的个数为1个才能执行

sqoop导入原理

​ Sqoop默认是并行的从数据库源导入数据。您可以使用-m或–num-mappers参数指定用于执行导入的map任务(并行进程)的数量。每个参数都取一个整数值,该整数值对应于要使用的并行度。默认情况下,使用四个任务。一些数据库可以通过将这个值增加到8或16来改善性能。

​ 默认情况下,Sopop将标识表中的主键id列用作拆分列。从数据库中检索分割列的高值和低值,map任务操作整个范围的大小均匀的组件。譬如ID的范围是0-800.那么Sqoop默认运行4个进程通过执行《SELECT NIN(id), vX(id) FROM emp找出id的范围,然后把4个任务的id设置范围是(0-200)M200-400)(400-60)1600-800)

但是当一个表没有主键时,上面的切分就无法进行sqoop导入时就会出镊,这时候可以通过-m把mapper的数量设为1,只有也Mapper在运行,这时候就不需要切分也可以遵免主键不存在时候报错的问题.

#错误信息

ERROR tool.ImportTool: Import failed: Mo primary key could be found for table emp.

导入代码

[root@tianqinglong01 sqoop]# bin/sqoop import --connect jdbc:mysql://tianqinglong03:3306/qfdb \

–username root --password 123456 \

–table emp -m 1

DBMS-HDFS

案例2

表没有主键,使用split-by指定split的字段

[root@tianqinglong01 sqoop]# bin/sqoop import --connect jdbc:mysql://tianqinglong03:3306/qfdb \

–username root --password 123456 \

–table emp \

–split-by empno \

–delete-target-dir \

–target-dir hdfs://tianqinglong01:9000/sqoop/emp

– 出错

caused by:java.sql.SQL Exception: nu11,message from server:"Host

‘tianqinglong01’ is not allowed to connect to this MySQL server"

解决方案

先连接mysql

[root@tianqinglong01 sqoop]# mysql -u root -p

使用下面的语句: . :所有库下的所有表 % : 任何IP地址或主机都可以连接

mysql> GRANT ALL PRIVILEGES ON . TO ‘root’@‘%’ IDENTIFIED BY ‘mysql’ WITH GRANT OPTION;

FLUSH PRIVILEGES;

grant all privileges on .to ‘root’@‘localhost’ identified by ‘mysql’ with grant option;

FLUSH PRIVILEGES;

Sqoop导出

=========================================================================

在sqoop中,使用export进行导出,指的是从hdfs导出数据到MySQL

1、构建mysql的表

create table ‘u2’(

id int(11) default null,

age int(11) default ‘0’

)engine=innoDB default charset=utf8;

create table ‘u3’(

id int(11) default null,

name varchar(20) default null,

age int(11) default ‘0’

)engine=innoDB default charset=utf8;

先导入hdfs才能导出嘛

2.从HDFS导出到mysql

[root@tianqinglong01 sqoop]# sqoop export --connect jdbc:mysql://tianqinglong01:3306/qfdb \

–username root \

–password root \

–table u2 \

–driver com.mysql.jdbc.Driver \

–export-dir ‘/sqoop/emp1/*’ \

-m 1

方法二

先重新导入数据:

[root@tianqinglong01 sqoop]# sqoop import --connect jdbc:mysql://tianqinglong01:3306/qfdb \

–username root \

–password root \

–query ‘select id,name,age from stu where id>6 and $CONDITIONS’ \

–driver com.mysql.jdbc.Driver \

–target-dir ‘/sqoop/emp1/*’ \

–split-by id \

-m 1 \

–field-terminated-by ‘\t’ \

最后

金三银四到了,送上一个小福利!

image.png

image.png

专题+大厂.jpg

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
\

–table u2 \

–driver com.mysql.jdbc.Driver \

–export-dir ‘/sqoop/emp1/*’ \

-m 1

方法二

先重新导入数据:

[root@tianqinglong01 sqoop]# sqoop import --connect jdbc:mysql://tianqinglong01:3306/qfdb \

–username root \

–password root \

–query ‘select id,name,age from stu where id>6 and $CONDITIONS’ \

–driver com.mysql.jdbc.Driver \

–target-dir ‘/sqoop/emp1/*’ \

–split-by id \

-m 1 \

–field-terminated-by ‘\t’ \

最后

金三银四到了,送上一个小福利!

[外链图片转存中…(img-s3NhnuBq-1713428116120)]

[外链图片转存中…(img-4v5RFT92-1713428116121)]

[外链图片转存中…(img-3GyUw3Jz-1713428116121)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-DlpJdfmy-1713428116121)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值