当前位置:文档之家› 细细品味Hadoop_Hadoop集群(第14期)_Hive应用开发

细细品味Hadoop_Hadoop集群(第14期)_Hive应用开发

细细品味Hadoop_Hadoop集群(第14期)_Hive应用开发
细细品味Hadoop_Hadoop集群(第14期)_Hive应用开发

Hive日志分析的大数据存储优化探讨

Hive日志分析的大数据存储优化探讨 摘要信息化发展水平的提升,使数据成为现代生产生活中不可或缺的关键要素,但社会中很多生产领域产生的数据量都较大,如何实现可用信息转化是当前数据利用与研究的关键问题。文章基于Hive日志分析,对优化大数据的存储进行了探究,希望能够提高Hive日志信息查询效率,优化其整体功能,从而在实际应用中发挥更大的作用。 关键词Hive日志;大数据存储;存储优化 信息数据是当前社会发展领域的重要基础,一切生产与发展活动都要将信息数据作为依据与支持,而信息中数据内含量大,还存在隐含信息数据,对信息数据的充分挖掘与利用,能够有开发出信息数据的更多价值。当前信息技术对数据的开发与利用水平有了提升,但对于很多大数据的存储仍是难题,为此,对Hive 日志分析的大数据存储优化探讨对我国调整存储结构,提高大数据读写效率有着重要意义。 1 基于Hive优化大数据存储策略简述 Hive是隶属于Hadoop的数据仓库工具,其主要发挥的作用是利用HFDS进行大数据存储,然后根据用户的实际要求映射数据,成为数据表;另外,利用其自带的数据查询功能能够快速的为用户提供数据信息,并通过查询内容提交到计算程序中完成用户布置的任务,这项功能也是Hive日志的优势体现,利用这项功能能够快速进行数据信息查询、信息数据分析。所以,在Hive日志的基础特性上展开数据存储优化探究,应重视对日志分析方法的利用,具体的优化可以并从以下几个方面着手:一是,对日志中常用的功能以及查询服务进行全面的分析,也就是通过对用户使用习惯的数据统计,明确用户常用的功能,然后合理分化数据结构,为用户提供更为便利的服务[1]。二是,优化数据导入格式,使用每种数据的专用存储结构。三是,对数据字段进行压缩,但不能改变其数据表的顺序以及字段的物理意义。四是,将数据表作为字段取值的参照标准,然后深入优化存储类型。五是,编写UDF,在不对用户的日常使用习惯造成任何影响的基础上,优化存储数据,从而能够有效提升日志查询功能的效率,并且能够优化数据占据的空间面积。 2 科学分化日志查询区域,优化查询效率 Hive日志本身具备记录功能,也就是在通常情况下,Hive日志能够自动对自身的运行进行记录,这样操作人员减少了很多复杂的操作步骤,能够有效提高操作效率,操作人员可以利用对Hive的标写来具体分析日志,然后根据其具备的EXPLAIN特性,得到抽象与简化后的查询语句语法树,从而提高查询的效率,完善了查询服务功能。利用正则表达式进行特征数据获取,能够获得准确的语法结构或语句结构,从而详细的进行了shell脚本编写,这时工具可以同时或批量执行使用者通过EXPLAIN传递的指令,然后日志在快速时间内利用对用户使用

Kettle多线程导致的抽取问题解决

今天在测试kettle一个转换的问题,据现场描述,在手工执行该job转换时,获取到的时间是正确的,但是一旦使用批处理计划任务调用执行时,获取到的时间就有问题,转换如下: '查找数据库当前时间' 这个步骤的数据库连接是’AA‘,这一步骤的动作是查找当前系统时间 select sysdate as cksj from dual ’插入/更新‘的数据库连接是’BB‘,这一步骤的动作是把上一步骤得到的时间,更新到表tt的bcgxsj字段中 ’删除'的数据库连接是‘BB’,这一步骤的动作是删除表t1中CQZT='1'的数据 ‘获取更新时间’的数据库连接是'BB',这一步骤是获取步骤‘插入/更新’中更新表tt的bcgxsj字段后的值 现在出现的问题就是,在单独执行时,发现‘获取更新时间’步骤中,获取到的时间,确实是‘插入/更新’步骤执行后的值,

