Sqoop的安装及使用
Sqoop的安装
- 安装Sqoop的前提是已经具备Java和Hadoop、Hive、Zookeeper、HBase的环境。
下载并解压sqoop安装包
sqoop-1.4.6-cdh5.14.2.tar.gz安装包的下载路径:链接:https://pan.baidu.com/s/1A10KF5OkdVRF3NG0WB5dnw
提取码:q0v0
下载完成后上传到linux上 解压Sqoop安装包到指定的目录:
tar -zxvf sqoop-1.4.6-cdh5.14.2.tar.gz -C /opt
进入opt目录下进行重命名:
mv sqoop-1.4.6-cdh5.14.2.tar.gz sqoop
配置环境变量(可选):vi /etc/profile
export SQOOP_HOME=/opt/sqoop
export PATH=$SQOOP_HOME/bin:$PATH
配置完后对环境变量文件进行source,使环境变量文件生效:source /etc/profile
修改配置文件
进入sqoop根目录下的conf目录中
-
重命名配置文件
mv sqoop-env-template.sh sqoop-env.sh
-
修改配置文件sqoop-env.sh
export HADOOP_COMMON_HOME=/opt/hadoop export HADOOP_MAPRED_HOME=/opt/hadoop export HIVE_HOME=/opt/hive export ZOOKEEPER_HOME=/opt/zookeeper export ZOOCFGDIR=/opt/zookeeper export HBASE_HOME=/opt/hbase
-
拷贝jdbc驱动到sqoop的lib目录中, 驱动包可自行根据自己的需求进行下载(这里以MySQL驱动包为例)
cp mysql-connector-java-5.1.27-bin.jar /opt/install/sqoop/lib/
-
到此安装基本完成测试一下
- 配置环境变量的
sqoop version
- 没有配置环境变量的使用下面的语句进行查看sqoop的版本
/opt/sqoop/bin/sqoop version
- 查看版本可能会有一些警告,不用管,只要不是报错都是可以的。
- 测试sqoop是否可以成功连接数据库
sqoop list-databases --connect jdbc:mysql://hadoop102:3306/ --username root --password root
list-databases //查看数据库 --connect jdbc:mysql://hadoop102:3306/ //连接数据库 --username root //数据库的用户名 --password root //数据库的用户密码 根据自己的情况配置自己的数据库的连接信息
- 在连接是可能会遇到异常:Exception in thread “main” java.lang.NoClassDefFoundError: org/json/JSONObject
- 解决方案:这是因为sqoop缺少java-json.jar包. 下载jar包导入lib目录下
wget http://www.java2s.com/Code/JarDownload/java-json/java-json.jar.zip mv java-json.jar.zip /opt/sqoop/lib/
- 由于下载的是zip格式所以还需要进行解压
unzip /opt/sqoop/lib/java-json.jar.zip
- 再次输入命令此进行测试成功输出自己数据库中的信息则表示连接成功,到此sqoop安装完成。
使用Sqoop从RDB(关系型数据库)导入数据到HDFS
-
导入表到HDFS
sqoop import --connect jdbc:mysql://localhost:3306/hr --driver com.mysql.jdbc.Driver --table user --username root --password hadoop --target-dir /data/user --m 3
--connect jdbc:mysql://localhost:3306/hr //连接数据库 --driver com.mysql.jdbc.Driver //加载驱动 --table user //需要导入的表 --username root //数据库的用户名 --password hadoop //数据库用户的密码 --target-dir /data/user //指定存储路径 --m 3 //设置maptask的个数
-
通过where语句过滤导入表
sqoop import --connect jdbc:mysql://localhost:3306/hr --table orders --where “order_date > ‘2015-10-10’” --username root --password hadoop --delete-target-dir --target-dir /data/orders --m 3
--where “order_date > ‘2015-10-10’” //筛选条件,筛选表中的数据 --delete-target-dir //表示可以对已有的路径中的文件进行覆盖(删除已有的路径在进行新建路径)
-
通过columns过滤导入表
sqoop import --connect jdbc:mysql://localhost:3306/hr --table user --columns “host,name,age” --username root --password hadoop --delete-target-dir --target-dir /data/user --m 3
--columns “host,name,age” //导入指定的列
-
使用query方式导入数据
sqoop import --connect jdbc:mysql://localhost:3306/hr --query “select * from user where host != '127.0.0.1' and \$CONDITIONS” --username root --password hadoop --split-by host --delete-target-dir --target-dir /data/user --m 3
--query “select * from user where host != '127.0.0.1' and \$CONDITIONS” //使用查询语句进行导入 注:所有查询都应该以\$CONDITIONS结束;sqoop内部使用该条件将记录范围分发给所有Mapper --split-by host //指定用于分割数据的列为host
-
使用Sqoop增量导入数据
- Incremental指定增量导入的模式
- append:追加数据记录
- lastmodified:可追加更新的数据
sqoop import --connect jdbc:mysql://localhost:3306/hr --table orders --username root --password hadoop --incremental append --check-column order_date --last-value ‘2015-10-10’ --target-dir /data/orders --m 3
--incremental append //增量的方式为append追加数据至已经存在的HDFS数据 --check-column order_date //指定递增的列 --last-value ‘2015-10-10’ //指定上一次导入的最大值
- Incremental指定增量导入的模式
-
导入是指定文件格式参数
- –as-textfile 导入数据为text文件(默认)
- –as-avrodatafile 导入数据为avro文件
- –as-sequencefile 导入数据为sequence文件
- –as-parquetfile 导入数据为parquet文件
sqoop import --connect jdbc:mysql://localhost:3306/hr --table orders --username root --password hadoop --delete-target-dir --target-dir /data/orders --m 3 --as-sequencefile
使用Sqoop从RDB(关系型数据库)导入数据到Hive
-
在导入之前需要进行导入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/
sqoop import --connect jdbc:mysql://localhost:3306/hr --table orders --username root --password hadoop --hive-import --create-hive-table --hive-database retail_db --hive-table orders --m 3
--hive-import //指定导入到hive --create-hive-table //指定创建一个新的hive表,如果表已经存在则会报错 --hive-database retail_db //指定表需要存放的库 --hive-table orders //指定表名 注:在导入时不需要指定target-dir,但是在进行再次导入时则需要加上delete-target-dir
- 进行覆盖导入数据
```shell
sqoop import --connect jdbc:mysql://localhost:3306/hr --table orders --username root --password hadoop --hive-import --hive-overwrite --hive-database retail_db --hive-table orders --m 3
--hive-overwrite //表示覆盖原有的数据,如果是覆盖的话就不需要在新建表了
注:同样也可以使用追加的方式进行对表中数据的追加
-
导入数据到Hive分区
sqoop import --connect jdbc:mysql://localhost:3306/hr --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 hadoop --target-dir /user/data/orders --split-by order_status --hive-import --hive-table eShop.orders --hive-partition-key “order_date” --hive-partition-value “20140724” --m 3
- 由于分区表示不可以直接创建的,所以在导入之前需要在hive上创建好分区表再进行导入,注意在创建表的时候不要指定分割符,否则会出现全为空值,数据导入不成功
--target-dir /user/data/orders //同样在导入时可以不加target-dir --split-by order_status //指定用分割的数据列 --hive-table eShop.orders //直接使用库名.表名的方式 --hive-partition-key “order_date” //分区的类型 --hive-partition-value “20140724” //指定分区的值 注:sqoop不支持动态分区,所以导入时需要指定分区
使用Sqoop从RDB(关系型数据库)导入数据到HBase
-
导入MySQL数据到HBase
sqoop import --connect jdbc:mysql://localhost:3306/retail_db --username root --password hadoop --table products --columns "customernum, customername" --hbase-table customercontactinfo --column-family CustomerName --hbase-row-key customernum -m 1
--columns "customernum, customername" //指定导入的列 --hbase-create-table //创建HBase表 --hbase-table customercontactinfo //指定导入HBase的表 --column-family CustomerName //指定导入的列簇 --hbase-row-key customernum //指定行键的列 注:行键的列必须包含在指定导入的列中,不然会出错,
使用Sqoop从HDFS导出到MySQL中
-
使用sqoop export导出数据到MySQL
-
在MySQL中创建表:导出之前需要在MySQL中创建好表
-
导出数据到MySQL
sqoop export --connect jdbc:mysql://localhost:3306/sqoop --username root --password hadoop --table emp_demo --export-dir /data/sqoop/emp --input-fields-terminated-by '\001' -m 1
--export-dir /data/sqoop/emp //指定HDFS上的路径
--input-fields-terminated-by '\001' //指定列分割符