分类 Hadoop 下的文章

hive中的join

一、hive中的join
inner join 等价于 join, 可以理解为 join 是 inner join 的缩写;left join 等价于 left outer join ;right join 等价于 right outer join;
二、
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行

Hadoop distcp集群间同步数据

hadoop distcp -D ipc.client.fallback-to-simple-auth-allowed=true -log /temp/tianhailong/ webhdfs://10.11.4.240:50070/test/tianhl webhdfs://10.11.1.10/user/hive

遇到的坑:
1、数据所在的集群所有机器,需要配置同步集群的hosts。
2、带有Kerberos安全认证,需要加参数。-D ipc.client.fallback-to-simple-auth-allowed=true
3、 注意运行日志,需要写入有权限的文件夹。 -log /temp/tianhailong/
4、被写入数据的集群是hive用户写入的,需要找一个hive可以写入的权限的文件夹存放数据。/user/hive
 
参数说明:

-m <num_maps> 同时拷贝的最大数目 指定了拷贝数据时map的数目。请注意并不是map数越多吞吐量越大。

参考网址:
https://community.hortonworks.com/questions/294/running-distcp-between-two-cluster-one-kerberized.html
http://stardust.wang/?p=331

维度表和事实表

维度表示你要对数据进行分析时所用的一个量, 比如你要分析产品销售情况, 你可以选择按类别来进行分析,或按区域来分析. 这样的按..分析就构成一个维度。前面的示例就可以有两个维度:类型和区域。另外每个维度还可以有子维度(称为属性),例如类别可以有子类型,产品名等属性。
下面是两个常见的维度表结构:
产品维度表:Prod_id, Product_Name, Category, Color, Size, Price
时间维度表:TimeKey, Season, Year, Month, Date
而事实表是数据聚合后依据某个维度生成的结果表。它的结构示例如下:
销售事实表:Prod_id(引用产品维度表), TimeKey(引用时间维度表), SalesAmount(销售总量,以货币计), Unit(销售量)
 
上面的这些表就是存在于数据仓库中的。从这里可以看出它有几个特点:
1. 维度表的冗余很大,主要是因为维度一般不大(相对于事实表来说的),而维度表的冗余可以使事实表节省很多空间。
2. 事实表一般都很大,如果以普通方式查询的话,得到结果一般发的时间都不是我们可以接受的。所以它一般要进行一些特殊处理。如SQL Server 2005就会对事实表进行如预生成处理等。
3. 维度表的主键一般都取整型值的标志列类型,这样也是为了节省事实表的存储空间。
 
事实表和维度表的分界线
事实表是用来存储主题的主干内容的。以日常的工作量为例,工作量可能具有如下属性:工作日期,人员,上班时长,加班时长,工作性质,是否外勤,工作内容,审核人。那么什么才是主干内容?很容易看出上班时长,加班时长是主干,也就是工作量主题的基本内容,那么工作日期,人员,工作性质,是否外勤,工作内容是否为主干信息呢?认真分析特征会发现,日期,人员,性质,是否外勤都是可以被分类的,例如日期有年-月-日的层次,人员也有上下级关系,外勤和正常上班也是两类上班考勤记录,而上班时长和加班时长则不具有此类意义。所以一般把能够分类的属性单独列出来,成为维度表,在事实表中维护事实与维度的引用关系。
在上述例子中,事实表可以设计成如下
WorkDate EmployeeID,WorkTypeID,Islegwork,Content,
而时间,员工,工作类型,是否外勤则归为维度表。
总的来看,和其他建立主外键关系的表也都一样。但是维度表的建立是需要有层次的(虽然不是必须,但是也是典型特征),而事实表的建立是针对已经发生的事实的,是历史数据的存档,也就是说是不应该修改的。以测试部测试软件的Bug为例。每个Bug都是一个事实。这个Bug的状态在数据字典里可能设计成新建,转派,修复,拒绝等等。那么在事实表中Bug表中有一个字段为Status。当测试员或者开发人员改变了这个状态的值,事实表中该如何更新呢?是直接更新Status还是什么其他的方式?显然,为了能够追踪这个Bug的历史信息,应该是重新插入一条新的记录。那么这和以往的数据库设计有什么区别呢?可以看出对于原始记录和新插入的记录,其他字段全部是相同的,也就是全部冗余的。如果以BugID作为主键,这时候会发现主键都是冗余的(当然,插入之前只能删除主键)。所以可以看出,事实表一般是没有主键的。数据的质量完全由业务系统来把握。
总的说来,事实表的设计是以能够正确记录历史信息为准则,维度表的设计是以能够以合适的角度来聚合主题内容为准则。
 
