1 简介:
a) SQOOP是用于对数据进行导入导出的。
(1)把MySQL、Oracle等数据库中的数据导入到HDFS、Hive、HBase中
(2)把HDFS、Hive、HBase中的数据导出到MySQL、Oracle等数据库中
b) 官网地址 http://sqoop.apache.org/
2 安装:
// 解压和重命名 [root@master local]# tar -zxvf sqoop-1.4.3.bin__hadoop-1.0.0.tar.gz [root@master local]# mv sqoop-1.4.3.bin__hadoop-1.0.0 sqoop // 设置环境变量 [root@master bin]# vi /etc/profile export JAVA_HOME=/usr/local/jdk export HADOOP_HOME=/usr/local/hadoop export HIVE_HOME=/usr/local/hive export ZK_HOME=/usr/local/zk export SQOOP_HOME=/usr/local/sqoop export PATH=.:$SQOOP_HOME/bin:$ZK_HOME/bin:$HIVE_HOME/bin:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH [root@master bin]# source /etc/profile 修改 sqoop/conf/sqoop-env.sh配置文件: 将 export HADOOP_COMMON_HOME=你的hadoop安装根目录 export HADOOP_MAPRED_HOME=你的hadoop安装根目录 // 查看sqoop命令帮助 [root@master local]# sqoop help Warning: $HADOOP_HOME is deprecated. usage: sqoop COMMAND [ARGS] Available commands: codegen Generate code to interact with database records create-hive-table Import a table definition into Hive eval Evaluate a SQL statement and display the results export Export an HDFS directory to a database table // 将hdfs数据导出到数据库中 help List available commands import Import a table from a database to HDFS // 将数据库中表的数据导入到hdfs中 import-all-tables Import tables from a database to HDFS job Work with saved jobs // list-databases List available databases on a server list-tables List available tables in a database merge Merge results of incremental imports metastore Run a standalone Sqoop metastore version Display version information See 'sqoop help COMMAND' for information on a specific command. [root@master local]#
3 把数据从mysql导入到hdfs(默认是/user/<username>)中:
// 给sqoop拷贝mysql-connector-java-5.1.10.jar [root@master lib]# cp mysql-connector-java-5.1.10.jar /usr/local/sqoop/lib // 将库hive_cr00 表TBLS 数据导出到hdfs中 [root@master local]#sqoop import --connect jdbc:mysql://master:3306/hive_cr00 --username root --password admin --table TBLS --fields-terminated-by '\t' --null-string '**' -m 1 解释如下: sqoop import --connect jdbc:mysql://hadoop0:3306/hive(数据库名) --username root --password admin --table TBLS(连接的表名) --fields-terminated-by '\t'(导入hdfs后数据用/t间隔) --null-string '**' 如果string为null则导出到hdfs后用**表示 -m 1 默认导出用4个map任务执行 这里指定只用一个map任务,节省资源 --append 表示追加写入hdfs中 --hive-import 表示导入到hive中
导出后的样子为:
针对数据表中数据增加插入hdfs中写法:
上述命令表示全量导入,即使使用append字段,也仅仅是在/user/<username>/下将再次导入的全量数据在增加一个hdfs文件来存放而已, 现在仅仅想将数据表中增加的字段导入到hdfs中,即再次产生的hdfs文件内仅仅是数据表新增的内容,而非表中所有数据: 参考链接: 官网 http://sqoop.apache.org/docs/1.4.3/SqoopUserGuide.html#_incremental_imports sqoop import --connect jdbc:mysql://master:3306/hive --username root --password admin --table TBLS --fields-terminated-by '\t' --null-string '**' -m 1 --append --check-column 'TBL_ID' 追加插入时,需要检查的列TBL_ID --incremental append 在追加的时候 执行检验 --last-value 6 上次追加后 TBL_ID的最后一个值为6 [root@master bin]# sqoop import --connect jdbc:mysql://master:3306/hive_cr00 --username root --password admin --table TBLS --fields-terminated-by '\t' --null-string '**' -m 1 --append --check-column 'TBL_ID' --incremental append --last-value 15 结果: 14/12/29 01:28:37 INFO tool.ImportTool: No new rows detected since last import.
4 把数据从hdfs导出到mysql中:
在mysql test库中创建表sqoontable,字段 id(varchar(60)),name(varchar(60)) 在hdfs中准备数据如下: [root@master data]# hadoop fs -text /ids/sqoopdata Warning: $HADOOP_HOME is deprecated. hello;you hello;me hello;30 执行命令,导出是可以重复执行的,会不断向数据表插入字段 sqoop export --connect jdbc:mysql://master:3306/test --username root --password admin --table sqoontable --fields-terminated-by ';' --export-dir '/ids' 解释如下: sqoop export --connect jdbc:mysql://master:3306/test --username root --password admin 连接数据库 test --table sqoontable 要将hdfs数据导入到表名称 sqoontable --fields-terminated-by ';' --export-dir '/ids' hdfs数据来源在文件夹 /ids下 也可以具体指定 eg: --export-dir '/ids/sqoopdata'5 设置为作业,运行作业
sqoop job --create myjob4 -- export --connect jdbc:mysql://master:3306/test --username root --password admin --table sqoontable --fields-terminated-by ';' --export-dir '/ids/sqoopdata' sqoop job --exec myjob4 在执行的时候,跳出 password: 此时输入mysql链接密码即可执行 如果要去掉密码,请看官网 http://sqoop.apache.org/docs/1.4.3/SqoopUserGuide.html#_saved_jobs_and_passwords 主要在 导入/导出命令上增加 --create job名称 -- 即可 查看作业列表: [root@master bin]# sqoop job --list 删除作业: [root@master bin]# sqoop job --delete myjob(作业名称)6 导入导出和事务 导入导出的事务是以Mapper任务为单位,启动一个mapper任务,就有一个事务,启动4个mapper任务,则有四个事务。