但是,如果通过bat调用,在计划任务中执行时,发现‘获取更新时间’步骤中,获取到的bcgxsj就不对了,查看日志,发现获取到的时间,是更新前的时间。 猜想,应该是kettle多线程的问题。再仔细看日志,发现执行的步骤好像有点不对 发现‘获取更新时间’这一步骤根本不是在’插入/更新‘后执行的,而是一开始就已经连接数据库查询,这样肯定出来的结果不可能是更新后的当前系统时间 这步骤甚至比’查找数据库当前时间‘更早执行。 网上查找原因: 在多线程软件下处理数据库连接,最推荐的方法是在转换执行的过程中为每个线程创建单一的连接。因此,每个步骤复制都打开它们自己单独的事务或者事务集。 这将导致一个潜在的后果,就是你在使用同一个数据库资源的场景下,例如一张数据表或者视图,条件竞争在同一个转换中可能而且会经常发生。 一个常见产生错误的场景,就是当你往一个关系数据表里面写入数据,在随后的步骤里面读回。因为这两个步骤运行在不同的数据库连接下,而且拥有不同的事务上下文,你不能确保这个被第一个步骤写入的数据将可见于其他正在执行读操作的步骤。

hive性能优化模板

优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜。 理解hadoop的核心能力,是hive优化的根本。这是这一年来,项目组所有成员宝贵的经验总结。 长期观察hadoop处理数据的过程,有几个显著的特征: 1.不怕数据多,就怕数据倾斜。 2.对jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次汇总,产生十几个jobs,没半小时是跑不完的。map reduce作业初始化的时间是比较长的。 3.对sum,count来说,不存在数据倾斜问题。 4.对count(distinct ),效率较低,数据量一多,准出问题,如果是多count(distinct )效率更低。 优化可以从几个方面着手: 1. 好的模型设计事半功倍。 2. 解决数据倾斜问题。 3. 减少job数。 4. 设置合理的map reduce的task数,能有效提升性能。(比如,10w+级别的计算,用160个reduce,那是相当的浪费,1个足够)。 5. 自己动手写sql解决数据倾斜问题是个不错的选择。set hive.groupby.skewindata=true;这是通用的算法优化,但算法优化总是漠视业务,习惯性提供通用的解决方法。 Etl开发人员更了解业务,更了解数据,所以通过业务逻辑解决倾斜的方法往往更精确,更有效。 6. 对count(distinct)采取漠视的方法,尤其数据大的时候很容易产生倾斜问题,不抱侥幸心理。自己动手,丰衣足食。

7. 对小文件进行合并,是行至有效的提高调度效率的方法,假如我们的作业设置合理的文件数,对云梯的整体调度效率也会产生积极的影响。 8. 优化时把握整体,单个作业最优不如整体最优。 迁移和优化过程中的案例: 问题1:如日志中,常会有信息丢失的问题,比如全网日志中的user_id,如果取其中的user_id和bmw_users关联,就会碰到数据倾斜的问题。 方法:解决数据倾斜问题 解决方法1. User_id为空的不参与关联,例如: Select * From log a Join bmw_users b On https://www.doczj.com/doc/042169522.html,er_id is not null And https://www.doczj.com/doc/042169522.html,er_id = https://www.doczj.com/doc/042169522.html,er_id Union all Select * from log a where https://www.doczj.com/doc/042169522.html,er_id is null. 解决方法2 : Select * from log a

大数据性能优化之Hive优化

Hive性能优化 1.概述 本人在工作中总结Hive的常用优化手段和在工作中使用Hive出现的问题。下面开始本篇文章的优化介绍。 2.介绍 首先,我们来看看hadoop的计算框架特性,在此特性下会衍生哪些问题? ?数据量大不是问题,数据倾斜是个问题。 ? jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次汇总,产生十几个jobs,耗时很长。原因是map reduce作业初始化的时间是比较长的。 ? sum,count,max,min等UDAF,不怕数据倾斜问题,hadoop在map 端的汇总合并优化,使数据倾斜不成问题。 ? count(distinct ),在数据量大的情况下,效率较低,如果是多count(distinct )效率更低,因为count(distinct)是按group by 字段分组,按distinct字段排序,一般这种分布方式是很倾斜的。举个例子:比如男uv,女uv,像淘宝一天30亿的pv,如果按性别分组,分配2个reduce,每个reduce处理15亿数据。

面对这些问题,我们能有哪些有效的优化手段呢?下面列出一些在工作有效可行的优化手段: ?好的模型设计事半功倍。 ?解决数据倾斜问题。 ?减少job数。 ?设置合理的map reduce的task数,能有效提升性能。(比如,10w+级别的计算,用160个reduce,那是相当的浪费,1个足够)。 ?了解数据分布,自己动手解决数据倾斜问题是个不错的选择。 set hive.groupby.skewindata=true;这是通用的算法优化,但算法优化有时不能适应特定业务背景,开发人员了解业务,了解数据,可以通过业务逻辑精确有效的解决数据倾斜问题。 ?数据量较大的情况下,慎用count(distinct),count(distinct)容易产生倾斜问题。 ?对小文件进行合并,是行至有效的提高调度效率的方法,假如所有的作业设置合理的文件数,对云梯的整体调度效率也会产生积极的正向影响。 ?优化时把握整体,单个作业最优不如整体最优。 而接下来,我们心中应该会有一些疑问,影响性能的根源是什么? 3.性能低下的根源