维是分析问题的角度,每一维代表一个统一的访问数据仓库中信息的路径。
在实际问题中,有些维包含多个层次。
事实是各个维度的交点,是对某个特定事件的度量,只有当特定维值的组合没有造成空穴时,一个事实才会存在。事实的数量属性称为度量。
事实数据和维度数据的识别必须依据具体的主题问题而定。“事实表”,用来存储事实的度量(measure)及指向各个维的外键值。维表用来保存该维的元数据,即维的描述信息,包括维的层次及成员类别等

所产生的数据,事实数据表通常包含大量的行。事实数据表的主要特点是包含数字数据(事实),并且这些数字信息可以汇总,以提供有关单位作为历史的数据,每个事实数据表包含一个由多个部分组成的索引,该索引包含作为外键的相关性纬度表的主键,而维度表包含事实记录的特性。事实数据表不应该包含描述性的信息,也不应该包含除数字度量字段及使事实与纬度表中对应项的相关索引字段之外的任何数据。
包含在事实数据表中的“度量值”有两中:一种是可以累计的度量值,另一种是非累计的度量值。最有用的度量值是可累计的度量值,其累计起来的数字是非常有意义的。用户可以通过累计度量值获得汇总信息,例如。可以汇总具体时间段内一组商店的特定商品的销售情况。非累计的度量值也可以用于事实数据表,单汇总结果一般是没有意义的,例如,在一座大厦的不同位置测量温度时,如果将大厦中所有不同位置的温度累加是没有意义的,但是求平均值是有意义的。
一般来说,一个事实数据表都要和一个或多个纬度表相关联,用户在利用事实数据表创建多维数据集时,可以使用一个或多个维度表。
再举个实际的例子。银行对存款记账,A表中存放实际数据,包括账号、所属机构号、存款金额等,B表存放机构号和机构名称的对应关系。则A是事实表,B是维表。
维度表可以看作是用户来分析数据的窗口,纬度表中包含事实数据表中事实记录的特性,有些特性提供描述性信息,有些特性指定如何汇总事实数据表数据,以便为分析者提供有用的信息,维度表包含帮助汇总数据的特性的层次结构。例如,包含产品信息的维度表通常包含将产品分为食品、饮料、非消费品等若干类的层次结构,这些产品中的每一类进一步多次细分,直到各产品达到最低级别。
在维度表中,每个表都包含独立于其他维度表的事实特性,例如,客户维度表包含有关客户的数据。维度表中的列字段可以将信息分为不同层次的结构级。
简单的说:
1、事实表就是你要关注的内容;
2、维表就是你观察该事务的角度,是从哪个角度去观察这个内容的。
例如,某地区商品的销量,是从地区这个角度观察商品销量的。事实表就是销量表,维表就是地区表

 

hadoop spark 大数据相关资源

小象《Hadoop 2.X大数据平台V3》
链接:http://pan.baidu.com/s/1nvS7GFJ 密码:tqng
《Spark 1.X 大数据平台V2》11月份班
链接:http://pan.baidu.com/s/1sl6KOGX 密码:qlea
深入浅出Hive企业级架构优化、Hive Sql优化、压缩和分布式缓存
链接:http://pan.baidu.com/s/1gfsmj3X 密码:50y2
资源整理中…….
欢迎大家补充!

Presto的作用

Presto不是什么
虽然Presto一直被一些个人或者团体称为 数据库 ,但是Presto并不是数据库。
千万不要以为Presto可以解析SQL,那么Presto就是一个标准的数据库。Presto并不是传统意义上的数据库。Presto并不是MySQL、PostgreSQL或者Oracle的代替品。Presto并不能用来处理在线事务。其实很多其他的数据库产品也是被用来设计为数据仓库或者数据分析工具,但是也不能处理在线事务。
Presto是什么
Presto通过使用分布式查询,可以快速高效的完成海量数据的查询。如果你需要处理TB或者PB级别的数据,那么你可能更希望借助于Hadoop和HDFS来完成这些数据的处理。作为Hive和Pig(Hive和Pig都是通过MapReduce的管道流来完成HDFS数据的查询)的替代者,Presto不仅可以访问HDFS,也可以操作不同的数据源,包括:RDBMS和其他的数据源(例如:Cassandra)。
Presto被设计为数据仓库和数据分析产品:数据分析、大规模数据聚集和生成报表。这些工作经常通常被认为是线上分析处理操作。
谁使用Presto?
Presto是FaceBook开源的一个开源项目。Presto在FaceBook诞生,并且由FaceBook内部工程师和开源社区的工程师公共维护和改进。
既然Presto是一个交互式的查询引擎,我们最关心的就是Presto实现低延时查询的原理,我认为主要是下面几个关键点,当然还有一些传统的SQL优化原理,这里不介绍了。
完全基于内存的并行计算
流水线
本地化计算
动态编译执行计划
小心使用内存和数据结构
类BlinkDB的近似查询
GC控制

