安装sqoop

内容纲要
  1. 安装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
  2. 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
  3. 查看hive中数据
    #查看表结构
    desc magic_api_file;
    #查看数据
    select * from magic_api_file;
  4. 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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注