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

浙公网安备 33010602011771号