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

 

posted @ 2018-05-28 08:13  枫若雪  阅读(201)  评论(0编辑  收藏  举报