- 不支持对数据改写和添加。
- 支持索引。
- 支持不同数据范例。
- 将元数据保存在关系数据库中,淘汰查询中实行语义检差时间。
- 内置大量用户函数UDF操作数据发掘工具。
长处:
- 得当大数据批量处理。
- 充分利用集群的CPU计算资源。
- 支持标准SQL语法,淘汰了开发本钱。
- 有精良拓展性。
缺点:
实例:使用HIVE实现单词计数:
前置知识:
explode()函数:接收一个数组array,把其中每个元素转换为一行。
Split()函数:将字符串按照指定的分隔符举行分割。
Explode(split(sentence, ‘’)):先将句子按照空格分割存在数组中,然后将数组中每个元素转换为1行。
详细实现:
Select word,count(*)
From(
Select explode(split(sentence, ‘ ‘)) as word
From article
) t
Group by word;
实用场景:
海量存储处理
数据发掘
海量数据离线分析
不实用场景:
复杂的呆板学习算法
复杂的科学计算
联机交互式实时查询
HIVE的内部表和外部表:
- hive完全管理内部表数据,删除内部表意味着数据完全丢失。
Create table 表名()
Row format delimited fields terminated by ‘,’;
- 外部表由用户管理,hive只会维护外部表的元数据,而不做现实的存储和管理。
Create external table 表名()
Row format delimited fields terminated by ‘,’ location ‘’;
HIVE的静态分区表与动态分区表
Create table 表名() partitioned by()
Row format delimited fields terminated by ‘,’;
主要区别:是否需要在插入数据的时候指定详细分区。
HIVE的桶表
建表:create table 表名()clusterd by (age) into 4 buckets.
查询:select * from 表名 tablesample(bucket 1 out of 2 on age);//从桶1开始抽,抽2个。
Hive语法(hive没有主键概念):
Case... when...then
//查询emp表的员工姓名、薪水;如果小于2000为low,2000到5000为middle,大于5000为high.
Select ename,sal,case when sal<2000 then ‘low’ when sal between 2000 and 5000 then ‘middle’ else ‘high’ end as label from emp;
2.HDFS
NameNode(名称节点)的职责:
- 管理维护HDFS命名空间,管理DataNode上文件Block的均衡。(Block:datanode存储数据的基本单位,默认巨细128MB,默认环境下,一个block会被复制在3个不同的DataNode上)
- 接收客户端上传、下载、创建目次等的请求。
- 维护edit log和fsimage。
Hdfs中的元数据
在HDFS中,元数据是关于文件或目次的形貌信息,如文件所在路径、文件名称和文件范例等。详细来说,元数据会包括文件、目次名称,文件的生成时间、副本数和权限,被分割成的多个数据块的信息。
NameNode的edit log(操作日志文件)和fsimage:
- Edit log:记录对hdfs举行写操作的所有日志。
- Fsimage:保存元信息,只会展示最终产生的结果数据。
HDFS对名称节点设置了备份机制,会将名称节点中的Fsimage和EditLog同步到备份服务器。
一个数据块在一个DataNode中最多只有一个备份。
DataNode的机架感知与副本冗余策略:
综合考量安全性和服从性。安全性:将一个数据块放在不同机架上。服从性:不同节点通信只管放在一个机架上。最终会产生的机架感知策略图为:
Secondary NameNode:
实行查抄点(CheckPoint)操作,定期将edits日志中最新的状态信息合并到fsimage中,防止edits过大。
欣赏HDFS目次的方式:
- HDFS命令
- 通过Web欣赏器
- 通过Eclipse的Project Explorer
3.HBASE
Create_namespace‘test1’,{METHOD=>’set’,’hbase.namespace.quota.maxregion’=>’10}
Create‘test:student’,{NAME=>’info’},{NAME=>’coure’, VERSIONS=>’5’}
desc,describe.list,exists
Create ‘practice’,’f1’,SPLITS=>[‘10’,’30’,’40’]
Alter‘practice’,{NAME=>’f1’,METHOD=>’delete’},{NAME=>’f2’},{NAME=>’f3’,VERSIONS=>’20’},MAX_FILESIZE=>’134217728’
Disable ‘practice’
Drop ‘practice’
行键:唯一标识一行数据
列族:一组相关列的集合,一般在1-2个
Eg:
put ‘scores’, ‘Tom’, ‘course:math’,’97’
Put ‘scores’, ‘Tom’, ‘course:art’, ‘87’
Put ‘scores’, ‘Tom’, ‘cource:english’,’80’
其中,‘Tom’为行键,唯一标识一行数据,course为列族,math,art,english为列限定符。
Get ‘scores’,’Tom’,{COLUMN => ‘course’}
查看某列数据
Get ‘scores’,’Tom’,{column => ‘course:english’}
- 表数据扫描 scan ‘表名’+其他参数 => 设置条件(相当于sql的select ... from ... where...)
设置过滤条件
Scan‘student’,{COLUMN=>‘age’,FILTER=>”ValueFilter(=,’binary:20’)”}
设置返回列数
Scan ‘student’,{COLUMN=>’age’,limit=>10}
设置倒序输出
Scan ‘student’,{column=>’age’,REVERSED=>TRUE}
Count ‘scores’
Delete ‘scores’,’Jim’,’course:chinese’ // 删除某列
Deleteall ‘scores’,’Jim’ //删除整行
Truncate ‘scores’
Truncate_preserve ‘t2’
- Hbase每条数据项都有版本形貌。
- Hbase行是有序的,数据被切分为多个Region,列在所在列族存在的环境下可以自由添加。Cell(单元格)是最小存储单元,由行键、列族、列限定符和时间戳唯一确定。
- HBASE不支持多表连接,RDBMS支持。
- HBase基于列式存储,RDBMS基于表格结构和行式存储。
- Hbase可以轻易添加以后节点,兼容性高;关系型数据库需要中间层。
- 单个RowKey举行get。
- 通过rowkey的range举行scan。
- 全表扫描。
大量读写请求集中在少部分RegionServer,导致数据倾斜,集群资源利用不均衡。
RowKey优化设计:加随机数,哈希,反转,时间戳反转。
Admin:创建表、删除表、添加删除表列族成员。
//创建表
HTableDescriptor ht = new HTableDescriptor(tableName);
//添加列族
ht.addFamily(new HcolumnDescriptor(“f1”));
ht.addFamily(new HcolumnDescriptor(“f2”));
//设置region分割点
Byte[][] regions = new byte[][]{
‘10’.getBytes(),
‘20’.getBytes(),
‘30’.getBytes(),
‘40’.getBytes()
};
//创建表
Admin.createTable()
//删除表
Admin.disableTable()
Admin.deleteTable()
- HBaseAPI举行简单查询->查询empno在7500以上的用户信息
//创建实行扫描的类
Scan scan = new Scan();
//创建起始行
Scan.setStartRow(“7500”.getBytes());
//根据scan对象的参数举行扫描操作
ResultScanner result = table.getScanner(scan);
Result rs;
//查询满足条件cell的行键列族列限定符和值
While((rs=result.hasNext()!=null){
For(Cell cell:rs.rawCells()){ //返回所有的cell对象
//以下返回的数据范例都是字节数组,转换成字符串需要new String
//行键
CellUtil.cloneRow(cell);
//列族
CellUtil.cloneFamily(cell);
//列限定符
CellUtil.cloneQualifier(cell);
//值
CellUtil.cloneValue(value);
}
}
4.MapReduce
- Map负责拆分,Reduce按键聚合返回需要的值。
- 运行流程: input, split, map, shuffle,reduce,output
- 将输入数据集分成多个分片,每个分片一个map任务。
- MapTask分析出一个个键值对,并举行分区和排序决定发送给那个Reducer。
- Reducer收到多个Mapper的数据,举行全局排序,确保相同key的聚集在一起。
- MRAppMaster:过程调度与状态协调。
- mapTask:map阶段处理流程。
- reduceTask:reduce阶段处理流程。
客户端向ResourceManaget发送请求,申请唯一作业ID,ResourceManager响应请求,返回一个用于提交资源的路径和分配作业ID。客户端按照要求提交作业。
当集群有空闲的nodemanager时,会从调度队列调取待实行的作业并为其创建一个Container,在Container启动Application Master实例。Application Master接纳轮询的方式通过RPC协议向ResourceManager申请资源以运行map reduce任务。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |