前言
sqoop就是sql-to-hadoop,说通俗点,我们用到最多的就是mysql与hive之间的数据传递,而hive是依靠hadoop运行的,所以要再mysql和hive之间互相传递数据,就必须要安装sqoop
一、准备
我们要准备sqoop的安装包,我们的hadoop版本是3.1.3,匹配的sqoop版本是1.4.6
选择的是 ' sqoop-1.4.6.bin_hadoop-0.23.tar.gz '
网站地址:sqoop下载
二、安装部署
1. 上传到/opt/software目录下
#使用XFTP或者带上传文件功能的shell工具
2. 解压sqoop压缩包到/opt/module目录下
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /opt/module/
3. 改名
#解压完后名字太长,所以方便后续配置,我们改个名字
cd /opt/module
mv sqoop-1.4.7.bin__hadoop-2.6.0/ sqoop-1.4.7
4. 添加环境变量
#环境变量是告诉系统你sqoop的位置的,证明你有这个东西 就可以使用了
#进入
vi /etc/profile
# 添加
#SQOOP_HOME
export SQOOP_HOME=/opt/module/sqoop-1.4.7
export PATH=$PATH:$SQOOP_HOME/bin
#ESC :wq保存退出
#刷新环境 使环境生效
source /etc/profile
5. 修改sqoop的配置文件
#进入
cd $SQOOP_HOME/conf
#复制 Sqoop 环境变量模板文件
##复制可以保留源文件,相当于保存备份
###去掉template是因为有template的文件系统是不看的,等于白配置
cp sqoop-env-template.sh sqoop-env.sh
#修改
vim sqoop-env.sh
#添加
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
#export HBASE_HOME=$HBASE_HOME
export HIVE_HOME=$HIVE_HOME
export ZOOCFGDIR=$ZOOKEEPER_HOME
#添加的内容取决于你自己安装了什么
##我这个就是没有安装HBase我就没写
##ZOOKEEPER_HOME这个我环境文件里写的是ZK_HOME,一开始以为要用到,后来发现用不到就没管他
补充一点:
拿我的这个举例,我没有配置HBase,所以在后续再用sqoop跑程序的时候会报警告,但是不用管他
6. 拷贝mysql驱动
#为什么要拷贝mysql驱动 前言里解释过了
cp /opt/software/mysql-connector-java-5.1.37-bin.jar $SQOOP_HOME/lib
#7. 拷贝 Hive 文件
#主要是跟hive做交互
cp hive-3.1.2/lib/hive-common-3.1.2.jar sqoop-1.4.7/lib/
#8. 检验
sqoop version
三、项目验证:mysql与hive做交互
#要求:把mysql中的表全量传递到hive中
##全量:一字不差的传递过去
sqoop import \
--connect jdbc:mysql://10.2.40.101:3306/smart_school?characterEncoding=UTF-8 \
--username root \
--password 123456 \
--table user_activity01_copy1 \
--direct \
--delete-target-dir \
--fields-terminated-by '\t' \
--lines-terminated-by '\n' \
--hive-import \
--hive-database bigdata_platform \
--create-hive-table \
--hive-table 1_null_1729296718697 \
--num-mappers 1 \
--verbose
SQL解释:
10.2.40.101 是我集群节点ip
smart_school是我mysql的数据库名字
user_activity01_copy1是我做测试用的表名
bigdata_platform是我hive里的数据库名字
因为我加了--create-hive-table这个配置项,所以我不用在hive里手动创建表
1_null_1729296718697是我的hive数据库里表的名字
参数解释:
sqoop import
:这是 Sqoop 的导入命令,用于从关系型数据库(如 MySQL)导入数据到 Hadoop(Hive)。
--connect jdbc:mysql://10.2.40.101:3306/smart_school?
characterEncoding=UTF-8 :指定连接到 MySQL 数据库的 JDBC URL。这里连接的是10.2.40.101
上的smart_school
数据库,端口为3306
,并指定字符编码为UTF-8
。
--username root
:指定连接数据库时使用的用户名,这里是root
。
--password 123456
:指定连接数据库时使用的密码,这里是123456
。
--table user_activity01_copy1
:指定要从 MySQL 数据库中导入的表名,这里是user_activity01_copy1
。
--direct
:使用直接模式进行数据导入。直接模式可以提高导入速度,因为它使用数据库的原生批量加载功能。
--delete-target-dir
:如果目标目录已经存在,则在导入前删除该目录。这确保每次导入时都是全新的数据集。
--fields-terminated-by '\t'
:指定字段之间的分隔符。这里使用制表符\t
作为字段分隔符。
--lines-terminated-by '\n'
:指定行之间的分隔符。这里使用换行符\n
作为行分隔符。
--hive-import
:启用 Hive 导入。将导入的数据保存到 Hive 中。
--hive-database bigdata_platform
:指定要将数据导入的 Hive 数据库名称,这里是bigdata_platform
。
--create-hive-table
:创建 Hive 表。如果表已经存在,将会被覆盖。
--hive-table 1_null_1729296718697
:指定在 Hive 中创建的表名,这里是1_null_1729296718697
。
--num-mappers 1
:指定用于执行导入任务的 Map 任务的数量。这里是1
,表示只有一个 Map 任务。
--verbose
这个参数你也可以不加,这个是我当时有报错解决不了问题,为了获取更详细的日志信息加
在hive节点登录hive能查到
在HDFS上查看10.2.40.102::50070
地址:/user/hive/warehouse/bigdata_platform.db
#因为我搭建的是hadoopha,所以节点二的namenode也可能是active
代码截图:
我在执行这条命令的时候遇到过报错
报错1:java.io.IOException: Cannot run program "mysqldump": error=2, 没有那个文件或目录
#无法找到
mysqldump
工具:
- 原因 :
mysqldump
未安装。mysqldump
不在 PATH 中。- 当前用户没有执行
mysqldump
的权限。- 解决方法 :
- 安装
mysqldump
:例如,在 Debian 系统上使用sapt-get install mysql-client
。- 将
mysqldump
的路径添加到PATH
环境变量中。- 确保当前用户有执行
mysqldump
的权限。- 如果使用
--direct
选项,即使mysqldump
失败,直接模式仍然可以正常工作。我后续用不到mysqldump,所以加了一个--direct字段
**报错2:**org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create directory /tmp/hadoop-yarn/staging/root/.staging/job_1729300755474_0001. Name node is in safe mode.
#NameNode 处于安全模式:
- 原因:NameNode 处于安全模式,阻止了新的目录创建。
- 解决方法 :
- 等待几秒钟让 NameNode 自动退出安全模式。
- 手动退出安全模式:
hdfs dfsadmin -safemode leave
。- 确认 Hadoop 配置正确,并且所有节点都正常运行。
- 重新运行 Sqoop 命令。
我的解决办法就是直接关闭就行,这个原因的造成就是,短时间内多次报错,浪费资源过头了
过程截图:
...
...
...
....
....
....
...
...
...
...
...
...
...
...
...