sqoop笔记
sqoop 应该算是一个ETL工具,方便的数据导入导出功能。
# Sqoop 用来导出hive数据到mysql的工具 # 下载 sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz cd /usr/local/src # rz 上传到hadoop主机上 tar zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop-1.4.7 cd /usr/local/src/sqoop-1.4.7/conf cp sqoop-env-template.sh sqoop-env.sh vim sqoop-env.sh # 小技巧:光标在需要的地方,输入命令 :r!which hadoop 可以得到hadoop的路径,删除后面多余的即可。 export HADOOP_COMMON_HOME=/usr/local/src/hadoop-2.7.5 export HADOOP_MAPRED_HOME=/usr/local/src/hadoop-2.7.5 export HIVE_HOME=/usr/local/src/hive2.3.2 # 保存退出 ### 加入jdbc驱动 for mysql 可以从hive中复制一个过来。 cd /usr/local/src/hive2.3.2/lib cp mysql-connector-java-5.1.46.jar ../../sqoop-1.4.7/lib/ #----------------如果忘记了mysql密码,无法登录。可以先停止服务, #----------------然后以命令启动 mysqld_safe --skip-grant-tables & #----------------则可以跳过密码。 ## 查看支持的命令:cd /usr/local/src/sqoop-1.4.7/bin ll total 88 -rwxr-xr-x 1 1000 1000 6770 Dec 19 07:00 configure-sqoop -rwxr-xr-x 1 1000 1000 6533 Dec 19 07:00 configure-sqoop.cmd -rwxr-xr-x 1 1000 1000 3133 Dec 19 07:00 sqoop -rwxr-xr-x 1 1000 1000 1055 Dec 19 07:00 sqoop.cmd -rwxr-xr-x 1 1000 1000 3060 Dec 19 07:00 sqoop-codegen -rwxr-xr-x 1 1000 1000 3070 Dec 19 07:00 sqoop-create-hive-table -rwxr-xr-x 1 1000 1000 3057 Dec 19 07:00 sqoop-eval -rwxr-xr-x 1 1000 1000 3059 Dec 19 07:00 sqoop-export -rwxr-xr-x 1 1000 1000 3057 Dec 19 07:00 sqoop-help -rwxr-xr-x 1 1000 1000 3059 Dec 19 07:00 sqoop-import -rwxr-xr-x 1 1000 1000 3070 Dec 19 07:00 sqoop-import-all-tables -rwxr-xr-x 1 1000 1000 3069 Dec 19 07:00 sqoop-import-mainframe -rwxr-xr-x 1 1000 1000 3056 Dec 19 07:00 sqoop-job -rwxr-xr-x 1 1000 1000 3067 Dec 19 07:00 sqoop-list-databases -rwxr-xr-x 1 1000 1000 3064 Dec 19 07:00 sqoop-list-tables -rwxr-xr-x 1 1000 1000 3058 Dec 19 07:00 sqoop-merge -rwxr-xr-x 1 1000 1000 3062 Dec 19 07:00 sqoop-metastore -rwxr-xr-x 1 1000 1000 3060 Dec 19 07:00 sqoop-version -rwxr-xr-x 1 1000 1000 3987 Dec 19 07:00 start-metastore.sh -rwxr-xr-x 1 1000 1000 1564 Dec 19 07:00 stop-metastore.sh ## 查看一下用法 ./sqoop-list-databases --help # 查看目标mysql库 ./sqoop-list-databases --connect jdbc:mysql://slave3 --username root --password 123456 # 查看目标mysql中某个表 ./sqoop-list-tables --connect jdbc:mysql://localhost/hive --username root --password 123456 #------------------------以上命令执行成功,表示sqoop安装成功------------------------- #------------------------------mysql to HDFS 示例------------------------------------ ./sqoop import \ --connect jdbc:mysql://slave3/test \ --username root \ --password 123456 \ --target-dir /sqooptest \ --fields-terminated-by ',' \ --table jos_jf_content \ --split-by id \ --m 2 ' # 以下是注释: # !!!! 一定要注意每行末尾的斜线后面不能再有空格或字符 --connect jdbc:mysql://slave3/test # 源库 --target-dir /sqooptest # 目标文件夹 --fields-terminated-by ',' # 字段分隔符 --table jos_jf_content # 源表 --split-by id # 分片字段 --m 2 # 分几片, 即maptask个数 ' ## 等待MR执行完成. sqoop的导入数据是没有reduce阶段的。 # 如果出现了找不到jar包的错误,则检查hadoop中的 mapred-site.xml # 是否缺少以下配置: <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> #------------------------------mysql to Hive 示例------------------------------------ ./sqoop import \ --connect jdbc:mysql://slave3/test \ --username root \ --password 123456 \ --fields-terminated-by ',' \ --table banner \ --hive-import \ --m 1 # 同上面的HDFS语句差不多,加上 --hive-import 去掉 --target-dir # 完成后进入hive的default库查看。 # 1. 如果出现错误:FileAlreadyExistsException: Output directory hdfs://xxxx/user/root/jos_banner already exists # 则执行hdfs dfs -rm -r /user/root/jos_banner 删除即可。 # 2. 如果出现错误:Could not load org.apache.hadoop.hive.conf.HiveConf.Make sure HIVE_CONF_DIR # 则在当前用户执行: vim ~/.bash_profile 加入 export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/usr/local/src/hive2.3.2/lib/* # 再 source ~/.bash_profile 目的也就是加入了hive所在目录所有的库文件路径 # 3. 错误ERROR Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTrustPermission" "register") # 则执行:vim $JAVA_HOME/jre/lib/security/java.policy 增加一行 permission javax.management.MBeanTrustPermission "register"; # 4. 错误ERROR exec.DDLTask: java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.ObjectMapper.readerFor(Ljava/lang/Class;)... # 则可能是jackson版本的不兼容。将$SQOOP_HOME/lib/jackson*.jar 文件bak,再把$HIVE_HOME/lib/jackson*.jar 拷贝至 $SQOOP_HOME/lib 目录中 #------------------------------导入时按条件------------------------------------ sqoop import \ --connect jdbc:mysql://slave3/test \ --username root \ --password 123456 \ --where "clicks='1'" \ --fields-terminated-by ',' \ --table banner \ --hive-import \ --m 1 #------------------------------按需导入 ------------------------------------ sqoop import \ --connect jdbc:mysql://slave3/test \ --username root \ --password 123456 \ --query 'SELECT id,type,name,clickurl,date FROM `banner` where id >5 and $CONDITIONS' \ --fields-terminated-by '\t' \ --target-dir /banner \ --hive-table banner \ --hive-import \ --m 1 #------------------------------增量 导入 ------------------------------------ sqoop import \ --connect jdbc:mysql://slave3/test \ --username root \ --password 123456 \ --fields-terminated-by '\t' \ --table banner \ --hive-import \ --m 1 --incremental append \ --check-column id \ --last-value 8 ############################################### 导出到mysql############## #--------------hdfs to mysql 需要提前在mysql中创建要接收数据的表。--------- #--------------characterEncoding=utf-8 是为了支持中文-------------------- sqoop export \ --connect "jdbc:mysql://slave3/test?useUnicode=true&characterEncoding=utf-8" \ --username root \ --password 123456 \ --input-fields-terminated-by ',' \ --table users \ --export-dir /data/stu_ext \ --m 1 #--------------Hive to mysql 需要提前在mysql中创建要接收数据的表。--------- sqoop export \ --connect "jdbc:mysql://slave3/test?useUnicode=true&characterEncoding=utf-8" \ --username root \ --password 123456 \ --input-fields-terminated-by ',' \ --table student \ --export-dir /user/hive/warehouse/test.db/student/ \ --m 1