ETL之kettle进行二次开发简单demo

demo,利用kettle的api,将一个数据源中的信息导入到另外一个数据源中:[java]view plain copy 1.package https://www.doczj.com/doc/042169522.html,.saidi.job; 2. 3.import https://www.doczj.com/doc/042169522.html,mons.io.FileUtils; 4.import org.pentaho.di.core.KettleEnvironment; 5.import org.pentaho.di.core.database.DatabaseMeta; 6.import org.pentaho.di.core.exception.KettleDatabaseException; 7.import org.pentaho.di.core.exception.KettleXMLException; 8.import org.pentaho.di.core.plugins.PluginRegistry; 9.import org.pentaho.di.core.plugins.StepPluginType; 10.import org.pentaho.di.trans.TransHopMeta; 11.import org.pentaho.di.trans.TransMeta; 12.import org.pentaho.di.trans.step.StepMeta; 13.import org.pentaho.di.trans.steps.insertupdate.InsertUpdateMeta; 14.import org.pentaho.di.trans.steps.tableinput.TableInputMeta; 15. 16.import java.io.File; 17. 18./** 19. * Created by 戴桥冰 on 2017/1/16. 20. */ 21.public class TransDemo { 22. 23.public static TransDemo transDemo; 24. 25./** 26. * 两个库中的表名 27. */ 28.public static String bjdt_tablename = "test1"; 29.public static String kettle_tablename = "test2"; 30. 31./** 32. * 数据库连接信息,适用于DatabaseMeta其中一个构造器 DatabaseMeta(String xml) 33. */ 34.public static final String[] databasesXML = { 35. 36."" + 37."" + 38."bjdt" + 39."192.168.1.122" + 40."Mysql" +

Hive性能优化总结

Hive性能优化总结 介绍 首先,我们来看看Hadoop的计算框架特性,在此特性下会衍生哪 些问题? ?数据量大不是问题,数据倾斜是个问题。 ?jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联 多次汇总,产生十几个jobs,耗时很长。原因是map reduce作业初始化的时间是 比较长的。 ?sum,count,max,min等UDAF,不怕数据倾斜问题,hadoop在map端的汇总合并优化, 使数据倾斜不成问题。 count(distinct ),在数据量大的情况下,效率较低,如果是多count(distinct )效率更低,因为count(distinct)是按group by 字段分组,按distinct字段排序,一般这种分布方式是很倾斜的。举个例子:比如男uv,女uv,像淘宝一天30亿的pv,如果按性别分组,分配2个reduce,每个reduce处理15亿数据。 面对这些问题,我们能有哪些有效的优化手段呢?下面列出一些在工作有效可行的优化手段: 好的模型设计事半功倍。 ?解决数据倾斜问题。 ?减少job数。 ?设置合理的map reduce的task数,能有效提升性能。(比如,10w+级别的计算,用 160个reduce,那是相当的浪费,1个足够)。 ?了解数据分布,自己动手解决数据倾斜问题是个不错的选择。set hive.groupby.skewindata=true;这是通用的算法优化,但算法优化有时不能适应特定 业务背景,开发人员了解业务,了解数据,可以通过业务逻辑精确有效的解决数据 倾斜问题。 ?数据量较大的情况下,慎用count(distinct),count(distinct)容易产生倾斜问题。 ?对小文件进行合并,是行至有效的提高调度效率的方法,假如所有的作业设置合理 的文件数,对云梯的整体调度效率也会产生积极的正向影响。 优化时把握整体,单个作业最优不如整体最优。 而接下来,我们心中应该会有一些疑问,影响性能的根源是什么?

kettle 使用中的一些常见问题

