内容纲要
- 安装sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
#下载 wget http://archive.apache.org/dist/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz #解压 tar -xvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz sqoop-1.4.7 #重命名 mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop-1.4.7 #配置环境变量 vim /etc/profile #添加配置 #sqoop1.4.7 export SQOOP_HOME=/usr/local/sqoop-1.4.7 export PATH=$PATH:$SQOOP_HOME/bin #复制mysql驱动 cp /usr/local/hive-3.1.2/lib/mysql-connector-java-8.0.25.jar /usr/local/sqoop-1.4.7/lib/ #查看是否安装成功 sqoop version
- sqoop从mysql导入数据
#导入语句,导入语句查看帮助用:sqoop help import sqoop import --connect jdbc:mysql://192.168.1.92:3306/test --username root --password 123456 --table magic_api_file -m 1 --fields-terminated-by '\t' #报错:sqoop Caused by: java.lang.ClassNotFoundException:org.apache.commons.lang.StringUtils #缺少org.apache.commons.lang 包,下载2.6版本,上传到/usr/local/sqoop-1.4.7/lib/ 目录下 #吐槽:明明lib下有org.apache.commons.lang3 的包却默认使用旧版本导致报错,或许是配置有误 #重新执行数据导入继续报错:java.lang.ClassNotFoundException: Class magic_api_file not found #原因是sqoop导入导出时会使用代码生成器创建对应表的实体类,默认存放于/tmp/sqoop-root/compile/随机字符串/ 目录下,用户必须将实体类的jar包上传到sqoop的lib目录下方可执行 #CDH环境下不需要此步骤,应该是配置上做了自动优化 #生成的magic_api_file.jar没有放入到sqoop环境变量下,从输出信息可以看到magic_api_file所在目录是:/tmp/sqoop-root/compile/48a6bac684a5542ce6bde8c6fb3642a5/magic_api_file.jar cp /tmp/sqoop-root/compile/48a6bac684a5542ce6bde8c6fb3642a5/magic_api_file.jar /usr/local/sqoop-1.4.7/ lib/ #到 /user/root/magic_api_file 目录下,但没有进hive #增加参数 --hive-import 导入hive中 sqoop import --connect jdbc:mysql://192.168.1.92:3306/test --hive-import --username root --password 123456 --table magic_api_file -m 1 --fields-terminated-by '\t' #第一步hdfs 导入成功,但导入hive时报错 #ERROR tool.ImportTool: Import failed: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf #这个是缺少hive-common包,在hive的lib目录下,拷贝到sqoop的lib目录下即可 cp /usr/local/hive-3.1.2/lib/hive-common-3.1.2.jar /usr/local/sqoop-1.4.7/lib/ #删掉刚才导入创建的/user/root/magic_api_file 没目录,重新导入即可 #sqoop导入hive的详细过程如下: #1.先导入到hdfs中:/user/root/magic_api_file; #2.再导入到hive中:/user/hive/warehouse/magic_api_file; #3.删除hdfs中的文件:/user/root/magic_api_file
- 查看hive中数据
#查看表结构 desc magic_api_file; #查看数据 select * from magic_api_file;
- sqoop导出数据到mysql
#导出数据到magic_api_file_copy1表 sqoop export --connect jdbc:mysql://192.168.1.92:3306/test --username root --password ****** --table magic_api_file_copy1 --export-dir '/user/hive/warehouse/magic_api_file' -m 1 --fields-terminated-by '\t' #报错java.lang.ClassNotFoundException: magic_api_file_copy1 #解决办法和导入时一样 #原因是sqoop导入导出时会使用代码生成器创建对应表的实体类,默认存放于/tmp/sqoop-root/compile/随机字符串/ 目录下,用户必须将实体类的jar包上传到sqoop的lib目录下方可执行 #CDH环境下不需要此步骤,应该是配置上做了自动优化 cp /tmp/sqoop-root/compile/245cd12abc0097f07e530a9076d9644e/magic_api_file_copy1.jar /usr/local/sqoop-1.4.7/lib/ #再次执行导出语句即可
5.sqoop从oracle导入数据
sqoop import \ --connect jdbc:oracle:thin:@192.168.2.194:1521:ORCL \ --username LYBUS --password ****** \ --table TM_USER_INFO \ -m 1 \ --fields-terminated-by "," \ --hive-database bus \ --hive-table tm_user_info \ --hive-import \ --hive-overwrite
6.sqoop其它命令
#修改目录权限 #增加其它用户写权限 hdfs dfs -chmod o+w /user/hive/warehouse #当操作hdfs文件遇到权限问题时可以考虑以下方法 #解决方法: #1.切换账号 ,执行命令: su hdfs; #2.重新执行import操作。 #3.建议导数据时都切换到hdfs用户来操作避免权限问题 su hdfs #另一种解法是给要访问的路径授权给root用户: hadoop fs -chown -R root /user/hive 其中root是被授权对象,/user/hive是root要访问的路径。
7.sqoop导入筛选数据
#全量导入数据 sqoop import \ --connect jdbc:oracle:thin:@192.168.2.194:1521:ORCL \ --username LYBUS --password ****** \ --table REC_VICECARD_CONSUME \ -m 1 \ --fields-terminated-by "\t" \ --hive-database bus \ --hive-table rec_electtron_consume \ --hive-import \ --hive-overwrite #导入筛选数据有2中方式 #1.使用where字句 sqoop import \ --connect jdbc:oracle:thin:@192.168.2.194:1521:ORCL \ --username LYBUS --password ****** \ --table REC_VICECARD_CONSUME \ --where "OPDT >= TO_DATE('2021-01-01', 'yyyy-MM-dd')" \ -m 1 \ --fields-terminated-by "\t" \ --hive-database bus \ --hive-table rec_vicecard_consume \ --hive-import \ --hive-overwrite #2.使用query子句,需要增加--target-dir选项(临时目录不能已存在) sqoop import \ --connect jdbc:oracle:thin:@192.168.2.194:1521:ORCL \ --username LYBUS --password ****** \ --query 'SELECT COUNT(0) from REC_VICECARD_CONSUME WHERE OPDT >= TO_DATE("2021-01-01", "yyyy-MM-dd")' \ -m 1 \ --fields-terminated-by "\t" \ --hive-database bus \ --hive-table rec_vicecard_consume \ --hive-import \ --target-dir /temp/rec_vicecard_consume \ --hive-overwrite