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
重命名:
   [[email protected] ~]$ 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中。

原文地址:http://blog.51cto.com/xpleaf/2090584

时间: 2024-10-10 00:58:27

Sqoop笔记整理的相关文章

Kafka笔记整理(一)

[TOC] Kafka笔记整理(一) Kafka简介 消息队列(Message Queue) 消息 Message 网络中的两台计算机或者两个通讯设备之间传递的数据.例如说:文本.音乐.视频等内容. 队列 Queue 一种特殊的线性表(数据元素首尾相接),特殊之处在于只允许在首部删除元素和在尾部追加元素.入队.出队. 消息队列 MQ 消息+队列,保存消息的队列.消息的传输过程中的容器:主要提供生产.消费接口供外部调用做数据的存储和获取. MQ分类 MQ主要分为两类:点对点(p2p).发布订阅(P

WPF笔记整理 - Bitmap和BitmapImage

项目中有图片处理的逻辑,因此要用到Bitmap.而WPF加载的一般都是BitmapImage.这里就需要将BitmapImage转成Bitmap 1. 图片的路径要用这样的,假设图片在project下的Images目录,文件名XXImage.png. pack://application:,,,/xxx;component/Images/XXImage.png 2. 代码: Bitmap bmp = null; var image = new BitmapImage(new Uri(this.X

WPF笔记整理--DataBinding(2)

图片绑定时的一个问题.场景如下: 有2个窗口A和B,A窗口的业务逻辑是编辑生成图片.然后从A窗口可以打开B窗口.B窗口是由A生成所有图片的列表.当在A窗口编辑生成图片并保存后打开B窗口就会看到刚刚生成的图片.关闭B窗口,可以在A窗口中继续编辑图片,再次保存图片并打开B窗口,就会看到最新的图片的变化.图片是保存在本地路径. 解决方案:定义一个Converter,将图片读到MemoryStream中,然后再Binding.代码如下: public object Convert(object valu

WPF笔记整理--DataBinding(1)

WPF的数据绑定是一大亮点.如果用WPF而不用数据绑定,那就太失败了. 也不多废话,如果不知道如何绑定,请百度一下.这里简单的提几点: 1. ObservableCollection可用于集合绑定,由于已经实现了INotifyPropertyChanged,可以通过添加删除集合中的元素来实现对UI列表项更新.注意,当一个ObservableCollection已经有元素,通过再次new集合并不能实现清空页面已显示的内容. 如果希望ObservableCollection中某列表项的属性值改变显示

Deep Learning(深度学习)学习笔记整理系列七

Deep Learning(深度学习)学习笔记整理系列 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除. 3)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢. 4)阅读本文需要机器学习.计算机视觉.神经网络等等基础(如果没有也没关系了,没

Deep Learning(深度学习)学习笔记整理系列之(五)

Deep Learning(深度学习)学习笔记整理系列 [email protected] http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04-08 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主

Deep Learning(深度学习)学习笔记整理系列之(三)

Deep Learning(深度学习)学习笔记整理系列 [email protected] http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04-08 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主

web开发框架Django笔记整理

安装 python  setup.py  install 使用 1.创建工程 django-admin.py startproject Data_Collet_Center 2.运行开发server python manage.pyrunserver 0.0.0.0:8000 3.创建应用 python manage.py startapp DCC 4.配置 Data_collect_Center/settings.py 配置DB: 'ENGINE': 'django.db.backends.s

Deep Learning(深度学习)学习笔记整理系列之(六)

Deep Learning(深度学习)学习笔记整理系列 [email protected] http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04-08 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主