kettle 使用中的一些常见问题 问题1: 从excel 中抽取数据,插入到oracle 9 数据库中,报下面的错误. 2008/06/25 13:30:57 - 插入更新数据表.0 - Insert row: ![field1=1.3965E8, field2=1,798, field3=2002/05/27 00:00:00.000] 2008/06/25 13:30:57 - oracl - ERROR : java.sql.SQLException: ORA-01722: 无效数字2008/06/25 13:30:57 - oracl - ERROR : at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125) 原因: 从错误信息可以看出,字段"field2" 对应的数据是1,798,该字段在数据库中是Number 类型,Oracle 不能将1,798 格式的字符串转换为数字。 解决方法: 在【Excel输入步骤】-【字段】标签下对应的字段设置为正确的类型。将"field2" 设置为"Number" 类型(默认是String 类型)。 问题2: 由sqlserver 向mysql 迁移数据, 迁移以后的数据是乱码 原因: 这是由于mysql 的默认编码是utf-8, 而中文环境下客户端的默认编码一般都是gbk 或gb18030, 由于客户端和服务器编码不一样导致保存到mysql 的数据是乱码 解决方法: 在新建连接窗口中有一个选项(option) 标签, 在这个标签下可以设置数据库的一些连接参数. 在这里我们要设置mysql 的客户端编码参数, 参数名characterEncoding, 参数值gbk. 问题3: 在SQLServer 表输入步骤中使用以问号作为参数的sql 语句(参数的值从以前的步骤中获得),向mysql 数据库导入数据(使用mysql 表输出步骤). 在执行的时候报告错误Unable to get queryfields for SQL: AND e.LOCAL_TIME>? 00909 PRS INC Invalid character. 原因: 从错误语句看,是参数没有被替换掉, 因为发送给mysql 服务器的是这样的语句"AND e.LOCAL_TIME>?". 参数没有被替换掉是因为从以前步骤中读取的参数值是null. 解决方法: 增加对null 值的判断, 可以有两种方法, 如果这个值是从数据库获取的,一般的数据库都提供了处理null值的函数,如mysql 的ISNULL 函数. 如果这个值是从其他步骤获得的,可以通过Javascript 步骤进行判断并转换. 问题4: 使用PDI 3.x 版本连接DB2 数据库时会报下面的错误 Error connecting to database: (using class com.ibm.db2.jcc.DB2Driver) encoding not supported!!

hive规则及常用语法

Hive规则及常用语法 一.hive介绍 hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。 二.Hive规则 1.建表规则 表名使用小写英文以字符串模块名称,项目以BI开头(数据集市以DM)以’_’分割主业务功能块名,然后详细业务名,最后以数据表类别结尾,数据表存放在相应的表空间 例如: 数据仓库层_业务大类_业务小类-*** 示例 dw_mobile_start_week dw_mobile_start_mon dw_mobile_start_day 1)在建立长期使用的表时,需要给每个字段Column填写Comment栏,加上中文注释方便查看。对于临时表在表名后加上temp; 2)对运算过程中临时使用的表,用完后即使删除,以便及时的回收空间。临时表如果只用来处理一天数据并且每天都要使用不要按时间建分区。避免造成临时表数据越来越大。 3)字段名应使用英文创建,字段类型尽量使用string.避免多表关联时关联字段类型不一致。 4)多表中存在关联关系的字段,名称,字段类型保持一致。方便直观看出关联关系及连接查询。 5)建表时能够划分分区的表尽量划分分区。 6)建表时为表指定表所在数据库中。 2.查询规则 1.多表执行join操作时,用户需保证连续查询中的表的大小从左到右是依次增加的。也 可以使用/*+STREAMTABLES(表别名)*/来标记大表。

Pentaho ETL工具Kettle转换实现原理

关于Pentaho ETL工具Kettle转换实现原理的研究·ETL和Kettle简介 ETL即数据抽取(Extract)、转换(Transform)、装载(Load)的过程。它是构建数据仓库的重要环节。数据仓库是面向主题的、集成的、稳定的且随时间不断变化的数据集合,用以支持经营管理中的决策制定过程。 Kettle 是”Kettle E.T.T.L. Envirnonment”只取首字母的缩写,这意味着它被设计用来帮助你实现你的ETTL 需要:抽取、转换、装入和加载数据;翻译成中文名称应该叫水壶,名字的起源正如该项目的主程序员MATT 在一个论坛里说的哪样:希望把各种数据放到一个壶里然后以一种指定的格式流出。 Kettle的四大块: Chef——工作(job)设计工具(GUI方式) Kitchen——工作(job)执行器(命令行方式) Spoon——转换(transform)设计工具(GUI方式) Pan——转换(trasform)执行器(命令行方式) Spoon 是一个图形用户界面,它允许你运行转换或者任务,其中转换是用Pan 工具来运行,任务是用Kitchen 来运行。Pan 是一个数据转换引擎,它可以执行很多功能,例如:从不同的数据源读取、操作和写入数据。Kitchen 是一个可以运行利用XML 或数据资源库描述的任务。通常任务是在规定的时间间隔内用批处理的模式自动运行。下面将具体介绍Pan,和Kitchen在ETL中的实现过程。 ·数据转换原理及具体实现过程 大致步骤如下:

