一:Sqoop组件安装与配置
1.1:实验环境
- 服务器集群 - 3 个以上节点,节点间网络互通,各节点最低配置:双核 CPU、8GB 内存、100G硬盘
- 运行环境 - CentOS 7.4
1.2:下载和解压Sqoop
Sqoop相关发行版本可以通过官网 https://mirror-hk.koddos.net/apache/sqoop/来获取,
安装 Sqoop 组件需要与 Hadoop 环境适配。使用 root 用户在 Master 节点上进行部署,将 /opt/software/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz 压缩包解压到/usr/local/src 目录下。[root@master ~]# tar -zxvf /opt/software/sqoop-1.4.7.bin__hadoop2.6.0.tar.gz -C /usr/local/src
将解压后生成的 sqoop-1.4.7.bin__hadoop-2.6.0 文件夹更名为 sqoop。[root@master ~]# cd /usr/local/src/ [root@master src]#mv ./sqoop-1.4.7.bin__hadoop-2.6.0 sqoop
1.3:配置Sqoop环境
1.3.1:创建 Sqoop 的配置文件 sqoop-env.sh。
复制 sqoop-env-template.sh 模板,并将模板重命名为 sqoop-env.sh。[root@master ~]# cd /usr/local/src/sqoop/conf/ [root@master conf]# cp sqoop-env-template.sh sqoop-env.sh
1.3.2:修改 sqoop-env.sh 文件,添加 Hdoop、Hbase、Hive 等组件的安装路径。
注意,下面各组件的安装路径需要与实际环境中的安装路径保持一致。[root@master conf]# vi sqoop-env.sh export HADOOP_COMMON_HOME=/usr/local/src/hadoop export HADOOP_MAPRED_HOME=/usr/local/src/hadoop export HBASE_HOME=/usr/local/src/hbase export HIVE_HOME=/usr/local/src/hive
1.3.3:配置 Linux 系统环境变量,添加 Sqoop 组件的路径。
[root@master conf]# vi /etc/profile #在文件末尾添加 # set sqoop environment export SQOOP_HOME=/usr/local/src/sqoop export PATH=$PATH:$SQOOP_HOME/bin export CLASSPATH=$CLASSPATH:$SQOOP_HOME/lib
1.3.4:连接数据库
为了使 Sqoop 能够连接 MySQL 数据库,需要将/opt/software/mysql-connector-java-5.1.46.jar 文件放入 sqoop 的 lib 目录中。该 jar 文件的版本需要与MySQL 数据库的版本相对应,否则 Sqoop 导入数据时会报错。(mysql-connector-java-5.1.46.jar 对应的是 MySQL 5.7 版本)若该目录没有 jar 包,则使用第 6 章导入 home 目录的 jar 包[root@master ~]# cp /opt/software/mysql-connector-java-5.1.46.jar /usr/local/src/sqoop/lib/ ##1.4:启动Sqoop ###1.4.1:执行 Sqoop 前需要先启动 Hadoop 集群。 在 master 节点切换到 hadoop 用户执行 start-all.sh 命令启动 Hadoop 集群。 [root@master ~]# su - hadoop [hadoop@master ~]$ source /etc/profile [hadoop@master ~]$ start-all.sh ###1.4.2:检查 Hadoop 集群的运行状态。 [hadoop@master ~]$ jps 1457 NameNode 1795 ResourceManager 2060 Jps 1646 SecondaryNameNode ###1.4.3:测试 Sqoop 是否能够正常连接 MySQL 数据库。 # Sqoop 连接 MySQL 数据库 P 大写 密码 Password123$ [hadoop@master ~]$ sqoop list-databases --connect jdbc:mysql://127.0.0.1:3306/ --username root -P Warning: /home/hadoop/sqoop/../hcatalog does not exist! HCatalog jobs will fail. Please set $HCAT_HOME to the root of your HCatalog installation. Warning: /home/hadoop/sqoop/../accumulo does not exist! Accumulo imports will fail. Please set $ACCUMULO_HOME to the root of your Accumulo installation. Warning: /home/hadoop/sqoop/../zookeeper does not exist! Accumulo imports will fail. Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation. 19/04/22 18:54:10 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7 Enter password: # 此处需要输入 mysql 数据库的密码 19/04/22 18:54:14 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset. information_schema hive mysql performance_schema sys
能 够 查 看 到 MySQL 数 据 库 中 information_schema 、 hive 、 mysql 、performance_schema、sys 等数据库,说明 Sqoop 可以正常连接 MySQL。1.4.4:连接hive
为了使 Sqoop 能够连接 Hive,需要将 hive组件/usr/local/src/hive/lib 目录下的hive-common-2.0.0.jar 也放入 Sqoop 安装路径的 lib 目录中。[hadoop@master ~] cp /usr/local/src/hive/lib/hive-common-2.0.0.jar /usr/local/src/sqoop/lib/
1.5:Sqoop模板命令
1.5.1:创建MySql数据库和数据表。
登录 MySQL 数据库 [hadoop@master ~]$ mysql -uroot -p Enter password: # 创建 sample 库 mysqlcreate database sample; Query OK, 1 row affected (0.00 sec) # 使用 sample 库 mysqluse sample; Database changed mysqlcreate table student(number char(9) primary key, name varchar(10)); Query OK, 0 rows affected (0.01 sec) # 创建 student 表,该数据表有 number 学号和 name 姓名两个字段 # 向 student 表插入几条数据 mysqlinsert into student values('01','zhangsan'); Query OK, 1 row affected (0.05 sec) mysqlinsert into student values('02','lisi'); Query OK, 1 row affected (0.01 sec) mysqlinsert into student values('03','wangwu'); Query OK, 1 row affected (0.00 sec) mysql> mysql> # 查询 student 表的数据 mysqlselect * from student; +--------+----------+ | number | name | +--------+----------+ | 01 | zhangsan | | 02 | lisi | | 03 | wangwu | +--------+----------+ 3 rows in set (0.00 sec) mysql> mysqlexit
1.5.2:在 Hive 中创建 sample 数据库和 student 数据表。
[hadoop@master ~]$ hive # 启动 hive 命令行 Logging initialized using configuration in jar:file:/usr/local/src/hive/lib/hive-common-1.1.0.jar!/hivelog4j.properties SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/usr/hadoop/share/hadoop/common/lib/slf4j-log4j12- 1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/usr/local/src/hive/lib/hivejdbc-1.1.0- standalone.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] hivecreate database sample; # 创建 sample 库 OK Time taken: 0.679 seconds hiveshow databases; # 查询所有数据库 OK default Time taken: 0.178 seconds, Fetched: 2 row(s) hiveuse sample; # 使用 sample 库 OK hivecreate table student(number STRING, name STRING) row format delimited fields terminated by "|" stored as textfile; # 创建 student 表 OK hiveexit; 退出 hive 命令行
1.5.3:从 MySQL 导出数据,导入 Hive。
需要说明该命令的以下几个参数:
1)--connect:MySQL 数据库连接 URL。
2)--username 和--password:MySQL 数据库的用户名和密码。
3)--table:导出的数据表名。
4)--fields-terminated-by:Hive 中字段分隔符。
5)--delete-target-dir:删除导出目的目录。
6)--num-mappers:Hadoop 执行 Sqoop 导入导出启动的 map 任务数。
7)--hive-import --hive-database:导出到 Hive 的数据库名。
8)--hive-table:导出到 Hive 的表名。
[hadoop@master ~]$ sqoop import --connect jdbc:mysql://master:3306/sample --username root --password Password123$ --table student --fields-terminated-by '|' --delete-target-dir - -num-mappers 1 --hive-import --hive-database sample --hive-table student 删除 MySQL 数据, student 表中 number 为主键,添加信息导致主键重复,报错,所以删除表数据 [hadoop@master ~]$mysql -u root -p #密码 Password123$ mysql>use sample; mysql>delete from student; mysql>exit;
1.5.4:从 Hive 导出数据,导入到 MySQL。
需要说明该命令的以下几个参数:
1)--connect:MySQL 数据库连接 URL。
2)--username 和--password:MySQL 数据库的用户名和密码。
3)--table:导出的数据表名。
4)--fields-terminated-by:Hive 中字段分隔符。
6)--export-dir:Hive 数据表在 HDFS 中的存储路径。
[hadoop@master ~]$ sqoop export --connect "jdbc:mysql://master:3306/sample?useUnicode=true&characterEncoding=utf-8" -- username root --password Password123$ --table student --input-fie
1.6:Sqoop组件应用
Sqoop 常用设置命令如下:
(1)列出 MySQL 数据库中的所有数据库。
[hadoop@master ~]$ sqoop list-databases -connect jdbc:mysql://localhost:3306/ -username root -password Password123$
(2)连接 MySQL 并列出 sample 数据库中的表。
[hadoop@master ~]$ sqoop list-tables -connect jdbc:mysql://localhost:3306/sample -username root -password Password123$
(3)将关系型数据的表结构复制到 hive 中,只是复制表的结构,表中的内容没有复制
过去。
[hadoop@master ~]$ sqoop create-hive-table -connect jdbc:mysql://localhost:3306/sample -table student -username root -password Password123$ -hive-table test
其中–table student 为 MySQL 中的数据库 sample 中的表–hive-table test 为 hive
中新建的表名称。
(4)从关系数据库导入文件到 Hive 中。
[hadoop@master ~]$sqoop import --connect jdbc:mysql://master:3306/sample --username root --password Password123$ --table student --delete-target-dir --num-mappers 1 --hive-import --hive-database default --hive-table test
(5)将 Hive 中的表数据导入到 MySQL 中,在进行导入之前,MySQL 中的表
hive_test 表必须已经提前创建好。
删除 MySQL 数据, student 表中 number 为主键,添加信息导致主键重复,报错,所以删除表数据 [hadoop@master ~]$mysql -u root -p #密码 Password123$ mysql>use sample; mysql>delete from student; mysql>exit; [hadoop@master ~]$ sqoop export -connect jdbc:mysql://master:3306/sample --username root -password Password123$ -table student --input-fields-terminatedby '\001' -export-dir /user/hive/warehouse/test
(6)从数据库导出表的数据到 HDFS 上文件。
[hadoop@master ~]$ sqoop import -connect jdbc:mysql://master:3306/sample --username root -password Password123$ -table student --num-mappers 1 -targetdir /user/test
(7)从数据库增量导入表数据到 HDFS 中。
#密码 Password123$ [hadoop@master ~]$mysql -u root -p mysql>use sample; mysqlinsert into student values('04','sss'); mysqlinsert into student values('05','ss2'); mysqlinsert into student values('06','ss3'); #非数值型的值不能当做增量 mysqlalter table student modify column number int; mysqlexit; [hadoop@master ~]$sqoop import -connect jdbc:mysql://master:3306/sample - username root -password Password123$ -table student --num-mappers 1 -targetdir /user/test -check-column number -incremental append -last-value 0 查看导入数据 [hadoop@master ~]$hdfs dfs -cat /user/test/part-m-00000