sqoop 安装和简单使用

来源:互联网 发布:软件登记机构 编辑:程序博客网 时间:2024/05/29 13:24
1》SQOOP安装(hadoop 和hive 和mysql已安装好)
和flume相似,要将sqoop放在active的namenode节点上
下载sqoop-1.4.5-cdh5.3.6.tar.gz,解压到/opt/modules目录下
tar -zxf sqoop-1.4.5-cdh5.3.6.tar.gz -C /opt/modules/

添加环境变量
vim /etc/profile
##SQOOP_HOME
export SQOOP_HOME=/opt/modules/sqoop-1.4.5-cdh5.3.6
export PATH=$PATH:$SQOOP_HOME/bin
保存之后更新
source /etc/profile

修改配置文件
在$SQOOP_HOME/conf 目录下
mv sqoop-env-template.sh sqoop-env.sh

修改sqoop-env.sh如下:
export HADOOP_COMMON_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6
export HADOOP_MAPRED_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6


将Sqoop连接数据库的jar包(mysql-connector-java-5.1.31.jar),放在$SQOOP_HOME的lib目录下


验证Sqoop
sqoop-version

预期的输出:
17/09/20 17:08:32 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5-cdh5.3.6
Sqoop 1.4.5-cdh5.3.6
git commit id
Compiled by jenkins on Tue Jul 28 15:08:32 PDT 2015

到这里,整个Sqoop安装工作完成。


2》sqoop导入数据
--m 代表一个map --where代表导入的过滤条件
bin/sqoop import \
--connect jdbc:mysql://VTU-01/test \
--username root \
--password sunstar \
--m 1 \
--table emp \
--where "" \
--fields-terminated-by '\t' \
--target-dir /user/hive/sqoop/emp2

创建Hive外部表
CREATE external TABLE IF NOT EXISTS employee04 (
id int,
name String,
deg String,
salary String)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
location '/user/hive/sqoop/emp/';

导入所有表
sqoop import-all-tables \
--connect jdbc:mysql://localhost/userdb \
--username root \
--password passwd

sqoop ,hive ,mysql之间的关系
mysql--》sqoop--》hive
3 举例》

1.在mysql创建一个表emp,里面有四个字段
id int,name String,deg String,salary String,在里面添加一些数据

2.sqoop将mysql的数据导入到hdfs文件系统上指定目录下
bin/sqoop import \
--connect jdbc:mysql://VTU-01/test \
--username root \
--password sunstar \
--m 1 \
--table emp \
--target-dir /user/hive/sqoop/emp

3.创建外部表 指定目录和sqoop导入的目录一样,这样hive就不需要自己导入,文件就会加载到表中,
创建外部表在于删除表不会删除hdfs文件系统上的文件
CREATE external TABLE IF NOT EXISTS employee04 (
id int,
name String,
deg String,
salary String)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
location '/user/hive/sqoop/emp/';

4.select *from emplyeeo4; 数据已经可以查到
5.drop table employee04;查看hdfs文件系统上文件 还存在
bin/hdfs dfs -ls /user/hive/sqoop/emp


4》sqoop导数据到hive会先将数据导入到HDFS上,然后再将数据move到hive中
CREATE TABLE IF NOT EXISTS employee04 (
id int,
name String,
deg String,
salary String)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
location '/user/hive/emp4';

bin/sqoop import \
--connect jdbc:mysql://VTU-01/test \
--username root \
--password sunstar \
--m 1 \
--table emp \
--fields-terminated-by '\t' \
--hive-import \
--hive-database default \
--hive-table employee04 \
--as-textfile \
--hive-overwrite \
--target-dir /user/hive/emp4 \
--delete-target-dir

我的想法是为什么不可以将mysql的数据直接加载到创建的Hive表的路径,如上,这样子的话会报错,说不可以
移动同一路径下的文件到相同的目录

Failed with exception Unable to move source hdfs://localhost:8020/user/hive/emp4/part-m-00000 to
destination hdfs://localhost:8020/user/hive/emp4/part-m-00000

不出错的方式
bin/sqoop import \
--connect jdbc:mysql://VTU-01/test \
--username root \
--password sunstar \
--m 1 \
--table emp \
--fields-terminated-by '\t' \
--hive-import \
--hive-database default \
--hive-table employee04 \
--as-textfile \
--hive-overwrite \
--target-dir /user/hive/emp_tmp \
--delete-target-dir

我想让加载mysql的目标路径和创建Hive表的路径相同是因为,mysql表加再到某一路径下,再move到Hive表的
路径后,会在目录/user/hive/emp_tmp下残留一些目录和文件信息


5》从hive导出到mysql
bin/sqoop export \
--connect jdbc:mysql://VTU-01:3306/test \
--username root \
--password sunstar \
--m 1 \
--table emp2 \
--export-dir /user/hive/emp4/part-m-00000_copy_1 \
--input-fields-terminated-by "\t"

*********************
--export-dir:                            从hdfs上哪个目录导出
--input-fields-terminated-by "\t"        要导出的文件字段是以什么进行分隔的

6》编写脚本文件运行   参数  --options-file
作用是使用文件编辑sqoop的参数和命令,然后使用--options-file参数来执行。
# vi job1.opt
export
--connect
jdbc:mysql://VTU-01:3306/test
--username
root
--password
sunstar
--table
emp
--num-mappers
1
--export-dir
/user/hive/emp4/part-m-00000_copy_1
--input-fields-terminated-by
"\t"
执行语句:
./sqoop --options-file job1.opt

7》sqoop Eval工具
选择查询评估计算
bin/sqoop eval \
--connect jdbc:mysql://VTU-01:3306/test \
--username root \
--password sunstar \
--query "SELECT * FROM emp LIMIT 3"

插入查询计算
sqoop eval \
--connect jdbc:mysql://VTU-01:3306/test \
--username root \
--password sunstar \
-e "INSERT INTO emp VALUES(1207,'huanggai','user',15000)"