转换的过程中(在windows环境下),首先会调用Pan.bat,这一步主要是做一些初始化,连接验证,环境设置,检查之类;然后在Pan的最后一步会调用launcher.jar包,这个包用于启动JDBC驱动,并向JDBC传入相关连接信息和参数,然后开始传数据,最后是完成数据传输,关闭相关协议,写入日志。 首先来看Kitchen的实现,Kitchen在一个job中一般包含以下几个步骤: 转换:指定更细的转换任务,通过Spoon生成。通过Field来输入参数; SQL:sql语句执行; FTP:下载ftp文件; 邮件:发送邮件; 检查表是否存在; 检查文件是否存在; 执行shell脚本:如dos命令。 批处理:(注意:windows批处理不能有输出到控制台)。 Job包:作为嵌套作业使用。 SFTP:安全的Ftp协议传输; HTTP方式的上/下传。 以下是一个简单的ETL过程:

kettle转换步骤的类型功能

文本文件输入(text input):读取大量不同的文本文件。大多是通过工具生成的CSV文件。 表输入(table Input):常用来利用连接和SQL,从数据中读取信息,自动生成基本的SQL语句。 获取系统信息(get system info):这个步骤从Kettle 环境中获取信息。 生成行(Generate Rows ):这个步骤输出一定数量的行,缺省为空。可选包括一定数量的静态字段。 Cube输入(文件反序列化)(De-serialize from file):从二进制Kettle Cube 文件中读取数据行。备注:这个步骤仅仅用来存储短期数据。不同版本之间不保证文件的格式一样。 XBase输入:使用这一步可以读取大多数被称为XBase family派生的DBF文件。 Excel输入:利用这个步骤可以从Kettle 支持的系统的Excel文件里面读取数据。 XML输入:这个步骤允许你读取存储在XML 文件中的数据。它也提供一个接口,你可以定义你想读取的文件名、XML 文件的数据重复部分、获取的字段等。你可以指定元素或属性字段。 获取文件名(Get File Names):这个步骤可以获取系统的文件名信息。 文本文件输出(Text File Output): 表输出(Table output):这个步骤可以存储信息到数据库表中。 插入/更新(Insert/Update):这个步骤利用查询关键字在表中搜索行。如果行没有找到,就插入行。如果能被找到,并且要被更新的字段没有任何改变,就什么也不做。如果有不同,行就会被更新。 更新(Update ):这个步骤类似于插入/更新步骤,除了对数据表不作插入操作之外。它仅仅执行更新操作。 删除(Delete):这个步骤类似于上一步,除了不更新操作。所有的行均被删除。 Cube output(序列化到文件)(Serialize to file):这一步骤存储数据到一个二进制文件。这个步骤有个优势就是回读的时候,文本文件的内容不需要解析。这是因为元数据也同时存储在CUBE 文件里面。 XML输出:这个步骤允许你从源中写入行到一个或者多个XML 文件。 EXCEL输出:利用这个步骤,在Kettle 支持的系统中,你可以写入数据到一个或者多个

Hive update实现方案V1.0

Hive update实现方案 1.问题 由于hive数仓的特性,不容许数据进行修改,造成hive中的数据更新活着删除很困难的问题,自hive 0.11版本之后,hive也尝试在测试环境允许进行update和delte操作,但这些操作还不成熟,不敢在生产环境放心使用,其中也有一样不足。所以就需要找一种可靠的方案实现hive的数据更新或者删除。 2.方案 2.1.创建数据表 创建两张数据结构一模一样的hive数据表TEST、TEST_TEMP,其中TEST表的存储格式为“ORCFILE”(性能高),TEST_TEMP 表的存储格式为“TEXTFILE”(方便数据加载)。 ID NAME AGE 主键姓名年龄 create table TEST_TEMP ( id string, name string, age string ) comment '临时表' partitioned by (y string,m string,d string) row format delimited fields terminated by',' stored as textfile create table TEST (

id string, name string, age string ) comment '最终表' row format delimited fields terminated by',' stored as orcfile 2.2.初始化 1.通过hive数据load的方式先把数据加载到TEST_TEMP表中 (此处也可以通过sqoop进行数据抽取,不再详述)。 load data local inpath '/home/hadoop/a.txt' overwrite intotable TEST_TEMP 2.通过hive insert overwrite的方式把临时表的数据加载到最终 表TEST中。 insertintotable TEST select id,name,age from TEST_TEMP 2.3.日常 1.通过hive数据load的方式先把数据加载到TEST_TEM表中 (此处也可以通过sqoop进行数据抽取,不再详述)。 load data local inpath '/home/hadoop/b.txt' overwrite intotable TEST_TEMP 2.通过数据比对方式,找出非更新和非增量的数据,人后把这 部分数据覆盖到TEST表中,即保证TEST中的数据和 TEST_TEMP中的没有重复(前提是表中必须有主键)。 INSERT OVERWRITE TABLE TEST SELECT id,name,age FROM TEST a LEFT JOIN TEST_TEMP b on a.id=b.id WHERE b.id is null; 注:上述语句其实就是not in的逻辑,如果日常数据上包含增、 删、改标识,则只需在关联时在TEST_TEMP表上加条件判