elasticsearch在window下的安装和java查询

下载elasticsearch的zip包,elasticsearch的版本是2.2.1
ps:elasticsearch的api随版本更新的速度快,这里边需要查看对应版本的api文档
解压后安装,elasticsearch的访问地址:
http://localhost:9200/

{
  "name" : "Venus",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.2.1",
    "build_hash" : "d045fc29d1932bce18b2e65ab8b297fbf6cd41a1",
    "build_timestamp" : "2016-03-09T09:38:54Z",
    "build_snapshot" : false,
    "lucene_version" : "5.4.1"
  },
  "tagline" : "You Know, for Search"
}

安装插件:
elasticsearch插件elasticsearch-head安装:
elasticsearch-head是一个elasticsearch的集群管理工具,它是完全由html5编写的独立网页程序,你可以通过插件把它集成到es。
在cmd进入elasticsearch安装的bin目录,执行下边的命令:

plugin install mobz/elasticsearch-head

网上查的命令是:

plugin -install mobz/elasticsearch-head

注意比较不同
安装完命令可以打开url:http://localhost:9200/_plugin/head/ 查看效果

elasticsearch-head

elasticsearch-head


bigdesk这个插件就不要安装了,github上的代码都是几年前的了
pojo类:

package com.rong360.elasticsearch;
public class User {
	private long id;
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

elasticsearch建立索引:

package com.rong360.elasticsearch;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
public class ElasticSearchClient {
	private static Client client;
	public void init() {
		try {
			client = TransportClient.builder().build()
					.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
	}
	public void close() {
		client.close();
	}
	public void createIndex() {
		for (int i = 0; i < 1000; i++) {
			User user = new User();
			user.setId(new Long(i));
			user.setName("huang fox " + i);
			user.setAge(i % 100);
			client.prepareIndex("users", "user").setSource(generateJson(user)).execute().actionGet();
		}
	}
	private String generateJson(User user) {
		String json = "";
		try {
			XContentBuilder contentBuilder = XContentFactory.jsonBuilder().startObject();
			contentBuilder.field("id", user.getId() + "");
			contentBuilder.field("name", user.getName());
			contentBuilder.field("age", user.getAge() + "");
			json = contentBuilder.endObject().string();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return json;
	}
	public static void search() {
		SearchResponse response = client.prepareSearch("users").setTypes("user")
				.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
				.setQuery(QueryBuilders.termQuery("name", "fox")) // Query
				.setPostFilter(QueryBuilders.rangeQuery("age").from(22).to(26))// Filter
				.setFrom(0).setSize(60).setExplain(true).execute().actionGet();
		SearchHits hits = response.getHits();
		System.out.println(hits.getTotalHits());
		for (int i = 0; i < hits.getHits().length; i++) {
			System.out.println(hits.getHits()[i].getSourceAsString());
		}
	}
	public static void main(String[] args) {
		long a = System.currentTimeMillis();
		ElasticSearchClient elasticSearchClient = new ElasticSearchClient();
		elasticSearchClient.init();
		System.out.println("监测的时间1:"+(System.currentTimeMillis()-a)/1000f+" 秒 ");
		elasticSearchClient.createIndex();	//创建索引
		System.out.println("监测的时间2:"+(System.currentTimeMillis()-a)/1000f+" 秒 ");
		search();	//查询
		System.out.println("监测的时间3:"+(System.currentTimeMillis()-a)/1000f+" 秒 ");
		elasticSearchClient.close();
	}
}
elasticsearch_demo

elasticsearch_demo

hive中的文件格式

在hive中的文件格式主要如下几种:
textfile:默认的文本方式
Sequencefile:二进制格式
rcfile:面向列的二进制格式
orc:rcfile的增强版本,列式存储
parquet:列式存储,对嵌套类型数据支持较好
hive文件支持压缩方式:
这个与底层的hadoop有关,hadoop支持的压缩,hive都支持,主要有:gzip,bizp,snappy,lzo

训练对数字的敏感

开经营会议的时候,我常常发现很多中高层管理人员,对数字相当的不敏感。有时候,整个一场会开完,有些管理人员对各部门所报告的数据,既无问询,也不质疑,只是盯着幻灯片,任其往下翻。而报告的人,常常将一些数字念到个位数,乃至小数点后面两位数,也让我觉得不可思议。我觉得这样的会议,这样的数字,这样的管理人员,都没有价值。不能透过数字,看出数字背后的问题的管理人员,不是好管理人员。要么赶快训练对数字的敏感度,要么,干脆另谋生路。
这让我想自己与数字打交道的故事。
读书时,我的数学成绩并不好。参加工作后,我所从事的工作,却是个天天跟各种数据打交道的工作。至今还记得,第一次做统计数据的工作,一堆数字,我加过去,而后加过来,怎么都对不起来。第二天就要交那份报告,那天晚上,我却被困在一堆数字里,晕头转向,欲哭无泪。在快要绝望的时候,一位新来的工程师来找资料,成了我最后的救命稻草。在我的万般央求之下,他帮我把那堆统计数据给弄了出来。
从此,那些数据就变成了我的噩梦。有段时间,我做梦的主要内容,就是不停计算数字。但我却常常因为一些数字的准确性,而被上司骂得狗血喷头。我不服气,但又无奈。有些事情,我也常常搞不懂,那些数字都是我统计的,一个个都是我输进电脑,做成图表的。为何我发现不了其中的错,而上司翻翻,扫一眼,就能发现错误呢?
后来,我从统计,被调入生产线,之后,又被调去任品质部主管。最糟糕的事情,就发生在那一年。工作忙,常常起早贪黑。每次开会,检讨工作,除了带着一堆资料之外,当然还要记住很多重要的数据。但我是对数据不敏感。其结果是,我越想拼命记住那些数字,我的记忆力却变得越差。一度到了我跟别人讲话,讲了上半句,竟然会忘记下半句想讲什么。
有一天,我们在那里进行月度检讨。老板问财务部经理一些经营数字,比如销售业绩,成本状况,等等,我听财务部经理在那里翻着月统计报表,答:“8360912元”,“337231元”,“4053222元”。老板忽然问起三个月前的材料成本数据,财务经理傻眼了,手上没有报告,答不出来。我恰好记得那些数据,便顺口答:“234万。占了整个产值的28%。”散会后,我很奇怪,对数据一向迟钝如我的人,何以记得三个月前的成本数据?仔细想,原来那时候我要分析品质成本,就看了整个成本数据。但我记忆力本身就差,又对数字不敏感,所以只是记了大数。
记大数?我忽然开了窍。我过去之所以记不住那么多数据的原因,想来大概也如财务经理一样,数字弄得太精准。数字精准,就必须得花大力气去记。但事实是,没有人有那样的精力和能力,记得那些精确到个位的数字。我仔细分析了一下,发现,在企业里,做为管理人员,分析和判断时,只需要到万位数就可以,万以下的数字,可以忽略不计。另外一些数字,则只需要记住百分比即可。有了大数,有了百分比,有些数字记不住,其实不打紧,一推算,就出来了。
之后,我再接再厉,继续分析总结,发现,其实,很多数字是有规律的。比如成品率,废品率,材料成本,管理费用,他们都在某个百分比上下波动。记住了上年度,或者本年度第一季度的大数(到万即可)和百分比,以其为参考基准线,后面几个月,上下的波动,其实很容易记住。如果报表中,忽然出现某个跳动太明显的数字,自然便是异常的。快速判断这个异常是计算错误,还是真的异常,只需要看与其相关联的数字即可,如果与其相关联的数字也随之波动,则是真的异常,如果与之相关联的数据没有太大变化,立刻就可以判断出来,这个数字的计算是有问题的。
大数当然只是用于方向和趋势的判断。仅仅记住大数是不够的,还要记住每个项目的关键指标。关键指标,是很多数字赖以存在的基础和基点。比如,计划部门,必须记住物料采购周期,产品生产周期、按时交货率、每个工序标准加工时间等等,以此为参考基点,任何与之相关的数字拿来一比,他可以立即判断进度是否异常。若考核业绩的话,一定要记得部门平均业绩,个人平均业绩,最高、最低业绩等。如果是市场部,除了记住一个月的销售指标外,自然要分解到每天,每个片区的销售业绩指标,到哪天,只要看当天业绩和累积大数,自然对销售状况了然于胸了。
除了根据大数和关键指标去衡量和判断之外,还要随着异常的波动,适当调整自己的注意力。每天,那些项目虽然重要,但是在图表上显示正常的数据,可以一扫而过,不必为之花时间。你要集中注意力,重点盯异常点。一般异常的,就是一个,或者几个点而已,所以,你会很容易关注的过来,自然也就很容易记得住,盯得住。其实,只要理解了数字背后的意义,记住相关数字,是比较容易的事。
当明白了这些的时候,我就开始调整我的工作方法,记数字的方式,有意识训练自己。后来,我尝试让自己记住更大范围、更宏观的数字,比如世界范围内的行业数字,在日本、美国、韩国、台湾等国家地区的数字,中国的行业数据,某个地区的行业数据。我尽大可能放宽我的视野,搜寻与我所从事领域相关联的数字,拿来判断一下,琢磨一下它的好坏,根据它的走势,寻找一下它的判断基准点。渐渐的,我也变成了一个对数字敏感的人。
特别是我离开原来的公司,到了新公司之后,能快速记住主要的关键指标和数字。我在一两天之内,就能从各部门提供的数据和报告中找出问题;我能看一眼财务的数据,就指出那些重要指标与世界发达国家水平及中国发达地区水平、行业平均水平的差异,乃至重要物料计算是否准确。我甚至能比排计划的人,更能快速计算出物料需求量,生产中可能受阻的位置和可能受阻的时间等等。他们常常惊叹我对数字的敏感程度,以为我的记忆力超人。其实非也。到现在,我还会常常忘掉很多常用的电话号码,每次都要从手机中查,甚至不记得现在租住房子的门牌号码。之所以能记住与那么多与工作有关的数字,无非是我对工作用心,找到了一点点记住数字的技巧和规律。总结起来,其实也相当简单,就几句话:“记大数,略小数,有事没事,琢磨琢磨关键指标,盯紧异常数。
转自:
http://site.douban.com/129505/widget/notes/5254608/note/195879174/

Hadoop和云计算的关系

Hadoop组件

Hadoop组件


Hadoop主要是由HDFS和MapReduce组成,HDFS是一个分布式文件系统(Hadoop Distributed File System),MapReduce则是用于并行处理大数据集的软件框架。因此,Hadoop是一个能够对大量数据进行分布式处理的软件框架,它是一种技术的实现。
Hadoop是Apache基金会下的一款开源软件,
它实现了包括分布式文件系统HDFS和MapReduce框架在内的云计算软件平台的基础架构,并且在其上整合了包括数据库、云计算管理、数据仓储等一系列平台,其已成为工业界和学术界进行云计算应用和研究的标准平台。Hadoop现在已经广泛应用于包括国外的FaceBook,Twitter,Yahoo!等公司,国内的百度,阿里等,Hadoop运行在数以千计的服务器和数以万计的CPU的集群上。基于Hadoop,用户可编写处理海量数据的分布式并行程序,并将其运行于由成百上千个结点组成的大规模计算机集群上。
Hadoop已被全球几大IT公司用
作其”云计算”环境中的重要基础软件,如:雅虎正在开发基于Hadoop的开源项目Pig,这是一个专注于海量数据集分析的分布式计算程序。亚马逊公司则基于Hadoop推出了Amazon S3(Amazon Simple Storage Service),提供可靠,快速,可扩展的网络存储服务。因此,Hadoop是云计算中一部分技术的实现,而不是全部。
云计算是继1980年代大型计算机到客户端-服务器的大转变之后的又一种巨变,但云计算的概念其实早已提出很久,早在上世纪60年代,麦卡锡就提出了把计算能力作为一种像水和电一样的公用事业提供给用户的理念,这成为云计算思想的起源。在20世纪80年代网格计算、90年代公用计算,21世纪初虚拟化技术、SOA、SaaS应用的支撑下,云计算作为一种新兴的资源使用和交付模式逐渐为学界和产业界所认知。因此,云计算的存在只是一种新的商业计算模型和服务模式。