人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)
Sqoop 导入:把MySQL数据库表中数据 导入到 hive数据库表中(hdfs文件系统路径下的结构化数据文件中)
1.创建数据库:userdb
2.导入 userdb.sql 到 userdb数据库中
3.把 MySQL数据库中的 某表数据 导入到 HDFS
1.格式:(在所安装的sqoop根目录下执行命令)
bin/sqoop import \
--connect jdbc:mysql://IP:3306/数据库名 \
--username MySQL用户名 \
--password MySQL密码 \
--target-dir /hdfs目录路径名(数据输出目录) \ # 不能预先创建“/hdfs目录路径名”的文件夹,会报错显示输出目录已经存在
--table 表名 --m 1
2.例子:把 MySQL数据库中的 emp表数据 导入到 HDFS文件系统路径下的/sqoopresult文件夹中的part-m-00000文件
1.注意:不能预先创建“/hdfs目录路径名”的文件夹,程序会自动创建。
如果已经存在指定的存储数据的“/hdfs目录路径名”的文件夹的话,会报错显示输出目录已经存在
2.在所安装的sqoop根目录下执行命令:
bin/sqoop import \
--connect jdbc:mysql://192.168.25.100:3306/userdb \
--username root \
--password admin \
--target-dir /sqoopresult \ # 不能预先创建“/hdfs目录路径名”的文件夹,会报错显示输出目录已经存在
--table emp --m 1
3.查看hdfs文件系统下的文件内容的命令:hdfs dfs -cat /sqoopresult/part-m-00000
4.将MySQL数据库中的某表的结构 复制到 hive中的数据库中的某表中
1.格式:(在所安装的sqoop根目录下执行命令)
bin/sqoop create-hive-table \
--connect jdbc:mysql://IP:3306/数据库名 \
--table MySQL数据库表 \
--username MySQL用户名 \
--password MySQL密码 \
--hive-table hive中的数据库名.表名 # hive中的数据库必须已经存在,而表是会自动创建,无需自己创建
2.例子: (在所安装的sqoop根目录下执行命令)
bin/sqoop create-hive-table \
--connect jdbc:mysql://192.168.25.100:3306/userdb \
--table emp_add \
--username root \
--password admin \
--hive-table itheima.emp_add
参数分析:--table emp_add 为MySQL中的数据库userdb中的表
--hive-table itheima.emp_add 为hive中的数据库中的表。hive中的数据库必须已经存在,而表是会自动创建,无需自己创建
3.验证:
1.use itheima;
2.desc emp_add;
5.把MySQL中的某数据库中的某表种数据 导入到 hive中的某数据库中的某表中
1.格式:(在所安装的sqoop根目录下执行命令)
bin/sqoop import \
--connect jdbc:mysql://IP:3306/数据库名 \
--username MySQL用户名 \
--password MySQL密码 \
--table MySQL数据库表名 \
--hive-table hive中的数据库名.表名 \ # hive中的数据库和表都必须已经存在
--hive-import \
--m 1
2.例子:把MySQL中的数据库userdb中的emp_add表数据 导入到 hive中的itheima数据库中的emp_add表
bin/sqoop import \
--connect jdbc:mysql://192.168.25.100:3306/userdb \
--username root \
--password admin \
--table emp_add \
--hive-table itheima.emp_add \
--hive-import \
--m 1
6.把 where查询条件子语句 所查询出的结果数据 存储到 hdfs文件系统下的某目录下的文件中
1.格式:(在所安装的sqoop根目录下执行命令)
bin/sqoop import \
--connect jdbc:mysql://IP:3306/数据库名 \
--username MySQL用户名 \
--password MySQL密码 \
--where "字段名='字段值'" \
--target-dir /hive中的文件夹名(数据输出目录) \ # 不能预先创建“/hdfs目录路径名”的文件夹,会报错显示输出目录已经存在
--table MySQL数据库表名 --m 1
2.例子:把 where查询条件子语句 所查询出的结果数据 存储到 hdfs文件系统下的“/wherequery”的目录下的文件中
1.hadoop fs -mkdir /sqoopresult/wherequery
2.(在所安装的sqoop根目录下执行命令)
bin/sqoop import \
--connect jdbc:mysql://192.168.25.100:3306/userdb \
--username root \
--password admin \
--where "city ='sec-bad'" \
--target-dir /wherequery \ # 不能预先创建“/hdfs目录路径名”的文件夹,会报错显示输出目录已经存在
--table emp_add --m 1
3.查看hdfs文件系统下的文件内容的命令:hdfs dfs -cat /wherequery/part-m-00000
7.把 select查询语句的查询结果 存储到 hdfs文件系统下的某目录下的文件中
1.格式:
bin/sqoop import \
--connect jdbc:mysql://IP:3306/数据库名 \
--username MySQL用户名 \
--password MySQL密码 \
--target-dir /hive中的文件夹名(数据输出目录) \ # 不能预先创建“/hdfs目录路径名”的文件夹,会报错显示输出目录已经存在
--query 'select id,字段名 from MySQL数据库表名 WHERE 语句 and $CONDITIONS' \ # 必须加上 and $CONDITIONS
--split-by 字段名 \ # split-by对非数字类型的字段支持不好。一般用于主键及数字类型的字段
--fields-terminated-by '分隔符' \ # hive的输出目录中的文件使用该分隔符进行分割数据
--m 1
参数解析:
1.split-by 根据不同的参数类型有不同的切分方法,如int型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来 确定划分几个区域。
比如select max(split_by),min(split-by) from得到的max(split-by)和min(split-by)分别为1000和1,而num-mappers(-m)为2的话,
则会分成两个区域 (1,500)和(501-1000),同时也会分成2个sql给2个map去进行导入操作,
分别为select XXX from table where split-by>=1 and split-by<500和select XXX from table where split-by>=501 and split-by<=1000。
最后每个map各自获取各自SQL中的数据进行导入工作。
2.当split-by不是int型时出现如上场景中的问题。目前想到的解决办法是:将-m 设置称1,split-by不设置,即只有一个map运行,缺点是不能并行map录入数据。
(注意,当-m 设置的值大于1时,split-by必须设置字段)
3.split-by即便是int型,若不是连续有规律递增的话,各个map分配的数据是不均衡的,可能会有些map很忙,有些map几乎没有数据处理的情况
2.例子:把 select查询语句的查询结果 存储到 hdfs文件系统下的“/wherequery12”的目录下的文件中
bin/sqoop import \
--connect jdbc:mysql://192.168.25.100:3306/userdb \
--username root \
--password admin \
--target-dir /wherequery12 \
--query 'select id,name,deg from emp WHERE id > 1203 and $CONDITIONS' \
--split-by id \
--fields-terminated-by ',' \
--m 1
3.查看hdfs文件系统下的文件内容的命令:hdfs dfs -cat /wherequery12/part-m-00000
8.增量导入:
进行增量导入(数据追加)的条件:
--check-column 字段名
--last-value 字段值
在MySQL的某数据库中某表中,把 大于某字段的字段值的 每行数据 追加导入到 hive中的数据库表(目录)中的文件中,
即把MySQL的某数据库中某表中新添加的数据 继续追加到 (hdfs文件系统路径)hive中的数据库表中的文件中。
1.格式:
bin/sqoop import \
--connect jdbc:mysql://IP:3306/数据库名 \
--username MySQL用户名 \
--password MySQL密码 \
--table MySQL数据库表名 --m 1 \
--incremental append \ # append 表示追加模式
--check-column 字段名 \
--last-value 字段值 \
--target-dir /hdfs目录路径名(数据输出目录) # 可以已经存在“/hdfs目录路径名(数据输出目录)”的文件,并且会在该目录下创建新的一个文件保存追加的数据
2.例子:
进行增量导入(数据追加)的条件:此处把MySQL的sqoopdb数据库中得emp表中,根据 大于1205的 id值 的每行数据 追加导入到 hive中的数据库表中的文件中,
即把emp表中新添加的数据 继续追加添加到 (hdfs文件系统路径)hive中的数据库表中的文件中。
bin/sqoop import \
--connect jdbc:mysql://192.168.25.100:3306/userdb \
--username root \
--password admin \
--table emp --m 1 \
--incremental append \
--check-column id \
--last-value 1205
--target-dir /sqoopresult # 可以已经存在“/sqoopresult”的文件,并且会在该目录下创建新的一个文件保存追加的数据
3.查看hdfs文件系统下的文件内容的命令:hdfs dfs -cat /sqoopresult/part-m-00001
======================================================================
Sqoop 导出:把 hive数据库表中数据(hdfs文件系统路径下的结构化数据文件中的数据) 导出到 MySQL数据库表中
Sqoop 导出:把 hive数据库表中数据(hdfs文件系统路径下的结构化数据文件中的数据) 导出到 MySQL数据库表中
1.准备 hive数据库表中的数据(hdfs文件系统路径下的结构化数据文件中的数据)
1201,gopal,manager,50000,TP
1202,manisha,preader,50000,TP
1203,kalil,php dev,30000,AC
1204,prasanth,php dev,30000,AC
1205,kranthi,admin,20000,TP
1206,satishp,grpdes,20000,GR
2.把结构化数据文件上传到hdfs文件系统路径下:/emp_data
hadoop fs -mkdir /emp_data
hadoop fs -put /root/hivedata/2.txt /emp_data
3.创建MySQL数据库表
1.mysql -uroot -padmin
2.use userdb;
3.create table employee ( id INT NOT NULL PRIMARY KEY, name VARCHAR(20), deg VARCHAR(20), salary INT, dept VARCHAR(10));
4.执行Sqoop的导出命令:
1.格式:
bin/sqoop export \
--connect jdbc:mysql://IP:3306/数据库名 \
--username MySQL用户名 \
--password MySQL密码 \
--table MySQL数据库表名 \
--export-dir /hive中的文件夹名(数据导出目录)
2.例子:
1.cd /root/sqoop
2.命令:
bin/sqoop export \
--connect jdbc:mysql://192.168.25.100:3306/userdb \
--username root \
--password admin \
--table employee \
--export-dir /emp_data
5.测试:select * from employee;
========================================================
sqoop 命令
1.列出MySQL中所有数据库的名字
格式:
bin/sqoop list-databases \
--connect jdbc:mysql://IP:3306 \
--username MySQL用户名 \
--password MySQL密码
2.列出MySQL中某个数据库下的所有数据表的名字
格式:
bin/sqoop list-tables \
--connect jdbc:mysql://IP:3306/数据库名 \
--username MySQL用户名 \
--password MySQL密码
1.Apache Sqoop
Sqoop 是 Hadoop 和 关系数据库服务器 之间传送数据的一种工具。
它是用来从关系数据库如:MySQL,Oracle 到 Hadoop 的 HDFS,并从 Hadoop 的文件系统 导出数据到 关系数据库。
由 Apache 软件基金会提供。
2.Sqoop:“SQL 到 Hadoop 和 Hadoop 到 SQL”。
Sqoop 工作机制是将 导入或导出命令 翻译成 mapreduce 程序来实现。
在翻译出的 mapreduce 中主要是对 inputformat 和 outputformat 进行定制。
3.sqoop 安装
安装 sqoop 的前提是已经具备 java 和 hadoop 的环境。最新稳定版: 1.4.6
1.配置文件修改:
1.cd $SQOOP_HOME/conf
2.mv sqoop-env-template.sh sqoop-env.sh
3.vi sqoop-env.sh
export HADOOP_COMMON_HOME=/root/apps/hadoop/
export HADOOP_MAPRED_HOME=/root/apps/hadoop/
export HIVE_HOME=/root/apps/hive
4.加入 mysql 的 jdbc 驱动包
cp /hive/lib/mysql-connector-java-5.1.28.jar $SQOOP_HOME/lib/
5.验证启动
bin/sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password hadoop
6.本命令会列出所有 mysql 的数据库。到这里,整个 Sqoop 安装工作完成。
2.Sqoop 导入
1.“导入工具”导入单个表从 RDBMS 到 HDFS。表中的每一行被视为 HDFS 的记录。
所有记录都存储为文本文件的文本数据(或者 Avro、sequence 文件等二进制数据) 。
2.下面的语法用于将数据导入 HDFS。
$ sqoop import (generic-args) (import-args)
3.Sqoop 测试表数据
在 mysql 中创建数据库 userdb,然后执行参考资料中的 sql 脚本。
创建三张表: emp emp_add emp_conn。
4.导入 mysql 表数据到 HDFS
1.下面的命令用于从 MySQL 数据库服务器中的 emp 表导入 HDFS。
bin/sqoop import \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop \
--target-dir /sqoopresult \
--table emp --m 1
2.其中--target-dir 可以用来指定导出数据存放至 HDFS 的目录;
3.mysql jdbc url 请使用 ip 地址。
4.为了验证在 HDFS 导入的数据,请使用以下命令查看导入的数据:hdfs dfs -cat /sqoopresult/part-m-00000
5.可以看出它会用逗号,分隔 emp 表的数据和字段。
1201,gopal,manager,50000,TP
1202,manisha,Proof reader,50000,TP
1203,khalil,php dev,30000,AC
1204,prasanth,php dev,30000,AC
1205,kranthi,admin,20000,TP
5.导入 mysql 表数据到 HIVE
1.将关系型数据的表结构复制到 hive 中
bin/sqoop create-hive-table \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--table emp_add \
--username root \
--password hadoop \
--hive-table test.emp_add_sp
2.其中:
--table emp_add 为 mysql 中的数据库 sqoopdb 中的表。
--hive-table emp_add_sp 为 hive 中新建的表名称。
3.从关系数据库导入文件到 hive 中
bin/sqoop import \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop \
--table emp_add \
--hive-table test.emp_add_sp \
--hive-import \
--m 1
4.导入表数据子集
1.--where 可以指定从关系数据库导入数据时的查询条件。
它执行在各自的数据库服务器相应的 SQL 查询,并将结果存储在 HDFS 的目标目录。
bin/sqoop import \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop \
--where "city ='sec-bad'" \
--target-dir /wherequery \
--table emp_add --m 1
2.复杂查询条件:
bin/sqoop import \
--connect jdbc:mysql://node-21:3306/sqoopdb \
--username root \
--password hadoop \
--target-dir /wherequery12 \
--query 'select id,name,deg from emp WHERE id>1203 and $CONDITIONS' \
--split-by id \
--fields-terminated-by '\t' \
--m 1