Sqoop

1.sqoop安装

cd /usr/local 
wget http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.6-cdh5.7.1.tar.gz 
tar -zxvf sqoop-1.4.6-cdh5.7.1.tar.gz 
ln -s sqoop-1.4.6-cdh5.7.1.tar.gz sqoop

2.配置以及缺包错误

cd sqoop/bin 
rm *.cmd 
cd ../conf 
cp sqoop-env-template.sh sqoop-env.sh 
cd $HADOOP_HOME 
pwd 
复制/usr/local/hadoop 
echo $HIVE_HOME 
复制/usr/local/hive 
vi sqoop-env.sh 
export HADOOP_COMMON_HOME=/usr/local/hadoop 
export HADOOP_MAPRED_HOME=/usr/local/hadoop 
export HIVE_HOME=/usr/local/hive 
echo ‘export SQOOP_HOME=/usr/local/sqoop’ >> /etc/profile 
echo ‘export PATH=$SQOOP_HOME/bin:$PATH'  >> /etc/profile
source /etc/profile

cd /usr/local/hive/lib
cp -av mysql-connector-java-5.1.45-bin.jar /usr/local/sqoop/lib/
# 我们在编译安装hive的时候就有一个mysql的连接jar包缺失的问题
# 此时SQOOP也会报这个错误,需要将对应的jar包cp到SQOOP的lib目录下
# 否则报错

Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObject
# 缺一个包
cd tmp
wget http://www.java2s.com/Code/JarDownload/java-json/java-json.jar.zip
cd /usr/local/sqoop/lib
unzip /tmp/java-json.jar.zip
mv java-json.jar /usr/local/sqoop/lib

3.帮助和list

sqoop help
# 查看帮助,命令语法格式为 usage: sqoop COMMAND [ARGS]
# 根据Available commands参数,进一步查看帮助,如:
sqoop help list-databases
sqoop help import

sqoop list-databases \
--connect jdbc:mysql://127.0.0.1:3306 \
--username root --password 123456
# 查看mysql库中的所有数据库

sqoop list-databases \
--connect jdbc:mysql://127.0.0.1:3306 \
--username root --password 123456
#查看所有数据库

sqoop list-tables \
--connect jdbc:mysql://127.0.0.1:3306/hadoop_hive \
--username root --password 123456
# 查看mysql某个库中的所有表

4.sqoop import

sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/mysql \
--username root --password 123456 \
--table user

# 当前系统用户是root,该表默认存放到了 /user/root/ 目录之下的 user目录
# user目录就是mysql库的user表名对应的目录
hdfs dfs -text /user/root/user/part-*
# 使用命令查看所有的分出来的 part文件,看到user表的所有信息
# 在敲 sqoop import 的对应路径下会生成一个user.java文件
# 通过网页也能查到 Name: user.jar 这个信息,即mapreduce的默认任务名
# 这是一个文本文件,内容是整个 sqoop import 行为的调用的所有源码操作
# 因为在SQOOP里面默认的map task是4,因此sqoop import 将user表拆成了四个文件

sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/mysql \
--username root --password 123456 \
--table user \
--mapreduce-job-name FromMySQL2HDFS \
--delete-target-dir \
--fields-terminated-by '\t' \
--num-mappers 2 \
--null-non-string 0 \
--columns "Host,User" \
--target-dir /user/hadoop/USER_COLUMN_SPLIT \
--where "Host='localhost'"
# 指定mapreduce任务名
# 删除HDFS上对应的目录(如果import前就存在的话)
# 指定列分隔符为tab

# 指定map task的数量,-m 是其缩写
--fields-terminated-by '\t' \
-m 2 --null-non-string 0 \
# 指定使用0代替列值null
# 指定只import库中mysql.user表中的相应列,列名大小写不敏感
# 指定存储到对应的HDFS目录路径中
hdfs dfs -ls /user/hadoop/USER_COLUMN_SPLIT
hdfs dfs -text /user/hadoop/USER_COLUMN_SPLIT/part*

sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/mysql \
--username root --password 123456 \
--mapreduce-job-name FromMySQL2HDFS \
--delete-target-dir \
--fields-terminated-by '\t' \
--num-mappers 2 \
--null-non-string 0 \
--target-dir /user/hadoop/USER_COLUMN_SPLIT \
--query "select Host,User from mysql.user where host='localhost' and \$CONDITIONS" \
--split-by 'host' \
--direct
# 使用SQL查询筛选数据,此时不能再有--table和--columns参数,防止冲突
# 参数 $CONDITIONS 必须出现在where条件中,因为是双引号,shell中$字符会尝试转义成变量,因此需要转义,如果是单引号括起来的SQL语句,则不需要转义:--query ‘select Host,User from mysql.user where host='localhost' and $CONDITIONS’ \
# 指定map task的数量不为1时(--num-mappers参数),会并行启动多个map task
# 如果表没有主键的时候,需要指定一个列作分割的依据,或者指定-m 1
#  --split-by 'host'就是指定host列作为分割的依据列
# 使用--direct进行优化,需要库版本支持,如mysql 5.0+、oracle 10.2.0+ 等
# 详细参见官方文档的7.2.6 Controlling the Import Process 相关解释


