sqoop-shell java,Sqoop笔记整理

[toc]

Sqoop笔记整理

概述

SQOOP ---数据搬用工

可以将外部数据迁移到hdfs目录或者hive表或者hbase表

import原理

从传统数据库获取元数据信息(schema、table、field、field type),把导入功能转换为只有Map的Mapreduce作业,

在mapreduce中有很多map,每个map读一片数据,进而并行的完成数据的拷贝。

export原理

获取导出表的schema、meta信息,和Hadoop中的字段match;多个map only作业同时运行,完成hdfs中数据导出到关系型数据库中。

Sqoop安装

下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/sqoop/1.4.7/

下载之后进行解压:

tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /home/uplooking/app

重命名:

[uplooking@uplooking01 ~]$ mv app/sqoop-1.4.7.bin__hadoop-2.6.0/ app/sqoop

配置SQOOP_HOME到环境变量中

export SQOOP_HOME=/home/uplooking/app/sqoop

export PATH=$PATH:$SQOOP_HOME

配置$SQOOP_HOME/conf/sqoop-env.sh

export HADOOP_COMMON_HOME=/home/uplooking/app/hadoop

export HADOOP_MAPRED_HOME=/home/uplooking/app/hadoop

export HBASE_HOME=/home/uplooking/app/hbase

export HIVE_HOME=/home/uplooking/app/hive

export ZOOCFGDIR=/home/uplooking/app/zookeeper/conf

下面这个在1.4.7中需要配置,否则在执行数据导入到hive时会报错

export HIVE_CONF_DIR=/home/uplooking/app/hive/conf

注意:

1、数据库驱动:

在执行sqoop命里的受需要拷贝相关数据库驱动jar包到$SQOOP_HOME/lib目录下,例如mysql需要mysql-connector-java-5.1.32-bin.jar以上版本支持。

2、JDK版本

JDK版本最好1.7以上。

3、hive的核心包拷贝(这个在1.4.7中需要配置,否则在执行数据导入到hive时会报错)

将$HIVE_HOME/lib/hive-exec.jar拷贝到$SQOOP_HOME/lib目录下,不然会报

18/03/15 15:50:54 ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly.

18/03/15 15:50:54 ERROR tool.ImportTool: Import failed: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf

数据导入import

由mysql导入数据到HDFS

people表中的数据:

+----+-----------+------+--------+

| id | name | age | height |

+----+-----------+------+--------+

| 1 | 小甜甜 | 18 | 168 |

| 2 | 小丹丹 | 19 | 167 |

| 3 | 大神 | 25 | 181 |

| 4 | 团长 | 38 | 158 |

| 5 | 记者 | 22 | 169 |

+----+-----------+------+--------+

数据导入:

sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people

将msyql数据test中的表people,导入到hdfs目录,该目录在/user/用户/people下面,其中people为导入的表名,

这是sqoop导入到的默认目录,如果要想导入到指定的目录,添加一个选项--target-dir:

sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people --target-dir /output/sqoop/people

因为默认执行sqoop会有4个maptasks任务,为了满足业务的需要,可以进行修改,只需要在命令后面加一个选项-m:

sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people --target-dir /output/sqoop/people -m 2

执行的过程中,如果输出目录已经存在,报错,要想输出到该目录 使用选项--delete-target-dir:

sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people --target-dir /output/sqoop/people -m 2 --delete-target-dir

如果想在原来的基础之上追加新的数据,只需要添加一个选项--append,但是注意,--append和--delete-target-dir不能同时存在:

sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people --target-dir /output/sqoop/people -m 2 --append

条件导入:

sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --table people --target-dir hdfs://ns1/input/sqoop/people --append -m 1 --where "age < 20 and height > 167"

通过sql导入:

#!/bin/bash

SQOOP_HOME=/home/uplooking/app/sqoop

sqoop import \

--connect jdbc:mysql://192.168.43.116:3306/test \

--username root \

--password root \

--target-dir hdfs://ns1/input/sqoop/people \

--query "select id, name, age, height from people where age < 30 and height > 168 and \$CONDITIONS" \

--append -m 1 \

由mysql导入到hive

sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username 'root' --password 'root' --table people --hive-import -m 1

覆盖数据(只覆盖数据,不覆盖表结构)

sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username 'root' --password 'root' --table people --hive-import -m 1 --hive-overwrite

创建表名

sqoop import --connect jdbc:mysql://192.168.43.116:3306/test --username 'root' --password 'root' --table people --hive-import -m 1 --hive-table "hpeople" --hive-overwrite

导出所有的表到hive中

sqoop import-all-tables --connect jdbc:mysql://192.168.43.116:3306/test --username root --password root --hive-import --fields-terminated-by "\001" --lines-terminated-by "\n"

# 这里指定了行和列的分隔符,因为默认情况下,MySQL导入到hive的数据是以逗号作为分隔符的,

# 数据从hive(准确说应该是HDFS)导出到mysql时默认也是以逗号作为列分隔符的,这点尤其需要注意

由mysql导入到HBase

sqoop import \

--connect jdbc:mysql://192.168.43.116:3306/test \

--username 'root' \

--password 'root' \

--table people \

--hbase-create-table \

--hbase-row-key id \

--hbase-table hpeople \

--column-family cf

导入Hbase的时候,默认使用主键做key,没有主键使用--split-by,暂时处理不了联合主键,最好现在hbase中建立相关的表结构

查看HBase中表的数据:

hbase(main):002:0> scan 'hpeople'

ROW COLUMN+CELL

1 column=cf:age, timestamp=1521846328316, value=18

1 column=cf:height, timestamp=1521846328316, value=168.0

1 column=cf:name, timestamp=1521846328316, value=\xE5\xB0\x8F\xE7\x94\x9C\xE7\x94\x9C

2 column=cf:age, timestamp=1521846328096, value=19

2 column=cf:height, timestamp=1521846328096, value=167.0

2 column=cf:name, timestamp=1521846328096, value=\xE5\xB0\x8F\xE4\xB8\xB9\xE4\xB8\xB9

3 column=cf:age, timestamp=1521846329182, value=25

3 column=cf:height, timestamp=1521846329182, value=181.0

3 column=cf:name, timestamp=1521846329182, value=\xE5\xA4\xA7\xE7\xA5\x9E

4 column=cf:age, timestamp=1521846328454, value=38

4 column=cf:height, timestamp=1521846328454, value=158.0

4 column=cf:name, timestamp=1521846328454, value=\xE5\x9B\xA2\xE9\x95\xBF

5 column=cf:age, timestamp=1521846330135, value=22

5 column=cf:height, timestamp=1521846330135, value=169.0

5 column=cf:name, timestamp=1521846330135, value=\xE8\xAE\xB0\xE8\x80\x85

5 row(s) in 0.1620 seconds

数据导出export

数据导出到mysql,默认以逗号作为分隔符

从HDFS导出到mysql

导出的时候字段需要一一对应

sqoop export \

--connect jdbc:mysql://192.168.43.116:3306/test \

--username root --password root \

--table people \

--export-dir hdfs://ns1/input/sqoop/people

中文乱码:

sqoop export \

--connect "jdbc:mysql://192.168.43.116:3306/test?useUnicode=true&characterEncoding=utf-8" \

--username root \

--password root \

--table people \

--export-dir hdfs://ns1/input/sqoop/people

插入或更新

如果存在就更新,不存在就插入(指的是某一条记录,而不是表本身)

sqoop export

--connect "jdbc:mysql://192.168.43.116:3306/test?useUnicode=true&characterEncoding=utf-8" \

--username root \

--password root \

--table people

--export-dir /export -m 1 \

--update-key id \

--update-mode allowinsert

从Hive导出到mysql

和导入类似 -input-fields-terminated-by解析HDFS上面的数据到数据库时使用参数

sqoop export \

--connect jdbc:mysql://192.168.43.116:3306/test \

--username root \

--password root \

--table people \

--export-dir /user/hive/warehouse/hpeople

--input-fields-terminated-by '\001'

从HBase导出到mysql

目前没有直接从HBase导出的方法,但是可以先将数据导出到HDFS中(通过Hive和HBase的整合),然后再从HDFS导出到mysql中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值