Hive 查询优化总结

一、join优化 Join查找操作的基本原则:应该将条目少的表/子查询放在Join 操作符的左边。原因是在Join 操作的Reduce 阶段,位于Join 操作符左边的表的内容会被加载进内存,将条目少的表放在左边,可以有效减少发生内存溢出错误的几率。 Join查找操作中如果存在多个join,且所有参与join的表中其参与join的key都相同,则会将所有的join合并到一个mapred程序中。 案例: SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1) 在一个mapre程序中执行join SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2) 在两个mapred程序中执行join Map join的关键在于join操作中的某个表的数据量很小,案例: SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a join b on a.key = b.key Mapjoin 的限制是无法执行a FULL/RIGHT OUTER JOIN b,和map join相关的hive参数:hive.join.emit.interval hive.mapjoin.size.key hive.mapjoin.cache.numrows 由于join操作是在where操作之前执行,所以当你在执行join时,where条件并不能起到减少join数据的作用;案例: SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key) WHERE a.ds='2009-07-07' AND b.ds='2009-07-07' 最好修改为: SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key AND b.ds='2009-07-07' AND a.ds='2009-07-07') 在join操作的每一个mapred程序中,hive都会把出现在join语句中相对靠后的表的数据stream化,相对靠前的变的数据缓存在内存中。当然,也可以手动指定stream化的表:SELECT /*+ STREAMTABLE(a) */ a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1) 二、group by 优化 Map端聚合,首先在map端进行初步聚合,最后在reduce端得出最终结果,相关参数:? hive.map.aggr = true是否在Map 端进行聚合,默认为True ? hive.groupby.mapaggr.checkinterval = 100000在Map 端进行聚合操作的条目数目 数据倾斜聚合优化,设置参数hive.groupby.skewindata = true,当选项设定为true,生成的查询计划会有两个MR Job。第一个MR Job 中,Map 的输出结果集合会随机分布到Reduce 中,每个Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key 有可能被分发到不同的Reduce 中,从而达到负载均衡的目的;第二个MR Job 再

开源ETL工具kettle系列之动态转换

摘要:本文主要讨论使用Kettle来设计一些较为复杂和动态的转换可能使用到的一些技巧,这些技巧可能会让你在使用Kettle的时候更加容易的设计更强大的ETL任务。 动态参数的传递 Kettle 在处理运行时输入参数可以使用JavaScript 来实现,大部分工作只是按照一个模板来处理的 动态参数传递主要使用在像数据清理,调式,测试,完成复杂的条件过滤等等,这种方式一般不会在产品已经运行稳定了一段时间之后使用,因为我们一般仍然是做定时任务来自动转换数据,所以在开始介绍如何使用动态参数之前,希望大家能明白不要在产品数据库上做实验,即使你已经知道你的转换有什么影响并且做了备份,因为这种方法是不可能自动执行的。 Kettle有两种动态参数传递的方法,一种是非常轻量级的传argument , 另一种是对付较复杂一点情况使用JavaScript . 下面分别介绍这两种方法。 1. argument 当你在运行一个转换的时候,不管这个转换是一个Job的一部分还是只有这个转换,你都可以传递参数给它,当你运行一个转换的时候,会弹出一个Execution a Transformation 的对话框,让你选择执行转换的方式,本地执行,远程执行,分布式执行,下面就是日志记录的级别和回放时间,然后是argument 和variables 的设定。Argument 和variables 的区别在官方FAQ里面也有解释。你也可以参考一下官方的解释和下面解释的异同。 Q : Argument 和variables 的区别/ A : variables 也可以认为叫做environment variables , 就像它的名字一样,主要是用来设定环境变量的,比如最常见的:文件的存放地址,smtp的配置等等,你也可以把它认为是编程语言里面的全局变量,即使是不同的转换它们也拥有同样的值,而argument 自然就类似与局部变量,只针对一个特定的转换,比如像是限定结果集的大小和过滤条件。 取得argument的值 我们在转换之前设置了argument的值,需要用到的时候就使用get system info 步骤,这个步骤取得在运行时参数,需要注意的是我们是先设置get system info ,然后在里面决定要使用多少个参数,最多10个,每个参数名叫什么,然后我们才能在运行时看到你设置了的参数名后面跟一个要你输入的值,并且参数类型是不能够指定,全部都当作字符串处理,如果你需要对参数类型有要求,你需要自己转换,使用一个Mapping步骤或者Select values步骤。 取得variable的值 Variable 的值个数不受限制,你可以在kettle菜单的set environment里面设置,也可以使用文件储存这些值,在第一次运行kettle之后,kettle会在%HOME_USER_FOLDER%菜单里面创建一个 .kettle文件夹,如果是windows 用户可能就是C:\Documents and Settings\${your user name}\.kettle这个文件夹,如果是linux用户可能就是/home/${your user name }/.kettle文件夹,这个文件夹下面有kettle.properties文件,如果你打开这个文件,你会发现里面有一些以#开头的注释,其中设置了一些像是:PRODUCTION_SERVER = Hercules 这样的键值对,你可以自己定义一些环境变量比如像是smtp的地址,ftp服务器的地址,你放log文件的目录名等等,当然不能直接编辑这个文件就设置环境变量,要先设置KETTLE_HOME环境变量,windows就是点我的电脑,然后在设置path的那个地方添加一个KETTLE_HOME变量,linux就是export KETTLE_HOME=’一个目录’,这个目录可以任意地方,不过一般还是指向kettle的安装目录或是你自己的文档目录,然后启动kettle它会创建一个新的.kettle目录,编辑里面的kettle.properties文件就可以设置环境变量了. 2. 使用脚本 Kettle使用的是JavaScript来作为它的脚本实现,使用的是mozilla 的rhino 1.5r5版本实现,如果你打算

