Sqoop Flume
准备实验的环境:准备Oracle数据库
1、实验:前面的实验:Oracle闪回(回收站)
2、自带用户:sh/sh ---> 表:sales订单表(大概92万条数据)
3、实验环境
(*)Oracle版本:10g企业版
(*)操作系统:Windows XP
4、安装虚拟机:选XP、关闭防火墙
数据采集的引擎:Sqoop: 采集关系型数据库
Flume: 采集日志
都是基于MR进行数据采集
二、Sqoop
1、数据交换引擎: RDBMS <----> Sqoop <----> HDFS(HBase、Hive)
2、基于MapReduce的,本质是执行MapReduce程序
3、基于JDBC的方式: 将Oracle的驱动放到lib目录下
Could not load db driver class: oracle.jdbc.OracleDriver
4、安装配置
tar -zxvf sqoop-1.4.5.bin__hadoop-0.23.tar.gz -C ~/training/
配置环境变量
export SQOOP_HOME=/root/training/sqoop-1.4.5.bin__hadoop-0.23
export PATH=$PATH:$SQOOP_HOME/bin:$PATH
5、sqoop的命令
一定注意:对于Oracle数据库来说,用户名、表名、列名 ------> 一定大写
对于MySQL数据库无所谓
sqoop codegen --help
(*)codegen Generate code to interact with database records
根据表结构自动生成对应的Java程序: 生成员工表的Java类
sqoop codegen --connect jdbc:oracle:thin:@192.168.157.138:1521/orcl --username SCOTT --password tiger --table EMP --outdir /root/temp
(*)create-hive-table Import a table definition into Hive
根据表结构去创建Hive的表结构
(*)eval Evaluate a SQL statement and display the results
在Sqoop中执行SQL
sqoop eval --connect jdbc:oracle:thin:@192.168.157.138:1521/orcl --username SCOTT --password tiger --query 'select * from emp'
(*)export Export an HDFS directory to a database table
注意:Oracle数据库中表必须事先存在
(*)help List available commands
帮助
(*)import Import a table from a database to HDFS
从关系型数据库中导入数据
(1) 导入Oracle Scott下EMP表的所有数据
sqoop import --connect jdbc:oracle:thin:@192.168.157.138:1521/orcl --username SCOTT --password tiger --table EMP --target-dir /sqoop/import/emp1
(2) 导入指定的列
sqoop import --connect jdbc:oracle:thin:@192.168.157.138:1521/orcl --username SCOTT
--password tiger --table EMP --columns ENAME,SAL --target-dir /sqoop/import/emp2
(3) 导入订单表:92万条数据
sqoop import --connect jdbc:oracle:thin:@192.168.157.138:1521/orcl --username SH --password sh --table SALES --target-dir /sqoop/import/sales -m 1
错误:
Error during import: No primary key could be found for table SALES. Please specify one with --split-by or perform a sequential import with '-m 1'.
(*)import-all-tables Import tables from a database to HDFS
导入某个用户下所有的表: 默认的路径:/user/root
sqoop import-all-tables --connect jdbc:oracle:thin:@192.168.157.138:1521/orcl --username SCOTT --password tiger
(*)list-databases List available databases on a server
(*) MySQL: 所有数据库的名字
(*) Oracle: 该数据库中所有用户的名字
sqoop list-databases --connect jdbc:oracle:thin:@192.168.157.138:1521/orcl --username SYSTEM --password password
(*)list-tables List available tables in a database
(*) 列出某个用户下的表
(*)merge Merge results of incremental imports(增量)
(*)version Display version information
(*) 列出Sqoop的版本
使用Sqoop从MySQL导入数据到Hive和HBase
基础环境
sqoop:sqoop-1.4.5+cdh5.3.6+78,hive:hive-0.13.1+cdh5.3.6+397,hbase:hbase-0.98.6+cdh5.3.6+115
Sqool和Hive、HBase简介
Sqoop
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的开源工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
Hive
不想用程序语言开发MapReduce的朋友比如DB们,熟悉SQL的朋友可以使用Hive开离线的进行数据处理与分析工作。
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。
注意Hive现在适合在离线下进行数据的操作,就是说不适合在挂在真实的生产环境中进行实时的在线查询或操作,因为一个字“慢”。
Hive起源于FaceBook,在Hadoop中扮演数据仓库的角色。建立在Hadoop集群的最顶层,对存储在Hadoop群上的数据提供类SQL的接口进行操作。你可以用 HiveQL进行select、join,等等操作。
如果你有数据仓库的需求并且你擅长写SQL并且不想写MapReduce jobs就可以用Hive代替。
Hive的内置数据类型可以分为两大类:(1)、基础数据类型;(2)、复杂数据类型。其中,基础数据类型包括:TINYINT、SMALLINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING、BINARY、TIMESTAMP、DECIMAL、CHAR、VARCHAR、DATE。
下面的表格列出这些基础类型所占的字节以及从什么版本开始支持这些类型。
数据类型 | 所占字节 | 开始支持版本 |
TINYINT | 1byte: -128 ~ 127 | |
SMALLINT | 2byte:-32,768 ~ 32,767 | |
INT | 4byte:-2,147,483,648 ~ 2,147,483,647 | |
BIGINT | 8byte:-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | |
BOOLEAN | ||
FLOAT | 4byte单精度 | |
DOUBLE | 8byte双精度 | |
STRING | ||
BINARY | 从Hive0.8.0开始支持 | |
TIMESTAMP | 从Hive0.8.0开始支持 | |
DECIMAL | 从Hive0.11.0开始支持 | |
CHAR | 从Hive0.13.0开始支持 | |
VARCHAR | 从Hive0.12.0开始支持 | |
DATE | 从Hive0.12.0开始支持 |
复杂类型包括ARRAY、MAP、STRUCT、UNION,这些复杂类型是由基础类型组成的。
HBase
HBase作为面向列的数据库运行在HDFS之上,HDFS缺乏随即读写操作,HBase正是为此而出现。HBase以Google BigTable为蓝本,以键值对的形式存储。项目的目标就是快速在主机内数十亿行数据中定位所需的数据并访问它。
HBase是一个数据库,一个NoSql的数据库,像其他数据库一样提供随即读写功能,Hadoop不能满足实时需要,HBase正可以满足。如果你需要实时访问一些数据,就把它存入HBase。
你可以用Hive作为静态数据仓库,HBase作为数据存储,放那些进行一些会改变的数据。在Hive中,普通表是存储在HDFS中,而你可以通过创建EXTERNAL TABLE外表来指定数据存储位置,可以是系统目录,也可以是ElasticSearch,还可以是HBase。
在使用Sqoop从Mysql导出数据入Hadoop时,就需要考虑是直接入Hive(此时是普通表),还是导入数据到HBase,Sqoop同时支持导入这两种导入。
报错:
java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@1817d444 is still active. No statements may be issued when any streaming result sets are open and in use on a given connection. Ensure that you have called .close() on any active streaming result sets before attempting more queries.
解决方法 : 由于之前上传到Sqoop lib下的MySQL驱动程序有些低,
更新到mysql-connector-java-5.1.32-bin.jar即可,下载路径
https://download.csdn.net/download/qq_16633405/10028793
测试Sqoop
#测试MySQL连接
sqoop list-databases --connect jdbc:mysql://192.168.180.11 --username anqi --password
#检验SQL语句
sqoop eval --connect jdbc:mysql://192.168.180.11/angel \
--username anqi --password anqi_mima --query "SELECT xi.*, jing.name,wang.latitude,wang.longitude FROM xi ,jing, wang WHERE xi.id=jing.foreignId AND wang.id=xi.id AND xi.date>='2015-09-01' AND xi.date<='2015-10-01'"
sqoop list-tables --connect jdbc:mysql://39.108.176.111:3366/userdb02 --username root –password 12345
sqoop eval --connect jdbc:mysql://39.108.176.111:3366/userdb02 --username root --password 12345 --query "select * from member"
sqoop create-hive-table --connect jdbc:mysql://39.108.176.111:3366/userdb02 --table member --username root --password 123456 --hive-table hivemember
sqoop import --connect jdbc:mysql://39.108.176.111:3366/userdb02 --username root --password 12345 --table member --hive-import --hive-table hivemember --m 1
sqoop import-all-tables --connect jdbc:mysql://39.108.176.111:3366/userdb02 --username root --password 12345 --as-textfile --warehouse-dir /root
sqoop命令举例
1)列出mysql数据库中的所有数据库
sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password 123456
2)连接mysql并列出test数据库中的表
sqoop list-tables --connect jdbc:mysql://localhost:3306/test --username root --password 123456
命令中的test为mysql数据库中的test数据库名称 username password分别为mysql数据库的用户密码
3)将关系型数据的表结构复制到hive中,只是复制表的结构,表中的内容没有复制过去。
sqoop create-hive-table --connect jdbc:mysql://localhost:3306/test
--table sqoop_test --username root --password 123456 --hive-table
test
其中 --table sqoop_test为mysql中的数据库test中的表 --hive-table
test 为hive中新建的表名称
4)从关系数据库导入文件到hive中
sqoop import --connect jdbc:mysql://localhost:3306/zxtest --username
root --password 123456 --table sqoop_test --hive-import --hive-table
s_test -m 1
5)将hive中的表数据导入到mysql中,在进行导入之前,mysql中的表
hive_test必须已经提起创建好了。
sqoop export --connect jdbc:mysql://localhost:3306/zxtest --username
root --password root --table hive_test --export-dir
/user/hive/warehouse/new_test_partition/dt=2012-03-05
6)从数据库导出表的数据到HDFS上文件
sqoop import --connect
jdbc:mysql://10.28.168.109:3306/compression --username=hadoop
--password=123456 --table HADOOP_USER_INFO -m 1 --target-dir
/user/test
7)从数据库增量导入表数据到hdfs中
./sqoop import –connect jdbc:mysql://10.28.168.109:3306/compression
–username=hadoop –password=123456 –table HADOOP_USER_INFO -m 1
–target-dir /user/test –check-column id –incremental append
–last-value 3
8)将数据导入 HBase(需要事先将表创建)
sqoop import --connect jdbc:oracle:thin:@192.168.137.129:1521:orcl --username SCOTT
--password tiger --table EMP --columns empno,ename,sal,deptno --hbase-table emp
--hbase-row-key empno --column-family empinfo
五 Sqoop原理(以import为例)
Sqoop在import时,需要制定split-by参数。Sqoop根据不同的split-by参数值来进行切分,然后将切分出来的区域分配到不同map中。每个map中再处理数据库中获取的一行一行的值,写入到HDFS中。同时split-by根据不同的参数类型有不同的切分方法,
如比较简单的int型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来确定划分几个区域。 比如select max(split_by),min(split-by) from得到的max(split-by)和min(split-by)分别为1000和1,而num-mappers为2的话,则会分成两个区域(1,500)和(501-100),同时也会分成2个sql给2个map去进行导入操作,分别为select XXX from table where split-by>=1 and split-by<500和select XXX from table where split-by>=501 and split-by<=1000。最后每个map各自获取各自SQL中的数据进行导入工作。
(*)讲义上:导入数据到HBase中 参考P71
conn sh/sh
select * from sales;
sqoop codegen --help
命令执行后 ,生成 EMP.java
三、Flume: 采集日志: 各种日志 ----> Flume ----> HDFS(HBase,Hive)
1、体系结构
2、Demo
source组件 channel组件 sink组件
自己定义组件 customer
(二)Flume的体系结构
(三)安装和配置 Flume
1、解压
2、修改 conf/flume-env.sh 设置 JAVA_HOME 即可
(四)使用 Flume采集日志数据
案例一:
#bin/flume-ng agent -n a1 -f myagent/a1.conf -c conf -Dflume.root.logger=INFO,console
#定义 agent名, source、channel、sink 的名称
a1.sources = r1
a1.channels = c1
a1.sinks = k1
#具体定义 source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 8888
#具体定义 channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
#具体定义 sink
a1.sinks.k1.type = logger #只是打印在屏幕上
#组装 source、channel、sink
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
案例二:
#bin/flume-ng agent -n a2 -f myagent/a2.conf -c conf -Dflume.root.logger=INFO,console
#定义 agent名, source、channel、sink 的名称
a2.sources = r1
a2.channels = c1
a2.sinks = k1
#具体定义 source
a2.sources.r1.type = exec #指的是可执行的命令
a2.sources.r1.command = tail -f /home/hadoop/a.log
#具体定义 channel
a2.channels.c1.type = memory
a2.channels.c1.capacity = 1000
a2.channels.c1.transactionCapacity = 100
#具体定义 sink
a2.sinks.k1.type = logger
#组装 source、channel、sink
a2.sources.r1.channels = c1
a2.sinks.k1.channel = c1
案例三:
#bin/flume-ng agent -n a3 -f myagent/a3.conf -c conf -Dflume.root.logger=INFO,console
#定义 agent名, source、channel、sink 的名称
a3.sources = r1
a3.channels = c1
a3.sinks = k1
#具体定义 source
a3.sources.r1.type = spooldir
a3.sources.r1.spoolDir = /root/training/logs1
#具体定义 channel
a3.channels.c1.type = memory
a3.channels.c1.capacity = 1000
a3.channels.c1.transactionCapacity = 100
#具体定义 sink
a3.sinks.k1.type = logger #直接打印到屏幕上
#组装 source、channel、sink
a3.sources.r1.channels = c1
a3.sinks.k1.channel = c1
案例四:(-n 表示名称 a4.conf -f 指定目录 当前myagent/a4.conf -c 即是-config 当前的conf 文件夹 )
#bin/flume-ng agent -n a4 -f myagent/a4.conf -c conf -Dflume.root.logger=INFO,console
#定义 agent名, source、channel、sink 的名称
a4.sources = r1
a4.channels = c1
a4.sinks = k1
#具体定义 source
a4.sources.r1.type = spooldir
a4.sources.r1.spoolDir = /root/training/logs
#具体定义 channel
a4.channels.c1.type = memory
a4.channels.c1.capacity = 10000
a4.channels.c1.transactionCapacity = 100
#定义拦截器,为消息添加时间戳
a4.sources.r1.interceptors = i1
a4.sources.r1.interceptors.i1.type =
org.apache.flume.interceptor.TimestampInterceptor$Builder
#具体定义 sink
a4.sinks.k1.type = hdfs
a4.sinks.k1.hdfs.path = hdfs://192.168.56.111:9000/flume/%Y%m%d
a4.sinks.k1.hdfs.filePrefix = events-
a4.sinks.k1.hdfs.fileType = DataStream
#不按照条数生成文件
a4.sinks.k1.hdfs.rollCount = 0
#HDFS 上的文件达到 128M 时生成一个文件
a4.sinks.k1.hdfs.rollSize = 134217728
#HDFS 上的文件达到 60 秒生成一个文件
a4.sinks.k1.hdfs.rollInterval = 60
#组装 source、channel、sink
a4.sources.r1.channels = c1
a4.sinks.k1.channel = c1
采集后的临时文件,要么达到180M 要么过了60秒
#bin/flume-ng agent -n a4 -f myagent/a4.conf -c conf -Dflume.root.logger=INFO,console
#定义agent名, source、channel、sink的名称
a4.sources = r1
a4.channels = c1
a4.sinks = k1
#具体定义source
a4.sources.r1.type = spooldir
a4.sources.r1.spoolDir = /root/temp/mylogs
#具体定义channel
a4.channels.c1.type = memory
a4.channels.c1.capacity = 10000
a4.channels.c1.transactionCapacity = 100
#定义拦截器,为消息添加时间戳
a4.sources.r1.interceptors = i1
a4.sources.r1.interceptors.i1.type = org.apache.flume.interceptor.TimestampInterceptor$Builder
#具体定义sink
a4.sinks.k1.type = hdfs
a4.sinks.k1.hdfs.path = hdfs://192.168.157.111:9000/flume/%Y%m%d
a4.sinks.k1.hdfs.filePrefix = events-
a4.sinks.k1.hdfs.fileType = DataStream
#不按照条数生成文件
a4.sinks.k1.hdfs.rollCount = 0
#HDFS上的文件达到128M时生成一个文件
a4.sinks.k1.hdfs.rollSize = 134217728
#HDFS上的文件达到60秒生成一个文件
a4.sinks.k1.hdfs.rollInterval = 60
#组装source、channel、sink
a4.sources.r1.channels = c1
a4.sinks.k1.channel = c1
了解:采集数据(RDBMS和日志) ------> kettle
Kettle简介:Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,数据抽取高效稳定。Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。Kettle这个ETL工具集,它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述你想做什么,而不是你想怎么做。Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。(引用百度百科)
1、Kettle的下载与安装(在本文中使用的kettle版本为6.1.0.1-196)
kettle的最新下载地址:http://community.pentaho.com/projects/data-integration/
2、打开kettle。
首先解压下载下来的压缩包如:pdi-ce-6.1.0.1-196.zip
然后打开Spoon.bat,如图所示:
打开后请耐心等待一会儿时间。
3、建立转换。
在文件->新建装换。
新建转换后在左边的主对象树中建立DB连接用以连接数据库。如图所示:
建立数据库连接的过程与其他数据库管理软件连接数据库类似。
四、ZooKeeper ----> 实现Hadoop的HA(高可用性)
1 .背景
flume是由cloudera软件公司产出的可分布式日志收集系统,后与2009年被捐赠了apache软件基金会,为hadoop相关组件之一。尤其近几年随着flume的不断被完善以及升级版本的逐一推出,特别是flume-ng;同时flume内部的各种组件不断丰富,用户在开发的过程中使用的便利性得到很大的改善,现已成为apache top项目之一.
2 .概述
1. 什么是flume?
apache Flume 是一个从可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来存储的工具/服务,或者数集中机制。flume具有高可用,分布式,配置工具,其设计的原理也是基于将数据流,如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。其结构如下图所示:
2.应用场景
比如我们在做一个电子商务网站,然后我们想从消费用户中访问点特定的节点区域来分析消费者的行为或者购买意图. 这样我们就可以更加快速的将他想要的推送到界面上,实现这一点,我们需要将获取到的她访问的页面以及点击的产品数据等日志数据信息收集并移交给Hadoop平台上去分析.而Flume正是帮我们做到这一点。现在流行的内容推送,比如广告定点投放以及新闻私人定制也是基于次,不过不一定是使用FLume,毕竟优秀的产品很多,比如facebook的Scribe,还有Apache新出的另一个明星项目chukwa,还有淘宝Time Tunnel。
3.Flume的优势
1. Flume可以将应用产生的数据存储到任何集中存储器中,比如HDFS,HBase
2. 当收集数据的速度超过将写入数据的时候,也就是当收集信息遇到峰值时,这时候收集的信息非常大,甚至超过了系统的写入数据能力,这时候,Flume会在数据生产者和数据收容器间做出调整,保证其能够在两者之间提供一共平稳的数据.
3. 提供上下文路由特征
4. Flume的管道是基于事务,保证了数据在传送和接收时的一致性.
5. Flume是可靠的,容错性高的,可升级的,易管理的,并且可定制的。
4. Flume具有的特征:
1. Flume可以高效率的将多个网站服务器中收集的日志信息存入HDFS/HBase中
2. 使用Flume,我们可以将从多个服务器中获取的数据迅速的移交给Hadoop中
3. 除了日志信息,Flume同时也可以用来接入收集规模宏大的社交网络节点事件数据,比如facebook,twitter,电商网站如亚马逊,flipkart等
4. 支持各种接入资源数据的类型以及接出数据类型
5. 支持多路径流量,多管道接入流量,多管道接出流量,上下文路由等
6. 可以被水平扩展
3. Flume的结构
1. flume的外部结构:
如上图所示,数据发生器(如:facebook,twitter)产生的数据被被单个的运行在数据发生器所在服务器上的agent所收集,之后数据收容器从各个agent上汇集数据并将采集到的数据存入到HDFS或者HBase中
2. Flume 事件
事件作为Flume内部数据传输的最基本单元.它是由一个转载数据的字节数组(该数据组是从数据源接入点传入,并传输给传输器,也就是HDFS/HBase)和一个可选头部构成.
典型的Flume 事件如下面结构所示:
我们在将event在私人定制插件时比如:flume-hbase-sink插件是,获取的就是event然后对其解析,并依据情况做过滤等,然后在传输给HBase或者HDFS.
3.Flume Agent
我们在了解了Flume的外部结构之后,知道了Flume内部有一个或者多个Agent,然而对于每一个Agent来说,它就是一共独立的守护进程(JVM),它从客户端哪儿接收收集,或者从其他的 Agent哪儿接收,然后迅速的将获取的数据传给下一个目的节点sink,或者agent. 如下图所示flume的基本模型
Agent主要由:source,channel,sink三个组件组成.
Source:
从数据发生器接收数据,并将接收的数据以Flume的event格式传递给一个或者多个通道channal,Flume提供多种数据接收的方式,比如Avro,Thrift,twitter1%等
Channel:
channal是一种短暂的存储容器,它将从source处接收到的event格式的数据缓存起来,直到它们被sinks消费掉,它在source和sink间起着一共桥梁的作用,channal是一个完整的事务,这一点保证了数据在收发的时候的一致性. 并且它可以和任意数量的source和sink链接. 支持的类型有: JDBC channel , File System channel , Memort channel等.
sink:
sink将数据存储到集中存储器比如Hbase和HDFS,它从channals消费数据(events)并将其传递给目标地. 目标地可能是另一个sink,也可能HDFS,HBase.
它的组合形式举例:
以上介绍的flume的主要组件,下面介绍一下Flume插件:
1. Interceptors拦截器
用于source和channel之间,用来更改或者检查Flume的events数据
2. 管道选择器 channels Selectors
在多管道是被用来选择使用那一条管道来传递数据(events). 管道选择器又分为如下两种:
默认管道选择器: 每一个管道传递的都是相同的events
多路复用通道选择器: 依据每一个event的头部header的地址选择管道.
3.sink线程
用于激活被选择的sinks群中特定的sink,用于负载均衡.