sqoop笔记整理(代码片段)

author author     2022-10-27     356

关键词:

[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中。

sqoop笔记(代码片段)

sqoophelpsqoop不支持动态分区mysql-uroot-p123456-e“showdatabases”;mysql-uroot-p123456</路径/test.sqltest.sql里面包含showdatabases1.查看可用的数据库(mysql)sqooplist-databases--helpsqooplist-databases[GENERIC-ARGS][TOOL-A 查看详情

数据集成工具的使用---sqoop从理论学习到熟练使用(代码片段)

本期与大家分享的是,小北精心整理的大数据学习笔记,数据采集工具Sqoop的详细介绍,希望对大家能有帮助,喜欢就给点鼓励吧,记得三连哦!欢迎各位大佬评论区指教讨论!💜🧡💛制... 查看详情

hive笔记整理(代码片段)

[TOC]Hive笔记整理(三)Hive的函数Hive函数分类函数的定义和java、mysql一样,有三种。UDF(UserDefinitionFunction用户定义函数)一路输入,一路输出sin(30°)=1/2UDAF(UserDefinitionAggregationFunction聚合函数)多路输入,一路输出maxmincountsumavg... 查看详情

hbase笔记整理(代码片段)

[TOC]HBase笔记整理(二)逻辑结构RowKey第一位ColumnFamilyColumnQuiauervalue(TimeStamps)Cell物理结构HMaster----->NameNode管理节点,用于管理HBase中的Table和Region的结构操作,比如用户增、删、修改表的操作。在HBase集群中,可以启动多个HMaster... 查看详情

笔记整理(代码片段)

1、Python基本语法1、@staticmethod和@classmethodPython中有三种方法,实例方法、类方法(@classmethod)、静态方法(@staticmethod)。类方法的第一个参数是cls,表示该类的一个实例,静态方法基本上和一个全局函数相同classA(object):deffoo(self,x):prin... 查看详情

整理笔记--位运算(代码片段)

1.获取int型最大值:intgetMaxInt()return(1<<31)-1;//2147483647,由于优先级关系,括号不可省略2.获得long类型最大值:longgetMaxLong()return((long)1<<127)-1;//9223372036854775807其他大同小异。3.除2运算:intdivTwo(intn)//负奇数的运算不可用 查看详情

hive笔记整理(代码片段)

[TOC]Hive笔记整理(二)Hive中表的分类managed_table—受控表、管理表、内部表表中的数据的生命周期/存在与否,受到了表结构的影响,当表结构被删除的,表中的数据随之一并被删除。默认创建的表就是这种表。可以在cli中通过des... 查看详情

kafka笔记整理(代码片段)

[TOC]Kafka笔记整理(一)Kafka简介消息队列(MessageQueue)消息Message网络中的两台计算机或者两个通讯设备之间传递的数据。例如说:文本、音乐、视频等内容。队列Queue一种特殊的线性表(数据元素首尾相接),特殊之处在于只允... 查看详情

hive笔记整理(代码片段)

[TOC]Hive笔记整理(一)HiveHive由facebook贡献给Apache,是一款建立在Hadoop之上的数据仓库的基础框架。数据仓库特点——关于存放在数据仓库中的数据的说明:是能够为企业的各个级别的决策提供数据支撑的数据其实说白了,就是... 查看详情

整理笔记--jquery(代码片段)

开发步骤:  1.导入jquery的文件  2.确定事件:文档加载事件,初始化页面,绑定事件  3.实现每个事件所触发的函数:      1.获取要操作的元素,或者响应的值      2.根据这些值,.或者元素的... 查看详情

树状数组笔记整理(代码片段)

树状数组介绍树状数组,顾名思义,就是树状的一维数组。二叉树同样也可以用一维数组存储。我们以二叉树进行类比。如图所示,图中节点的序号就是存在数组中的下标。记父节点序号为\\(p\\),子节点序号为\\(s\\)。则有:\\(p\\)\... 查看详情

整理笔记--javescript(代码片段)

WEB浏览器是从上到下加载资源的1.概念相关        1.js:基于对象和事件驱动的脚本语言        2.特点(交互性安全性【不准读取和操作硬盘的文件】跨平台性)   &... 查看详情

kafka笔记整理:消费形式验证与性能测试(代码片段)

[TOC]Kafka笔记整理(三):消费形式验证与性能测试Kafka消费形式验证前面的《Kafka笔记整理(一)》中有提到消费者的消费形式,说明如下:1、每个consumer属于一个consumergroup,可以指定组id。group.id2、消费形式:组内:组内的消... 查看详情

maven笔记整理(代码片段)

maven笔记粗整目录1.Maven介绍1.1.过去开发过程中的问题1.2.什么是Maven1.3.Maven解决的问题1.4.Maven的作用1.4.1.依赖管理1.4.2.一键构架1.5.Maven下载1.6.Maven工程的包的介绍1.7.Maven的使用2.maven的仓库介绍2.1.maven中导入坐标的方式2.2.仓库的分... 查看详情

hbase笔记整理(代码片段)

[TOC]HBase笔记整理(一)行列式数据库行式数据库:可以简单的理解为类似传统的rdbmspaint这些数据,存放的数据都是结构化的数据。行式数据库,是有利于全表数据的扫描,不利于只查询个别字段列式数据库:对行式数据库的一... 查看详情

前端笔记整理(css)(代码片段)

前端基础知识CSS3新特性定位常见类型`position:absolute`和`float`属性CSS盒模型`margin`塌陷浮动.clearfixBFC常见布局水平垂直居中flex布局flex属性flexitems属性两边宽度固定、中间栏自适应三栏布局怎么能让图文不可复制px... 查看详情

eigen库笔记整理(代码片段)

Eigen/Geometry模块提供了各种旋转和平移的表示旋转矩阵直接使用Matrix3d或Matrix3fEigen::Matrix3drotation_matrix=Eigen::Matrix3d::Identity();//初始化为一个单位阵。 旋转向量使用AngleAxisEigen::AngleAxisdrotation_vector(M_PI/4,Eigen::Vector3 查看详情

scala笔记整理:函数式编程(代码片段)

[TOC]作为值传递的函数测试代码如下:packagecn.xpleaf.bigdata.p4.function/***scala中关于函数的操作*/object_01FunctionOpsdefmain(args:Array[String]):Unit=functionOps1/***作为值传递的函数*将一个函数作为值传递给另外一个函数变量的时候,约定需要在... 查看详情