(1)把MySQL、Oracle等数据库中的数据导入到HDFS、Hive、HBase中
(2)把HDFS、Hive、HBase中的数据导出到MySQL、Oracle等数据库中
SQOOP安装
1.加压:tar -zxvf sqoop-1.4.3.bin__hadoop-1.0.0.tar.gz 重命名
2.设置环境变量:
export SQOOP_HOME=/usr/local/sqoop
export PATH=.:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PIG_HOME/bin:$HIVE_HOME/bin:$SQOOP_HOME/bin:$PATH
3.执行sqoop命令进入sqoop
将mysql驱动复制到sqoop/lib/目录下
cp mysql-connector-java-5.1.10.jar /usr/local/sqoop/lib/
1.把数据从mysql导入到hdfs(默认是/user/<username>)中
sqoop import --connect jdbc:mysql://hadoop0:3306/hive --username root --password admin --table TBLS --fields-terminated-by '\t'
默认情况下,如果字段内容为null,就显示null值
sqoop import --connect jdbc:mysql://xxc:3306/hive --username root --password xxc --table TBLS --fields-terminated-by '\t'
--null-string '**'
--null-string '**',就表示把null值用**替代,注意不能用--,因为是关键字
-m 1是指定只有一个map执行任务,这样输出结果就不会有多个part-m-*****了 sqoop在导入的时候默认会启动4个map任务并行执行导入,这样可以加快执行速度
--append表示追加,继续在目录(这里是默认的/user/<username>)下
否则会出异常,文件夹已存在ERROR tool.ImportTool: ERROR tool.ImportTool: Encountered IOException running import job: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory TBLS already exists
sqoop import --connect jdbc:mysql://xxc:3306/hive --username root --password xxc --table TBLS --fields-terminated-by '\t' --null-string '**' -m 1--append
--hive-import表示导入到hive目录下
sqoop import --connect jdbc:mysql://hadoop0:3306/hive --username root --password admin--table TBLS --fields-terminated-by '\t' --null-string '**' -m 1 --append --hive-import
hive在hdfs中的默认位置是/user/hive/warehouse,是由配置文件hive-conf.xml中属性hive.metastore.warehouse.dir决定的。
例如导入表A数据到HDFS中,而且表A数据是在增加的,并且已经将表A数据导入过HDFS中,现在不想将表A数据再次全部导入HDFS中,而是将增加的部分导入HDFS中。
--check-column 'TBL_ID' 表示按照这个列来进行检查,如果这个列的数据增加了,就把增加部分的数据导入到HDFS中
--last-value 6 如何晓得哪些数据是新增部分呢?这个是设置TBL_ID 上一次最后一行的值为6
--incremental append 表示只将新增的数据追加进去
sqoop import --connect jdbc:mysql://xxc:3306/hive --username root --password xxc --table TBLS --fields-terminated-by '\t' --null-string '**' -m 1 --append --hive-import --check-column 'TBL_ID' --incremental append --last-value
6
2.把数据从hdfs导出到mysql中
--table ids 表示导出的表名 --export-dir '/ids'表示导出哪个目录 注意:这个导出是可以重复执行的。
sqoop export --connect jdbc:mysql://xxc:3306/hive --username root --password xxc --table ids --fields-terminated-by '\t' --export-dir '/ids'
3.设置为作业,运行作业
sqoop job --create myjob -- import --connect jdbc:mysql://xxc:3306/hive --username root --password xxc --table TBLS --fields-terminated-by '\t' --null-string '**' -m 1 --append --hive-import
用sqoop job list查看创建了哪些作业
运行作业 sqoop job -exec myjob 但是发现运行后需要手动输入数据库密码
将sqoop下conf下的sqoop-site.xml文件中下面这段代码的注释去掉,表示保存密码
<!--
<property>
<name>sqoop.metastore.client.record.password</name>
<value>true</value>
<description>If true, allow saved passwords in the metastore.
</description>
</property>
-->
sqoop job --delete myjob 删除作业
4. 导入导出的事务是以Mapper任务为单位。