关系型数据库:
Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL
非关系型数据库:
NoSql、Cloudant、MongoDb、redis、HBase
还有我们学过的:
hdfs、hive数据仓库
两种数据库之间的区别:
关系型数据库
关系型数据库的特性
1、关系型数据库,是指采用了关系模型来组织数据的数据库;
2、关系型数据库的最大特点就是事务的一致性;
3、简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
4、关系型数据库重点在于实体与关系的选择,关系就是实体与实体之间的联系
关系型数据库的优点
1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等
其他模型来说更容易理解;
2、使用方便:通用的SQL语言使得操作关系型数据库非常方便;
3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率;
实体完整性是对关系中的记录唯一性,也就是主键的约束。准确地说,实体完整性是指关系中的主属性值不能为Null且不能有相同值。定义表中的所有行能唯一的标识,一般用主键,唯一索引 unique关键字,及identity属性比如说我们的身份证号码,可以唯一标识一个人.
参照完整性是指关系中的外键必须是另一个关系的主键有效值,或者是NULL。参考完整性维护表间数据的有效性,完整性,通常通过建立外部键联系另一表的主键实现,还可以用触发器来维护参考完整性
4、支持SQL,可用于复杂的查询。
存储方式:
1)以行和列的形式存储数据,以便于用户理解。这一系列的行和列被称为表,一组表组成了数据库。
2)关系:可以理解为一张二维表,每个关系都具有一个关系名,就是通常说的表名。 元组:可以理解为二维表中的一行,在数据库中经常被称为记录。 属性:可以理解为二维表中的一列,在数据库中经常被称为字段。 域:属性的取值范围,也就是数据库中某一列的取值限制。 关键字:一组可以唯一标识元组的属性。数据库中常称为主键,由一个或多个列组成。 关系模式:指对关系的描述,其格式为:关系名(属性1,属性2,…,属性N)。
3)数据存储方式:行存储,一个表里每一个对象的记录存储一行,一行里包括了该记录的所有特征
key 列1 列2 列3
1 1 1 1
关系型数据库的缺点
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
非关系型数据库
非关系型数据库的特性
1、使用键值对存储数据;
2、分布式;
分布式和集群的区别:
现在马云狠着买了5台服务器,每台服务器都跑天猫的代码,然后又搞了一个Nginx做负载均衡,这时候我们的请求由五台服务器完成的,第一次请求是第一台服务器响应,第二次请求是由第二台服务器响应,这样可以应对的并发量就是之前的5倍,马云很开心,美滋滋。
总结:多台服务器跑的都是一套完整的代码,这就叫集群。
随着淘宝的做大,功能也日益完善,加了很多的功能,在把一个项目都让一套tomcat跑,tomcat说它也很累,能不能少跑点代码,这时候分布式系统架构就产生了,我们把天猫这个大项目按功能划分为很多的模块,比如说单独一个系统处理订单,一个处理用户登录,一个处理后台等等,然后每一子系统都单独跑在一个tomcat中,和起来就是一个完整的天猫项目,这样对每一个tomcat就相对轻松一点。(如果某个子系统的压力还是很多,可以考虑对这个子系统再做集群)
总结:多台服务器合起来跑的才是一套完整代码,这就叫分布式。
3、一般不支持ACID(原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability))特性;
4、非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
非关系型数据库的优点
1、无需经过sql层的解析,读写性能很高;
2、基于键值对,数据没有耦合性,容易扩展;
3、存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,而关系型数据库则只支持基础类型。
存储方式:
1)以列为单位进行数据的存储,一列作为一个记录,每个对象的记录会存储多行,各行相对独立;
2)数据存储方式:
key 列名 值
1 列1 1
1 列2 1
1 列3 1
非关系型数据库的缺点
1、不提供sql支持,学习和使用成本较高;
2、无事务处理,附加功能和报表等支持也不好;
关系型数据库与非关系型数据库的应用场景
关系型数据库:
使用场景:
1)需要做复杂处理的数据;
2)数据量不是特别大的数据;
3)对安全性要求高的数据;
4)数据格式单一的数据;
使用场景:所有有逻辑关系的数据存储 管理系统、用户信息
非关系型数据库
使用场景:
1)海量数据存储;
2)多格式的数据存储;
3)对查询速度要求快的数据存储;
行为日志、埋点(触发事件,就将行为记录下来)、论坛、博客等
我们学过的数据存储机制的回顾
关系型数据库
mysql:
用的很多了,不在说明嘿嘿嘿
非关系型数据库
hbase:
HBase是一个分布式的、面向列的开源数据库
HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
他的使用通常需要zookeeper的支持
HBase中的所有数据文件都存储在Hadoop HDFS文件系统上
RowKey | ColumnFamily : CF1 | ColumnFamily : CF2 | TimeStamp | ||
Column: C11 | Column: C12 | Column: C21 | Column: C22 | ||
“com.google” | “C11 good” | “C12 good” | “C12 bad” | “C12 bad” | T1 |
两种文件类型:
1. HFile, HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile
2. HLog File,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File
安装:解压、配置文件
简单实用:
启动方式 :
bin/start-hbase.sh
对应的停止服务:
$ bin/stop-hbase.sh
1) 进入 HBase 客户端命令行
$ bin/hbase shell
2) 查看当前数据库中有哪些表
hbase(main)> list
3) 创建表
hbase(main)> create 'student','info'
4) 插入数据到表
hbase(main) > put 'student','1001','info:name','Thomas'
hbase(main) > put 'student','1001','info:sex','male'
hbase(main) > put 'student','1001','info:age','18'
hbase(main) > put 'student','1002','info:name','Janna'
hbase(main) > put 'student','1002','info:sex','female'
hbase(main) > put 'student','1002','info:age','20'
5) 扫描查看表数据
hbase(main) > scan 'student'
hbase(main) > scan 'student',{STARTROW => '1001', STOPROW => '1001'}
hbase(main) > scan 'student',{STARTROW => '1001'}
6) 查看表结构
hbase(main):012:0> describe ‘student’
7) 更新指定字段的数据
hbase(main) > put 'student','1001','info:name','Nick'
hbase(main) > put 'student','1001','info:age','100'
8) 查看 “指定行”或“指定列族:列 列 ” 的数据
hbase(main) > get 'student','1001'
hbase(main) > get 'student','1001','info:name'
9) 删除数据
删除某 某 rowkey 的 的 全部 数据: :
hbase(main) > deleteall 'student','1001'
某 删除某 rowkey 的某一列 数据:
hbase(main) > delete 'student','1002','info:sex'
10) 清空表数据
hbase(main) > truncate 'student'
尖叫提示:清空表的操作顺序为先 disable,然后再 truncating。
11) 删除表
为 首先需要先让该表为 disable 状态: :
hbase(main) > disable 'student'
能 然后才能 drop 这个表: :
hbase(main) > drop 'student'
尖叫提示:如果直接 drop 表,会报错:Drop the named table. Table must first be disabled
ERROR: Table student is enabled. Disable it first.
12) 统计表数据行数
hbase(main) > count 'student'
13) 变更表信息
将 info 列族中的数据存放 3 个版本:
hbase(main) > alter 'student',{NAME=>'info',VERSIONS=>3}
redis:
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。
数据模型
Redis的外围由一个键、值映射的字典构成。与其他非关系型数据库主要不同在于:Redis中值的类型 不仅限于字符串,还支持如下抽象数据类型:
键、值都为字符串的哈希表
值的类型决定了值本身支持的操作。Redis支持不同无序、有序的列表,无序、有序的集合间的交集、并集等高级服务器端原子操作。
redis提供五种数据类型:string,hash,list,set及zset(sorted set)。
存储:
redis使用了两种文件格式:全量数据和增量请求。
全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载;
增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。
redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。
安装:安装c支持、获取源码、编译生成可执行文件
Linux启动和测试:redis-server编译后在src目录下,可配置环境变量。
#加上`&`号使redis以后台程序方式运行
[root@hadoop01 redis-3.2.6]# redis-server & (redis-server /etc/redis/redis.conf &)
5779
#测试客户端连接
[root@hadoop01 redis-3.2.6]# redis-cli (redis-cli –h 127.0.0.1 -p 6379) 客户端连接服务端
127.0.0.1:6379> ping 使用ping测试是否连接正常,提供的测试命令
PONG
Redis.conf中设置密码:
[root@hadoop01 redis-3.2.6]# ./src/redis-cli -h 192.168.216.111 -p 6379
192.168.216.111:6379> ping
(error) NOAUTH Authentication required.
192.168.216.111:6379> auth root 输入密码
OK
192.168.216.111:6379> ping
PONG
友好停止redis的服务:
./redis-cli -h 192.168.216.111 -p 6379 shutdown
有密码时需要如下关闭:
127.0.0.1:6379> auth root
OK
127.0.0.1:6379> shutdown有密码时必须要进入客户端,输入密码才能关闭
not connected> select 1
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected>
可以直接使用kill杀死其pid:
[root@hadoop01 redis-3.2.6]# ps -ef | grep redis 查看是否启动
ps –ef | grep redis //服务正常启动的话,可以搜索到服务,端口为6379。
kill 9 进程号 //强制杀死进程
主从配置:主服务器不动
vi ./redis.conf
从服务器配置
slaveof 192.168.216.111 6379
masterauth root
从服务器需要重新设置绑定:
vi ./redis.conf
bind 127.0.0.1 192.168.216.112
保证启动从服务器的时候master安装目录下的dump.rdb文件被删除。
rm -rf ./dump.rdb
Redis的综合基础命令:
显示有多少个数据库:
192.168.216.111:6379> config get databases
1) "databases"
2) "16"
切换到数据库1,默认使用数据库0:
192.168.216.111:6379> select 1
OK
显示redis的数据库相关信息:
192.168.216.111:6379[1]> info
......一堆详细信息
显示info中keyspace(数据库)信息:
192.168.216.111:6379[1]> info keyspace
# Keyspace
db0:keys=3,expires=0,avg_ttl=0
db2:keys=1,expires=0,avg_ttl=0
显示所有数据库1中所有有效keys:
192.168.216.111:6379[1]> keys *
1) "test"
192.168.216.111:6379[1]> dbsize 显示所有keys的数量,包括未被销毁的key
(integer) 1
常用命令:
就DB来说,Redis成绩已经很惊人了,且不说memcachedb和tokyocabinet之流,就说原版的memcached,速度似乎也只能达到这个级别。Redis根本是使用内存存储,持久化的关键是这三条指令:SAVE BGSAVE LASTSAVE …
常见可执行文件:
redis-benchmark Redis性能测试工具
redis-check-aof 检查aof日志工具
redis-check-rdb 检查rdb日志工具
redis-cli 连接用的客户端
redis-sentinel Redis集群的管理工具 监控多个master-slave集群,发现master宕机后能进行自动切换
redis-server Redis服务程序
连接操作相关的命令
quit:关闭连接(connection)
auth:简单密码认证
ping 测定连接是否存活
持久化
save:将数据同步保存到磁盘
bgsave:将数据异步保存到磁盘
lastsave:返回上次成功将数据保存到磁盘的Unix时戳
shundown:将数据同步保存到磁盘,然后关闭服务,save保存,nosave 关闭不保存
远程服务控制
info:提供服务器的信息和统计
monitor:实时转储收到的请求,另外一个客户端监控
slaveof:改变复制策略设置,更改host port为slave
time:显示服务器时间,时间戳(秒),微秒数
bgrewriteaof:后台保存rdb快照
config:在运行时配置Redis服务器
config get 配置项:获取服务器配置的信息
config get "requirepass"
config set 配置项 值:设置配置项信息
对value操作的命令
exists(key):确认一个key是否存在
del(key):删除一个key
type(key):返回值的类型
keys (pattern):返回满足给定pattern的所有key
randomkey:随机返回key空间的一个
rename(oldname, newname):重命名key(有些版本是keyrename)
dbsize:返回当前数据库中key的数目
expire:设定一个key的活动时间(s)
ttl:获得一个key的活动时间
select(index):按索引查询
move(key, dbindex):移动当前数据库中的key到dbindex数据库
flushdb:删除当前选择数据库中的所有key
flushall:删除所有数据库中的所有key
对String操作的命令
strlen k1 字符串长度
set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value,没有key则创建
mget(key1, key2,…, key N):返回库中多个string的value
setnx(key, value):添加string,名称为key,值为value 已存在不会覆盖
setex(key, time, value):向库中添加string,设定过期时间time
mset(key N, value N):批量设置多个string的值
msetnx(key N, value N):如果所有名称为key i的string都不存在
incr(key):名称为key的string增1操作
incrby(key, integer):名称为key的string增加integer类型的值
decr(key):名称为key的string减1操作
decrby(key, integer):名称为key的string减少integer
append(key, value):名称为key的string的值附加value
substr(key, start, end):返回名称为key的string的value的子串,-1代表最后个
setrange age 位置 新增字符串 从指定位置替换成指定字符串
对List操作的命令
rpush(key, value):在名称为key的list尾添加一个值为value的元素
lpush(key, value):在名称为key的list头添加一个值为value的 元素
llen(key):返回名称为key的list的长度
lrange(key, start, end):返回名称为key的list中start至end之间的元素
ltrim(key, start, end):截取名称为key的list
lindex(key, index):返回名称为key的list中index位置的元素
lset(key, index, value):给名称为key的list中index位置的元素赋值
lrem(key, count, value):删除count个key的list中值为value的元素 2 123 删除两个123
lpop(key):返回并删除名称为key的list中的首元素
rpop(key):返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop命令的block版本。
brpop(key1, key2,… key N, timeout):rpop的block版本。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
链表结构的应用场景:
针对链表结构的Value,Redis在其官方文档中给出了一些实用技巧,如RPOPLPUSH命令,下面给出具体的解释。
Redis链表经常会被用于消息队列的服务,以完成多程序之间的消息交换。假设一个应用程序正在执行LPUSH操作向链表中添加新的元素,我们通常将这样的程序称之为"生产者(Producer)",而另外一个应用程序正在执行RPOP操作从链表中取出元素,我们称这样的程序为"消费者(Consumer)"。如果此时,消费者程序在取出消息元素后立刻崩溃,由于该消息已经被取出且没有被正常处理,那么我们就可以认为该消息已经丢失,由此可能会导致业务数据丢失,或业务状态的不一致等现象的发生。然而通过使用RPOPLPUSH命令,消费者程序在从主消息队列中取出消息之后再将其插入到备份队列中,直到消费者程序完成正常的处理逻辑后再将该消息从备份队列中删除。同时我们还可以提供一个守护进程,当发现备份队列中的消息过期时,可以重新将其再放回到主消息队列中,以便其它的消费者程序继续处理。(使用备份队列暂时存储准备消费的信息)。
对Set操作的命令
sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :移到集合元素
scard(key) :返回名称为key的set的基数
sismember(key, member) :member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
sunion(key1, (keys)) :求并集
sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
sdiff(key1, (keys)) :求差集
sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素
set应用范围:
1). 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
2). 充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势了。
对Hash操作的命令
hset(key, field, value):向名称为key的hash中添加元素field
hget(key, field):返回名称为key的hash中field对应的value
hmget(key, (fields)):返回名称为key的hash中field i对应的value
hmset(key, (fields)):向名称为key的hash中添加元素field
hincrby(key, field, integer):将名称为key的hash中field的value增加integer
hexists(key, field):名称为key的hash中是否存在键为field的域
hdel(key, field):删除名称为key的hash中键为field的域
hlen(key):返回名称为key的hash中元素个数
hkeys(key):返回名称为key的hash中所有键
hvals(key):返回名称为key的hash中所有键对应的value
hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
对sortset操作的命令
比如添加这样的值 zadd z1 59 zhangsan 就会根据第三个进行升序排序
zadd key score1 value1:添加元素
zrange key start stop [withscore]:把集合排序后,返回名次[start,stop]的元素默认是升续排列 withscores 是把score也打印出来
zrank key member:查询member的排名(升序0名开始)
zrangebyscore key min max [withscores] limit offset N:集合(升序)排序后取score在[min, max]内的元素,并跳过offset个,取出N个
ZRANGEBYSCORE z1 60 100 limit 0 3
zrevrank key member:查询member排名(降序 0名开始)
zremrangebyscore key min max:按照score来删除元素,删除score在[min, max]之间
zrem key value1 value2:删除集合中的元素
zremrangebyrank key start end:按排名删除元素,删除名次在[start, end]之间的
zcard key:返回集合元素的个数
zcount key min max:返回[min, max]区间内元素数量
zinterstore dest numkeys key1[key2..] [WEIGHTS weight1 [weight2...]] [AGGREGATE SUM|MIN|MAX]
numkey有多少个集合取交集
求key1,key2的交集,key1,key2的权值分别是weight1,weight2
聚合方法用 sum|min|max
聚合结果 保存子dest集合内
注意:weights,aggregate如何理解?
答:如果有交集,交集元素又有score,score怎么处理?aggregate num->score相加,min最小score,max最大score,另外可以通过weights设置不同的key的权重,交集时 score*weight进行排序,权重大的
举例说名:
zinterstore z3 2 z1 z2 weights 1 0.8 aggregate max
找到两个数据集的交集放到z3中
numberkey指定有几个集合进行取交集
weight 将交集的值乘以系数,乘以完系数之后将最大的值进行保存
sortset应用范围:
1). 可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOP TEN的用户信息。当然我们也可以利用ZRANK命令通过username来获取玩家的排行信息。最后我们将组合使用ZRANGE和ZRANK命令快速的获取和某个玩家积分相近的其他用户的信息。
2). Sorted-Sets类型还可用于构建索引数据。
elasticsearch:
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
ES与MySQL的对比:
MySQL ElasticSearch
——————————————————————
database(数据库) index(索引库)
table(表) type(类型)
row(行) document(文档)
column(列) field(字段)
安装:解压、配置文件
启动:(daemon: 精灵进程,后台进程的方式启动)
$ELASTICSEARCH_HOME/bin/elasticsearch -d
操作:
案例1:操作索引库bigdata下的type之product。
#①创建一个索引库 (客户端向远程es服务器发送请求的方式包括:get,post,put,delete等等)
curl -XPUT ‘http://JANSON01:9200/bigdata’
返回值{"acknowledged":true,"shards_acknowledged":true,"index":"bigdata"}
#②查看索引库bigdata的信息(元数据信息:描述信息)
curl -XGET 'http://JANSON01:9200/bigdata'
#③在索引库中添加若干索引信息
curl -H 'Content-Type: application/json' -XPOST 'http://had01:9200/bigdata/product/1?pretty' -d '{"name":"hadoop","author":"Doc Culting","version":"3.0.1" }'
curl -H 'Content-Type: application/json' -XPOST 'http://had01:9200/bigdata/product/2?pretty' -d '{"name":"hive","author":"刘德华","version":"2.5.1" }'
curl -H 'Content-Type: application/json' -XPOST 'http://had01:9200/bigdata/product?pretty' -d '{"name":"sqoop","author":"楚留香","version":"1.9.8" }'
curl -H 'Content-Type: application/json' -XPOST 'http://had01:9200/bigdata/product?pretty' -d '{"name":"flume","author":"lesie","version":"1.5.1" }'
curl -H 'Content-Type: application/json' -XPOST 'http://had01:9200/bigdata/product?pretty' -d '{"name":"hbase","author":"jack","version":"3.9.8" }'
#④查询索引库bigdata下面的type之product下所有的数据 (“所用”:指的是第一页的数据)
(若是不指定数据量<通过分页标识来指定>more显示的是第一页的10条记录。通过参数from指定索引的开始下标, size指定当前页要显示的记录条数)
curl -XGET 'http://JANSON01:9200/bigdata/_search?pretty'
附注:
from:指定索引的开始下标,从0开始计数。
size :指定当前页要显示的记录条数,默认是10
需求:每页显示2条记录,推导出from的规律。
currentPageNo from
________________________________
1 0
2 2
...
n (n-1)*size
#⑤只查询索引库bigdata下面的type之product下_source中的字段name,author (类似于: select name,author from tb_product)
curl -XGET 'http://JANSON01:9200/bigdata/_search?pretty&_source=name,author'
#⑥条件查询:查询name为hbase的索引信息。 (类似于: select * from tb_product where name='hbase')
curl -XGET 'http://JANSON01:9200/bigdata/product/_search?pretty&q=name:hbase'
curl -XGET 'http://JANSON01:9200/bigdata/product/_search?pretty&q=name:hbase,flume'
(类似于: select * from tb_product where name='hbase' or name='flume'
select * from tb_product where name in ('hbase','flume') )
#⑦通配符查询案例:查询name以h打头的索引信息。 (类似于: select * from tb_product where name like 'h%')
curl -XGET 'http://JANSON01:9200/bigdata/product/_search?pretty&q=name:h*'
#⑧更新:
# 全局更新 ~> 一般不使用
#使用post put都可以
使用post,将索引标识为yEUC32cBcPsnu3_raoHh索引信息更新为:"name":"Flume", "author":"郭富城"
curl -H 'Content-Type: application/json' -XPOST 'http://JANSON01:9200/bigdata
/product/yEUC32cBcPsnu3_raoHh?pretty' -d'{"name":"Flume", "author":"郭富城"}'
curl -H 'Content-Type: application/json' -XPUT 'http://JANSON01:9200/bigdata
/product/yEUC32cBcPsnu3_raoHh?pretty' -d'{"name":"Fluming", "author":"Aron"}'
#⑨批量操作:
前提:
①新建名为bank的索引库
②将带处理的数据上传到linux指定目录下
③进行批量导入操作
curl -H "Content-Type: application/json" -XPOST
'http://had01:9200/bank/account/_bulk?pretty' --data-binary @/datas/accounts.json
ElasticSearch的集群状态:
Green: 所有的主分片和副分片都可用
Yellow:所有的主分片都可用,不是所有的副分片都可用
Red: 不是所有的主分片和副分片都可用
Bulk请求可以在URL中声明/_index或者/_index/_type
Bulk一次最大处理多少数据量
Bulk会把将要处理的数据载入内存中,所以数据量是有限制的
最佳的数据量不是一个确定的数值,它取决于你的硬件,你的文档大小以及复杂性,你的索引以及搜索的负载
一般建议是1000~5000个文档,如果你的文档很大,可以适当减少队列,大小建议是5~15MB,默认不能超过100M,可以在es的配置文件中修改这个值
http.max_content_length: 100mb
#⑩删除一个文档:需求~>删除一个唯一标识为
curl -XDELETE 'http://JANSON01:9200/bigdata/product/yUUC32cBcPsnu3_rbIEE'
注意:
a)针对当前记录,仅仅是添加了一个删除标记,没有真正从物理上删除掉。(是一个逻辑删除)
b) curl -XPOST 'http://janson01:9200/bigdata/_optimize?only_expunge_deletes=true' ~> 通过curl命令行方式执行物理删除
TransportClient的实例.
admin().indices().prepareOptimize("bigdata").setOnlyExpungeDeletes(true).get(); ~> 通过Java API方式执行物理删除
ES常用插件(bigdesk, head, kibana、Logstash)
bigdesk:监控工具,监控es健康状态
head:对es做基础操作
kibana :图表展示
Logstash:日志拉取存储
mongodb:
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
为什么要使用mongodb:
大部分程序传过来的数据都是json的格式,而mongodb就是存储的这种格式的数据
支持集群:可以存储海量数据、
支持分片:方便查找
mongodb数据库介于结构化与非结构化数据之间
表不叫表叫做集合(collectuon)
支持集群、高可用
存储的数据是json数据
不支持SQL语言
安装
关于yum源的解释:
设置本地yum源,如果软件在线安装的话就会很慢,可以配置本地yum源
一台机器下载好了之后所有机器就访问这台机器下载就可以了。这就是配置本地yum源的作用。
#配置mongo的yum源
sodu vi /etc/yum.repos.d/mongodb-org-3.4.repo
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
#关闭selinux
vi /etc/sysconfig/selinux
SELINUX=disabled
#重新启动
reboot
sudo yum install -y mongodb-org
#修改mongo的配置文件
sudo vi /etc/mongod.conf
#注释掉bindIp或者修改成当前机器的某一个ip地址
#启动mongo
sudo service mongod start
#连接到mongo
#如果注释掉了bindIp,那么连接时用
mongo
#指定了ip地址
mongo --host 192.168.10.20 --port 27017
#使用或创建database
use xiaoniu
#创建集合(表)
db.createCollection("bike")
#插入数据
db.bike.insert({"_id": 100001, "status": 1, "desc": "test"})
db.bike.insert({"_id": 100002, "status": 1, "desc": "test"})
#查找数据(所有)
db.bine.find()
#退出
exit
#关闭mongo服务
sudu service mongod stop
#设置服务开机启动
sudo checkconfig mongod on
#设置mongo服务开机不启动
sudo chkconfig mongod off
***************mongodb数据库先进入数据库*****************
如果需要查看数据库以及数据库下的所有表必须先进行输入用户名以及密码
超级管理员可以管理数据库,普通管理员进行管理数据库下的表
------------------------------------------------------------------------------------------------
###mongo安全认证配置###
#如果修改了mongo存储是的目录那么一定要修改该目录的所属用户和组为mongod
在root下安装mongo数据库也需要修改
#chown -R mongod:mongod /mongo/
------------------------------------------------------------------------------------------------
#添加管理员用户
#使用admin这个database
use admin
#在没有开启认证的情况下,创建一个超级用户
db.createUser(
{
user: "ljq",
pwd: "ljq123",
roles: [ {role: "root", db: "admin" }]
}
)
#修改mongo的配置文件/etc/mongod.conf,配置mongo的安全认证
security:
authorization: enabled
#重启mongo服务
service mongod restart
#重新使用mongo shell连接
mongo
#使用admin database
use admin
#授权登录
db.auth("admin", "admin123")
#创建一个bike数据库
use bike
#添加一个普通用户,具备读写权限
db.createUser(
{
user: "xiaolan",
pwd: "123",
roles: ["readWrite"]
}
)
#使用xiaolan用户登录
mongo
use bike
db.auth("xiaoniu", "123568")
#在database下创建collection
db.createCollection("users")
db.createCollection("bikes")
基本操作:
#插入数据
db.logs.insert( { name: "laozhao", age: 30 } )
#查找
db.users.find()
#multi如果有重复的都进行更新
db.logs.update({'name':'laozhao'},{$set:{'age': 18}},{multi:true})
db.logs.remove({'name': 'laoduan'})
db.logs.remove({'name': 'laoduan'}, 1)
db.logs.find({"name":"laoduan", "fv": 99.99})
#查看当前db的索引(查询起来非常快)
db.logs.getIndexes()
#创建索引
1代表排序的时候升序,-1代表排序的时候降序
db.logs.ensureIndex({"name":1})
#删除索引
db.logs.dropIndex({"name":1})
#开启运行用户从其他机器连接mongodb
#不然会报错Caused by: java.net.ConnectException: Connection refused (Connection refused)
#修改/etc/mongod.conf,注释掉bindIp:
# bindIp:
#重启mongodb
service mongod restart
*******mongodb踩过的坑:*********
yum进行安装:
Could not retrieve mirrorlist http://mirrorlist.repoforge.org/el6/mirrors-rpmforge error was
14: PYCURL ERROR 7 - "couldn't connect to host"
http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/repodata/repomd.xml: [Errno 14]
PYCURL ERROR 7 - "couldn't connect to host"
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: rpmforge.
Please verify its path and try again
网址访问不了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
spark2.3.0 mongo版本>3.2 我用的4.0开始用的是2.6.11()
hive:
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
元数据存储
Hive 将元数据存储在数据库中,如 mysql、derby。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
解释器、编译器、优化器、执行器
解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后由 MapReduce 调用执行。
安装:解压、配置文件
启动:bin/hive
..............................................额。。。。。。。。。。。。。。。。。
存储格式:
(1) textfile
textfile为默认格式,存储方式为行存储。
(2)ORCFile
hive/spark都支持这种存储格式,它存储的方式是采用数据按照行分块,每个块按照列存储,其中每个块都存储有一个索引。特点是数据压缩率非常高。
1.3 Parquet
Parquet也是一种行式存储,同时具有很好的压缩性能;同时可以减少大量的表扫描和反序列化的时间。
hdfs:
Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。
简单的一致性模型
HDFS应用需要一个“一次写入多次读取”的文件访问模型。一个文件经过创建、写入和关闭之后就不需要改变。这一假设简化了数据一致性问题,并且使高吞吐量的数据访问成为可能。Map/Reduce应用或者网络爬虫应用都非常适合这个模型。目前还有计划在将来扩充这个模型,使之支持文件的附加写操作。
“移动计算比移动数据更划算”
一个应用请求的计算,离它操作的数据越近就越高效,在数据达到海量级别的时候更是如此。因为这样就能降低网络阻塞的影响,提高系统数据的吞吐量。将计算移动到数据附近,比之将数据移动到应用所在显然更好。HDFS为应用提供了将它们自己移动到数据附近的接口。
数据存储综合应用场景