本关任务:利用 Sqoop 工具将 MySQL 中的数据导入到 HDFS 中来。 相关知识 为了完成本关任务,你需要掌握: 1、数据库( MySQL )建表。 2、Mysql 数据导入至 HDFS 中。 数据库( MySQL )建表 用命令进入 MySQL 客户端。 mysql -uroot -p123123 -h127.0.0.1 创建数据库hdfsdb(格式默认为utf8),并在数据库内建立表student,其表结构如下: 名 类 状态 stu_no int 主键 stu_name varchar(20) 学生姓名 stu_age int 学生年龄 在表内插入数据。 stu_no stu_name stu_age 202001 zhangsan 18 202002 lisi 19 202003 wangwu 20 检查是否成功。 MySQL数据导入至HDFS中 1、简单导入。 sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --table student 这里没有指定 HDFS 的目录 默认会将数据存到系统当前登录用户下 以表名称命名的文件夹下。 系统默认为逗号隔开,如下图: 注意:如果数据库没有设置主键,语法需要加上--split by指定一个列去分割或用-m 1指定一个 Map 任务。 2、指定 HDFS 目录/user/root/hdfsdb导入,指定一个 MapReduce 任务。 sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --usernameroot --password 123123 --table student --target-dir /user/root/hdfsdb -m 1 --target-dir:指定 HDFS 目录。 -m 1:指定一个 MapReduce 任务。 3、指定查询学生的学号与学生姓名存入到/user/root/hdfsdb2中,指定一个MapReduce 任务,并以|分隔。 sqoop import --connect jdbc:mysql://127.0.0.1:3306/hdfsdb --username root --password 123123 --query 'select stu_no, stu_name from student where $CONDITIONS' --target-dir /user/root/hdfsdb2 --fields-terminated-by '|' -m 1 --query:通过用 sql 语句来将数据导入,where $CONDITIONS是query中固定语法,不可删去。 --fields-terminated-by:数据通过什么来隔开。 编程要求 根据上述,将 MySQL 数据库hdfsdb中的表数据导入至HDFS中,要求如下: 指定 HDFS 目录/user/root/hdfsdb3。 查询学生姓名与年龄。 指定一个 Mapreduce 任务。 存储以-来分割。 测试说明 点击测评,当你的结果与预期输出一致时,即为通过。 zhangsan-18 lisi-19 wangwu-20 开始你的任务吧,祝你成功!
时间: 2025-07-15 15:30:35 浏览: 14
<think>好的,我现在需要帮助用户了解如何使用Sqoop将MySQL中的数据导入到HDFS,并且满足特定的配置要求。首先,我得回顾一下Sqoop的基本用法和相关参数。
用户的需求是将MySQL数据库hdfsdb中的student表导入到HDFS的指定目录/user/root/hdfsdb3,并且只选择stu_name和stu_age两个字段,使用一个Map任务,字段分隔符设为“-”。我需要确保这些参数都正确应用。
首先,Sqoop的import命令基本结构是sqoop import后面跟各种参数。根据引用[1]和[2],连接MySQL需要--connect参数,格式是jdbc:mysql://主机名:端口/数据库名。这里的主机名可能是master或者hadoop01之类的,但用户没有具体说明,可能需要保持原样或者用户需要替换成实际的主机名。不过用户提供的例子中,比如引用[1]里的例子是master:3306,引用[3]是hadoop1:3306,所以可能需要用户根据实际环境调整。不过问题中没有提到主机名,可能默认使用localhost或者需要用户自行填写。但这里用户的问题描述里没有给出具体的主机,所以可能在命令中需要用户自己替换,但可能示例中使用的是master,比如引用[1]中的例子。
接下来,用户需要指定数据库hdfsdb,所以连接字符串应该是jdbc:mysql://master:3306/hdfsdb,假设主机是master,端口默认3306。然后,用户名和密码需要用--username和--password指定,这里用户可能需要替换成自己的数据库凭据。
然后,--table student指定要导入的表。接下来,用户需要选择特定的列,即stu_name和stu_age,这需要使用--columns参数,并列出这两个字段,用逗号分隔,注意不要有空格,或者用引号括起来,如--columns "stu_name,stu_age"。
目标目录是/user/root/hdfsdb3,使用--target-dir参数指定。map任务数设置为1,即-m 1。字段分隔符用--fields-terminated-by '-'来指定。
现在需要检查这些参数是否正确,是否存在冲突。例如,当指定-m 1时,不需要--split-by参数,因为split-by用于多个map任务时指定分割的列,而单个map任务不需要分割。因此,在命令中可以省略--split-by。
然后,参考引用[1]中的示例,可以看到类似的参数结构,比如--connect、--table、--m、--target-dir、--fields-terminated-by等。同时,引用[4]的例子中使用了--columns参数来选择特定列,所以这里也应该包括。
还需要注意,Sqoop在导入时会自动生成Java类,但如果只是导入到HDFS而不涉及Hive,不需要处理Hive相关的参数,如引用[3]提到的--hive-import等参数这里不需要。
另外,关于密码的输入方式,用户可以使用-P参数在命令行提示输入,或者使用--password直接输入密码,但这样会在历史记录中留下痕迹,不太安全。或者如引用[1]中的例子,直接在命令中写--password 123456,但实际中可能需要用-P来交互输入。
综合以上信息,正确的Sqoop命令应该包含以下参数:
sqoop import \
--connect jdbc:mysql://master:3306/hdfsdb \
--username root \
--password 123456 \
--table student \
--columns "stu_name,stu_age" \
--target-dir /user/root/hdfsdb3 \
--fields-terminated-by '-' \
-m 1
需要验证各参数是否正确,尤其是字段名是否与数据库中的一致,目录是否存在,是否有写入权限等。此外,确保Sqoop的环境配置正确,包括MySQL的JDBC驱动是否在Sqoop的lib目录下。
用户可能遇到的问题包括:连接数据库失败(主机名、端口、权限问题),字段名错误导致Sqoop无法找到列,目标目录已存在需要删除或使用--delete-target-dir参数覆盖等。例如,引用[3]中提到如果目标路径已存在可能需要先删除,但用户的问题中没有提到是否需要覆盖,所以可能需要在命令中添加--delete-target-dir来避免错误。
但根据问题描述,用户没有提到覆盖现有目录,所以可能不需要添加。不过在实际操作中,如果目录已存在,Sqoop会报错,所以可能需要用户手动删除或添加该参数。但根据用户给出的示例,如引用[1]中的命令没有使用该参数,所以可能暂时不包含,但需要提醒用户注意。
综上,最终的Sqoop命令应该包括所有必需的参数,正确指向数据库、表、列、目标目录,并指定分隔符和map任务数。同时,需要提示用户替换实际的主机名、用户名、密码,并处理可能存在的目录冲突问题。</think>根据引用[1][2][3]的配置方法,操作步骤如下:
### 步骤说明
1. **基本连接配置**:
```bash
sqoop import \
--connect jdbc:mysql://master:3306/hdfsdb \
--username root \
--password 123456 \
```
* `--connect`指定MySQL连接地址[^1]
* 用户名密码需与实际数据库匹配
2. **字段筛选与格式定义**:
```bash
--table student \
--columns "stu_name,stu_age" \
--fields-terminated-by '-' \
```
* 通过`--columns`过滤需要的字段[^4]
* `--fields-terminated-by`定义字段分隔符[^1]
3. **输出路径与任务配置**:
```bash
--target-dir /user/root/hdfsdb3 \
-m 1
```
* `--target-dir`指定HDFS存储路径
* `-m 1`设置单MapReduce任务[^2]
### 完整命令
```bash
阅读全文
相关推荐



