kettle增量更新设计

kettle增量更新设计 ETL中增量更新是一个比较依赖与工具和设计方法的过程, Kettle中主要提供sert/ Update步骤, Delete步骤和 Database Lookup步骤来支持增量更新增量更新的设计方法也是根据应用场景来选取的,虽然本文讨论的是 Kettle的实现方式,但也许对其他工具也有一些帮助。 1、增量分类 应用场景增量更新按照数据种类的不同大概可以分成: 1、增加,不更新 2、更新,不增加 3、即增加也更新 4、有删除,有增加,有更新 其中1,2,3种大概都是相同的思路,使用的步骤可能略有不同,通用的方法是在原数据库增加一个时间戳,然后在转换之后的对应表保留这个时间戳,然后每次抽取数据的时候,先读取这个目标数据库表的时间戳的最大值,把这个值当作参数传给原数据库的相应表,根据这个时间戳来做限定条件来抽取数据,抽取之后同样要保留这个时间戳,并且原数据库的时间戳一定是指定默认值为date当前(以原数据库的时间为标准),抽取之后的目标数据库的时戬要保留原来的时间戳,而不是抽取时候的时间。 对于第一种情况,可以使用 Kettle的 Insert/ Update步骤,只是可以勾选Don' t perform any update选项,这个选项可以告诉 Kettle你只会执行 Insert步骤。 对于第二种情況可能比较用在数据出现错误然后原数据库有一些更新,相应的标数据库也要更新,这时可能不是更新所有的数据,而是有一些限定条件的数排你可以使用 Kettle 的 Update步骤来只执行更新。关于如何动态的执行限定条件,可以参考前一篇文章。 第三种情况是最为常见的一种情況,使用的同样是 Kettle的 Insert/ Update步骤,只是不要勾选Don' t perform any update选项第四种情況有些复杂,后面专门讨论:对于第1,2,3种个以参考下面的例子这个例子假设原数据库表为 customers,含有一个id, firstname,1 astnameage字段,主键为id,然后还加默认值为 sysdate的时间戳字段。转换之后的结果类似:id, firstname,1 astname,age, updatedate.整个设计流程大概如: 其中第一个步骤的sql 大概如下模式: Select max(updatedate) from target_customer ; 你会注意到第二个步骤和第一个步骤的连接是黄色的线,这是因为第二个table input 步骤把前面一个步骤的输出当作一个参数来用,所有Kettle用黄色的线来表示,第二个table input 的sql 模式大概如下: Select field1 , field2 , field3 from customers where updatedate > ? 后面的一个问号就是表示它需要接受一个参数,你在这个table

kettle之多表数据复制

kettle之------ 多表数据复制 需求:把A库中N个表抽取至B库中,表结构相同或只是增加统一的一些字段,过滤条件基本类似。 解决方法: 我们把以上内容在解决问题上拆分为二步, 1,从一配制表中读出相应的表名及过滤条件,存于一结果。 2,根据第一步的结果,一条条循环来进行取数插数的过程。 以上过程相当简单,以下为讨论的实现方式。 1,如果是ORACLE同字符集,用DBLINK结合着存储过程,写一个通用的程序很容易搞定,只需要建立一个表名及过滤条件的配制表(在此就不多说了)。 2,用ETL工具实现,据我所知,以infa为例,它以字段为对应关系,且它的流程内部循环相当困难,曾经我们有个项目,infa就是硬生生的画了一二百个mapping(的确,不会累死人,但看着相当不爽,当然,欢迎提供好的方案), 在此,我们以kettle为例进行分析,如何解决这个问题(先抛开性能,kettle的确是个好东西) 1),主流程大概是如下这样的 在此,我们再看一下第一组件(得到多表表名)里面内容, 我们再看一下得到表名中的内容