# 可以将以上命令参数放到一个文件中,然后使用sqoop命令调用:
vi /root/imp.txt
import
--connect
jdbc:mysql://127.0.0.1:3306/mysql
--username
root
--password
123456
--mapreduce-job-name
FromMySQL2HDFS
--delete-target-dir
--fields-terminated-by
\t
--num-mappers
2
--null-non-string
0
--target-dir
/user/hadoop/USER_COLUMN_SPLIT
--query
select Host,User from mysql.user where host='localhost' and $CONDITIONS
--split-by
'host'

--direct

sqoop --options-file /root/imp.txt
# 写一个命令参数文件,文件格式是一行命令一行参数
# 需要将SQL语句两边引起来的单引号和双引号去掉,一些需要引号引起来的参数也不在需要引号了
# 因为是写入文件之中的,脱离了shell直接执行的情况,$符号不需要转义了

5.sqoop eval

sqoop eval \
--connect jdbc:mysql://127.0.0.1:3306/mysql \
--username root --password 123456 \
--query "select Host,User from mysql.user where 1=1"
# 使用eval指定一个SQL查询,将查询的结果直接显示到控制台上
# 不再需要参数$CONDITIONS了

6.sqoop export

# 使用export导出HDFS中的表到mysql中,和import相类似
# 需要提前在mysql中创建能够存放导出数据的表,字段数量类型要一致
# 因为导入到hdfs中的表是mysql.user,因此创建表结构为:
echo "create table user_test as select Host,User from user where 1=2;"|mysql -uroot -p123456 -Dmysql
sqoop export \
--connect jdbc:mysql://127.0.0.1:3306/mysql \
--username root --password 123456 \
--table user_test \
--export-dir /user/hadoop/USER_COLUMN_SPLIT \
--input-fields-terminated-by '\t'
echo "select * from user_test;"|mysql -uroot -p123456 -Dmysql
# 需要指定HDFS导出的路径目录
# 需要指定该目录下文件中数据的列的分隔符

7.sqoop import/export hive table

sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/mysql \
--username root --password 123456 \
--table user \
--columns "Host,User" \
--mapreduce-job-name FromMySQL2HDFS \
--delete-target-dir \
--fields-terminated-by '\t' \
--num-mappers 2 \
--null-non-string 0 \
--target-dir /user/hadoop/USER_COLUMN_SPLIT \
--split-by 'host' \
--direct \
--hive-import \
--create-hive-table \
--hive-database prd \
--hive-table mysql_user \
--hive-overwrite
# 使用--hive-import标志导入到hive中
# 不建议使用--create-hive-table导入时创建表
#       应当提前创建表,对应的列类型以及外部表或者分区表等参数需要指定
# 是否使用参数 --hive-overwrite 需要考虑

echo "create table user_test2 as select Host,User from user where 1=2;"|mysql -uroot -p123456 -Dmysql
sqoop export \
--connect jdbc:mysql://127.0.0.1:3306/mysql \
--username root --password 123456 \
--table user_test2 \
--export-dir /user/hadoop/USER_COLUMN_SPLIT \
--input-fields-terminated-by '\t'
# 将hive的表导出到mysql中,和将hdfs的目录导出到mysql中是一样的
# 直接指定目录导出即可

8.sqoop job

sqoop job --create myjob \
-- import \
--connect jdbc:mysql://127.0.0.1:3306/mysql \
--username root \
--password 123456 \
--table user \
--mapreduce-job-name FromMySQL2HDFS \
--delete-target-dir \
--fields-terminated-by '\t' \
--num-mappers 2 \
--null-non-string 0 \
--columns "Host,User" \
--target-dir /user/hadoop/USER_COLUMN_SPLIT

sqoop job --list
sqoop job --show myjob
# 提示要输入密码,我们并没有设置密码
# 实际上这个是mysql的密码
# 因为我们只是查看,并不是要连接mysql做import操作
# 因此直接回车即可
echo '\n'|sqoop job --show myjob
# 既然需要一个回车,那就给他一个回车
sqoop job --exec myjob
# 此时需要交互的输入mysql对应用户的密码
# 也就是说--password参数没有生效
cd /usr/local/sqoop/conf/
vi sqoop-site.xml
# 在这里添加配置
 
    sqoop.metastore.client.record.password
    true
 


sqoop job --delete myjob
sqoop job --create myjob ...
# 对于已经存在的job需要重建,加上密码参数
sqoop job --show myjob
sqoop job --exec myjob
# 此时就不需要输入mysql的密码了

# 数据库的mysql.user是包含BLOB字段的,sqoop不能够直接支持BLOB类型的字段的导入导出
# 具体处理方法需要使用UDF进行转换

hdfs dfs -ls 和 hdfs dfs -ls / 是有区别的
当前系统用户为hadoop,那么 hdfs dfs -ls 是查看的相对路径,
实际上是/user/hadoop/目录下的内容
hdfs dfs -ls / 则是从根开始走

若泽大数据交流群:671914634

你可能感兴趣的:(Sqoop)