赞
踩
将导入或导出命令翻译成 MapReduce 程序来实现。
Sqoop是一个用于在Hadoop和关系数据库之间传输数据的工具
RDB指关系数据库(Relational Database,RDB)
因为没有配置环境变量,先进入sqoop文件夹cd /opt/sqoop/
将mysql数据库中的hive数据库中的BUCKETING_COLS表导到HDFS的路径/data/bucketing_cols
中
(需要转义换行符)
bin/sqoop-import \
--connect jdbc:mysql://hadoop1:3306/hive \
--driver com.mysql.jdbc.Driver \
--table BUCKETING_COLS \
--username root \
--password ok \
--target-dir /data/bucketing_cols \
--m 3
说明:
(1)sqoop-import是sqoop import的别名
(2)connect jdbc:mysql://hadoop1:3306/hive \配置数据库连接为MySQL中数据库
(3)target-dir /data/bucketing_cols \导入指定目录
(4)–m 表示Mapper数量
可能出现的报错
报错原因:
缺少 java-json.jar
解决方法:
获得java-json.jar的文件,并将该 jar 包放到$SQOOP_HOME/lib 目录下
[root@hadoop1 sqoop]#wget http://www.java2s.com/Code/JarDownload/java-json/java-json.jar.zip
[root@hadoop1 sqoop]# yum -y install unzip
[root@hadoop1 sqoop]# unzip java-json.jar.zip
[root@hadoop1 sqoop]# mv java-json.jar lib/
(2)也有可能出现连接不上的报错
可以检查一下之前自己的mysql是否有过赋权
a.登录mysql数据库:[root@hadoop1 ~]# mysql -uroot -pok
b.进入mysql数据库中查看host和pasword
mysql> use mysql Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select host,password from user -> ; +-----------------------+-------------------------------------------+ | host | password | +-----------------------+-------------------------------------------+ | localhost | *31330A9B24799CC9566A39CBD78CEF60E26C906F | | localhost.localdomain | *31330A9B24799CC9566A39CBD78CEF60E26C906F | | 127.0.0.1 | *31330A9B24799CC9566A39CBD78CEF60E26C906F | | ::1 | *31330A9B24799CC9566A39CBD78CEF60E26C906F | | % | *31330A9B24799CC9566A39CBD78CEF60E26C906F | +-----------------------+-------------------------------------------+ 5 rows in set (0.00 sec)
c.如果没有赋权的话password前面没有*
那就通过以下方法进行赋权
grant all privileges on *.* to 'root'@'%' identified by 'ok' with grant option;
flush privileges; --刷新权限
bin/sqoop-import \
--connect jdbc:mysql://hadoop1:3306/hive \
--driver com.mysql.jdbc.Driver \
--table TBLS \
--where "owner='root'" \ #指定where条件
--username root \
--password ok \
--delete-target-dir \ #如果目标目录存在,则删除
--target-dir /data/tbls \
--m 3
bin/sqoop-import \
--connect jdbc:mysql://hadoop1:3306/hive \
--driver com.mysql.jdbc.Driver \
--table TBLS \
--columns "TBL_ID,OWNER,TBL_NAME,TBL_TYPE" \ #导入指定列
--where "owner='root'" \
--username root \
--password ok \
--delete-target-dir \
--target-dir /data/tbls \
--m 3
bin/sqoop-import \
--connect jdbc:mysql://hadoop1:3306/hive \
--driver com.mysql.jdbc.Driver \
--query "select * from TBLS where owner='root' and \$CONDITIONS" \ #所有查询都应该\$CONDITIONS结束;sqoop内部使用该条件将记录范围分发给所有Mapper
--username root \
--password ok \
--split-by tbl_id \ #指定用于分割数据的列为tbl_id
--delete-target-dir \
--target-dir /data/tbls/ \
--m 3
使用Sqoop增量导入数据
Incremental指定增量导入的模式
append:追加数据记录
lastmodified:可追加更新的数据
bin/sqoop-import \
--connect jdbc:mysql://hadoop1:3306/test \
--table student \
--username root \
--password ok \
--incremental append \
--check-column sid \
--last-value 5 \ #将表的sid列的值为5的后面的数据进行增量导入进入
--delete-target-dir \
--target-dir /data/stu \
--m 3
说明:
bin/sqoop-import \
--connect jdbc:mysql://hadoop1:3306/test \
--table student \
--username root \
--password ok \
--incremental append \
--check-column sid \
--last-value 5 \
--target-dir /data/stu \
--m 3 \
--as-sequencefile
Sqoop可以定义保存job,从而简化此过程
保存的job记录执行Sqoop命令所需的配置信息
参数 | 描述 |
---|---|
–create | 定义一个新的job |
–delete | 删除一个已有的job |
–exec | 执行一个已有的job |
–show | 显示出一个job的所有参数 |
–list | 列出所有job |
#创建sqoop job
sqoop job \
--create order2HDFS -- import \ #import前面需要一个空格
--connect jdbc:mysql://hadoop00:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--username root \
--password ok \
--target-dir /data/retail_db/orders_job \
--delete-target-dir \
-m 5
#执行,需要输入数据库的密码
sqoop job --exec order2HDFS
注意: 在创建job时,命令"-- import"中间需要一个空格,否则会报错
从关系型数据库导到hive中,中间会先导到HDFS的临时路径下,再导入hive中。
所以如果第一次因为jar包没导入成功的话,第二次可能会出现表已经存在的情况,可以删除HDFS中的临时表再进行导入,目录为"user/root/…"
bin/sqoop-import \
--connect jdbc:mysql://hadoop1:3306/test \
--table student \
--username root \
--password ok \
--hive-import \ #通过hive-import指定导入到Hive
--create-hive-table \ #指定创建一个新的hive表,如果表已经存在则报错
--hive-database sqooptest \
--hive-table student \
--hive-overwrite \
--m 3
1.jar包导入:从hive中的lib中复制到sqoop的lib目录下
cp /opt/hive/lib/hive-common-1.1.0-cdh5.14.2.jar /opt/sqoop/lib/
cp /opt/hive/lib/hive-exec-1.1.0-cdh5.14.2.jar /opt/sqoop/lib/
2.命令:
bin/sqoop-import \
--connect jdbc:mysql://hadoop1:3306/test \
--table student \
--username root \
--password ok \
--hive-import \
[--create-hive-table \]
--hive-database sqooptest \
--hive-table student \
[--hive-overwrite]
--m 3
sqoop-import \
--connect jdbc:mysql://hadoop00:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--query "select order_id,order_status from orders where order_date >='2014-07-24' and order_date <'2014-07-25' and \$CONDITIONS" \
--username root \
--password ok \
--split-by 'order_id' \
--target-dir /data/retail_db/order_partition \ #这个是hdfs上的临时路径,最终导入的是hive的默认路径下
--hive-import \
--hive-database retails \
--hive-table order_partition \
--hive-partition-key "order_date" \ #指定分区字段
--hive-partition-value "2014-07-24" \ #指定分区值
--m 1
bin/sqoop-import \
--connect jdbc:mysql://hadoop1:3306/test \
--table products \
--username root \
--password ok \
--columns "product_name,product_price" \
--hbase-create-table \
--hbase-table product \
--column-family prod \
--hbase-row-key product_id \
--m 1
使用sqoop export导出数据到MySQL
步骤:
--在mysql中创建表
CREATE TABLE customerdemo LIKE customers
#hdfs导出到mysql
sqoop export \
--connect jdbc:mysql://hadoop00:3306/retail_db \
--username root \
--password ok \
--table customerdemo \
--export-dir /data/retail_db/customers \
-m 1
脚本打包比用命令行操作要方便,而且更容易与 Shell 脚本结合使用。
opt 格式的文件打包 sqoop 命令,然后执行
(1).创建一个.opt 文件
[hadoop@hadoop00 ~]$ mkdir opt
[hadoop@hadoop00 ~]$ touch opt/job_HDFS2RDBMS.opt
(2).编写 sqoop 脚本
[hadoop@hadoop00 ~]$ vi opt/job_HDFS2RDBMS.opt 添加如下内容 import --connect jdbc:mysql://hadoop00:3306/retail_db --driver com.mysql.jdbc.Driver --table customers --username root --password ok --target-dir /data/retail_db/customers2 --delete-target-dir -m3
(3).执行该脚本
[hadoop@hadoop00 ~]$ sqoop --options-file opt/job_HDFS2RDBMS.opt
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。