这其中的sql只是模拟一个得到表名的sql,可灵活使用,这个组件其实就完成了把要抽取的表放入一个结果集中了。 我们再看第二个组件(表迁移) 就是一个取数一个插数的过程。 再看一下它们的内容 在此就完成了,但是,我们主job设置(表迁移)组件时,也就是把前面的内容当后面的参数循环执行。

基本就是如此,另,记得在各主流程及二转换中都设置tt_tab这个参数。 说了这么多,其实很简单。如果你是要做数据库表复制的话,kettle有其它的方式,可以根据工具-》向导-》复制表向导完成。 以上这种适应的是,可实现一些sql的拼接,且要增加减少表时只需求维护配制表了,相对来说会变的简单。。 kettle交流群87340451

hive常用优化方法大全

hive常用优化方法大全 hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以通过类SQL语句快速实现简单的MapReduce统计,十分适合数据仓库的统计分析。 在使用hive的过程中,可以进行hive优化,以下是常用的hive优化方法: 1. join连接时的优化:当三个或多个以上的表进行join操作时,如果每个on使用相同的字段连接时只会产生一个mapreduce; 2. join连接时的优化:当多个表进行查询时,从左到右表的大小顺序应该是从小到大,原因是hive在对每行记录操作时会把其他表先缓存起来,直到扫描最后的表进行计算; 3. 在where字句中增加分区过滤器; 4. 当可以使用left semi join 语法时不要使用inner join,前者效率更高,原因是对于左表中指定的一条记录,一旦在右表中找到立即停止扫描; 5. 如果所有表中有一张表足够小,则可置于内存中,这样在和其他表进行连接的时候就能完成匹配,省略掉reduce过程,设置属性即可实现,set hive.auto.covert.join=true; 用户可以配置希望被优化的小表的大小 set hive.mapjoin.smalltable.size=2500000; 如果需要使用这两个配置可置入$HOME/.hiverc文件中; 6. 同一种数据的多种处理:从一个数据源产生的多个数据聚合,无需每次聚合都需要重新扫描一次; 7. limit调优:limit语句通常是执行整个语句后返回部分结果,set

hive.limit.optimize.enable=true; 8. 开启并发执行:某个job任务中可能包含众多的阶段,其中某些阶段没有依赖关系可以并发执行,开启并发执行后job任务可以更快的完成,设置属性:set hive.exec.parallel=true; 9. hive提供的严格模式,禁止3种情况下的查询模式: a:当表为分区表时,where字句后没有分区字段和限制时,不允许执行; b:当使用order by语句时,必须使用limit字段,因为order by 只会产生一个reduce任务。 c:限制笛卡尔积的查询; 10. 合理的设置map和reduce数量; 11. jvm重用。可在hadoop的mapred-site.xml中设置jvm被重用的次数。 除此之外,还有很多其他的优化方式,感兴趣的可以深入学习一下,相信不断的学习和积累,必定能熟练掌握大数据知识,成为高级大数据工程师!

kettle中通过 时间戳(timestamp)方式 来实现数据库的增量同步操作(一)

kettle中通过时间戳(timestamp)方式来实现数据库的增 量同步操作(一) 这个实验主要思想是在创建数据库表的时候, 通过增加一个额外的字段,也就是时间戳字段, 例如在同步表tt1 和表tt2 的时候, 通过检查那个表是最新更新的,那个表就作为新表,而另外的表最为旧表被新表中的数据进行更新。 实验数据如下: mysql database 5.1 test.tt1( id int primary key , name varchar(50) ); mysql.tt2( id int primary key, name varchar(50) ); 快照表,可以将其存放在test数据库中, 同样可以为了简便,可以将其创建为temporary 表类型。数据如图kettle-1 kettle-1 ============================================== ==============

主流程如图kettle-2 kettle-2 在prepare中,向tt1,tt2 表中增加时间戳字段, 由于tt1,tt2所在的数据库是不同的,所以分别创建两个数据库的连接。 prepare kettle-3 在执行这个job之后,就会在数据库查询的时候看到下面的字段: kettle-4 然后,我们来对tt1表做一个insert 操作一个update操作吧~ kettle-5 在原表上无论是insert操作还是update操作,对应的updateTime都会发生变更。

如果tt1 表和tt2 表中updateTime 字段为最新时间的话,则说明该表是新表。 下面只要是对应main_thread的截图: kettle-6 在这里介绍一下Main的层次: Main START Main.prepare Main.main_thread { START main_thread.create_tempTable main_thread.insert_tempTable main_thread.tt1_tt2_syn SUCCESS } Main.finish SUCCESS

相关主题
文本预览
相关文档 最新文档