什么是Redis持久化?
Redis
作为一个键值对内存数据库(NoSQL
),数据都存储在内存当中,在处理客户端请求时,所有操作都在内存当中进行,如下所示:
这样做有什么问题呢?
[TOC]
Kylin的三大依赖模块分别是数据源、构建引擎和存储引擎。默认这三者分别是Hive、MapReduce和HBase。但随着调研和使用的深入,渐渐有用户发现它们均存在不足之处。
比如 Hive 不应该用来进行实时的查询,因为它需要很长时间才可以返回结果。同时想要将数据实时的插入hive中则完全没有可操作性。
至于 HBase虽然非常适用于海量明细数据(十亿、百亿)的随机实时查询但只提供了简单的基于 Key 值的快速查询能力—,没法进行大量的条件查询,对于数据分析来说,不太友好。
在大数据架构中,Hive和HBase是协作关系,Hive方便地提供了Hive QL的接口来简化MapReduce的使用, 而HBase提供了低延迟的数据库访问。如果两者结合,可以利用MapReduce的优势针对HBase存储的大量内容进行离线的计算和分析。
Hive 整合 hbase 为用户提供一种 sqlOnHbase 的方法。Hive 与 HBase 整合的实现是利用两者本身对外的 API 接口互相通信来完成的,其具体工作交由 Hive 的 lib 目录中的 hive-hbase-handler-xxx.jar
工具类来实现对 HBase 数据的读取。
通过HBaseStorageHandler,Hive可以获取到Hive表所对应的HBase表名,列簇和列,InputFormat、OutputFormat类,创建和删除HBase表等。
Hive访问HBase中HTable的数据,实质上是通过MR读取HBase的数据,而MR是使用HiveHBaseTableInputFormat完成对表的切分,获取RecordReader对象来读取数据的。
对HBase表的切分原则是一个Region切分成一个Split,即表中有多少个Regions,MR中就有多少个Map;
读取HBase表数据都是通过构建Scanner,对表进行全表扫描,如果有过滤条件,则转化为Filter。当过滤条件为rowkey时,则转化为对rowkey的过滤;Scanner通过RPC调用RegionServer的next()来获取数据。
因为Hive与HBase集成是利用两者本身对外的API接口互相通信来完成的,其具体工作交由Hive的lib目录中的hive-hbase-handler-.jar工具类来实现。所以只需要将hive的 hive-hbase-handler-.jar
复制到hbase/lib
中就可以了。
1 | cp /usr/local/hive/lib/hive-hbase-handler-2.3.7.jar /usr/local/hbase/lib/ |
注: 如果在hive整合hbase中,出现版本之类的问题,那么以hbase的版本为主,将hbase中的jar包覆盖hive的jar包。
1 | # Hive 语句 |
说明:
这里面出现了三个t_employee表名,第一个t_employee 是hive表中的名称,(id int,name string) 是hive表结构。
在tblproperties 语句中还出现了2个t_employee表,”hbase.table.name”定义的是在hbase中的表名 ,这个属性是可选的,仅当你想在Hive和Hbase中使用不同名字的表名时才需要填写,如果使用相同的名字则可以省略;
“hbase.mapred.output.outputtable”定义的第三个t_employee是存储数据表的名称,指定插入数据时写入的表,如果以后需要往该表插入数据就需要指定该值,这个可以不要,表数据就存储在第二个表中了 。
stored by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’ :是指定处理的存储器,就是hive-hbase-handler-*.jar包,要做hive和hbase的集成必须要加上这一句;
“hbase.columns.mapping” 是定义在hive表中的字段怎么与hbase的列族进行映射。
例如:st1就是列族,name就是列。它们之间通过“:”连接。
在hive中创建的t_employee表,包括两个字段(int型的id和string型的name),映射为hbase中的表t_employee,其中:key对应hbase的rowkey,value对应hbase的st1:name列。
控制HBase字段和Hive之间的映射有两种SERDEPROPERTIES
:
目前所支持的字段映射多少是有些难处理或存在约束的:
hbase.columns.mapping
)指定对应的入口(Hive表有n个字段,则该字符串得指定n个入口),在各个入口之间不能由空格(因为空格会被解析成字段名中的一部分)。hbase.table.default.storage.type
的值进入hbase之后,在t_employee中添加两条数据 然后查询该表
1 | put 't_employee','1001','st1:name','zhaoqian' |
查询结果:
然后切换到hive中查询该表
至此,hive 集成hbase 就到此告一段落。
[[hbase-1-4-13-安装部署]]
[[hive2-3-7安装]]
[TOC]
创建表的时候,comment说明字段包含中文,表成功创建成功之后,中文说明显示乱码
1 | create table if not exists capacity_stats_live_access ( |
这是因为在MySQL中的元数据出现乱码
因为我们知道 metastore 支持数据库级别,表级别的字符集是 latin1
。
那么我们只需要把相应注释的地方的字符集由 latin1 改成 utf-8,就可以了。用到注释的就三个地方,表、分区、视图。如下修改分为两个步骤:
修改表字段注解和表注解 COLUMNS_V2
,TABLE_PARAMS
修改分区字段注解 PARTITION_PARAMS
,PARTITION_KEYS
修改索引注解INDEX_PARAMS
修改hive-site.xml配置文件
1 | <property> |
发现注释还是乱码。
把表删除然后重新创建。效果如下:
Hive复合数据类型array,map,struct的使用_Life is for sharing的博客-CSDN博客
毕竟HIVE穿着SQL的外壳,肯定支持诸如Mysql这种RDBMS的数据类型,如int
,varchar
,但是它还具有非常多自有的数据类型,包括复杂的数据类型(数组,Map等)也是支持的!
数字类型,日期类型,String类型,Boolean类型我们都是比较熟悉的,也比较简单,就不讲解了。演示一下复杂数据类型:
1 | hive (hive)> create table arraytest (id int,course array<string>) |
说明:
row format delimited fields terminated by','
是指定列与列之间的分隔符,此处为”,”collection items terminated by':'
是指定集合内元素之间的分隔符,此处为”:”因此我们要导入到hive中的数据应该是形如:
1 | 1,math:chinese |
数据加载到数据库
1 | hive> load data local inpath '/Users/fengxuechao/WorkSpace/software/hive_data/arraytest.txt' into table arraytest; |
查询所有数据:
1 | hive> select * from arraytest; |
查询数组指定索引的所有数据:
1 | hive> select course[1] from arraytest; |
创建表
1 | hive> create table maptest(name string,score map<string,float>) |
数据
1 | '小明',math:96|chinese:95 |
数据加载到数据库
1 | hive> load data local inpath '/Users/fengxuechao/WorkSpace/software/hive_data/maptest.txt' into table maptest; |
查询所有数据:
1 | hive> select * from maptest; |
查询数组指定key的所有数据:
1 | hive> select name,score['math'] from maptest; |
创建表
1 | hive> create table struct_test(name string,course struct<course:string,score:int>) |
数据
1 | 小明,math:79 |
数据加载到数据库
1 | hive> load data local inpath '/Users/fengxuechao/WorkSpace/software/hive_data/struct_test.txt' into table struct_test; |
查询所有数据:
1 | hive> select * from struct_test; |
[TOC]
随着移动互联网、物联网等技术的发展,近些年人类所积累的数据正在呈爆炸式的增长,大数据时代已经来临。但是海量数据的收集只是大数据技术的第一步,如何让数据产生价值才是大数据领域的终极目标。Hadoop的出现解决了数据存储问题,但如何对海量数据进行OLAP查询,却一直令人十分头疼。
企业中的查询大致可分为即席查询和定制查询两种。之前出现的很多OLAP引擎,包括Hive、Presto、SparkSQL等,虽然在很大程度上降低了数据分析的难度,但它们都只适用于即席查询的场景。它们的优点是查询灵活,但是随着数据量和计算复杂度的增长,响应时间不能得到保证。而定制查询多数情况下是对用户的操作做出实时反应,Hive等查询引擎动辄数分钟甚至数十分钟的响应时间显然是不能满足需求的。在很长一段时间里,企业只能对数据仓库中的数据进行提前计算,再将算好后的结果存储在MySQL等关系型数据库中,再提供给用户进行查询。但是当业务复杂度和数据量逐渐升高后,使用这套方案的开发成本和维护成本都显著上升。因此,如何对已经固化下来的查询进行亚秒级返回一直是企业应用中的一个痛点。
在这种情况下,Apache Kylin应运而生。不同于“大规模并行处理”(Massive Parallel Processing,MPP)架构的Hive、Presto等,Apache Kylin采用“预计算”的模式,用户只需要提前定义好查询维度,Kylin将帮助我们进行计算,并将结果存储到HBase中,为海量数据的查询和分析提供亚秒级返回,是一种典型的“空间换时间”的解决方案。Apache Kylin的出现不仅很好地解决了海量数据快速查询的问题,也避免了手动开发和维护提前计算程序带来的一系列麻烦。
Apache Kylin™是一个开源的、分布式的分析型数据仓库,提供 Hadoop 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc.开发并贡献至开源社区。
如果想要知道Kylin是如何实现超大数据集的秒级多维分析查询,那么就得了解Kylin的架构原理。
Kylin实现秒级查询的关键点是预计算,对于超大数据集的复杂查询,既然现场计算需要花费较长时间,那么根据空间换时间的原理,我们就可以提前将所有可能的计算结果计算并存储下来,把高复杂度的聚合运算、多表连接等操作转换成对预计算结果的查询,比如把本该进行的Join、Sum、CountDistinct等操作改写成Cube的查询操作。从而实现超大数据集的秒级多维分析查询。
预计算大概流程就是:将数据源中的数据按照指定的维度和指标,由计算引擎MapReduce离线计算出所有可能的查询结果(即Cube)存储到HBase中。HBase中每行记录的Rowkey由维度组成,度量会保存在 column family中。为了减小存储代价,这里会对维度和度量进行编码。查询阶段,利用HBase列存储的特性就可以保证Kylin有良好的快速响应和高并发。
需要注意的是:Kylin的三大依赖模块分别是数据源、构建引擎和存储引擎。默认这三者分别是Hive、MapReduce和HBase。但随着推广和使用的深入,渐渐有用户发现它们均存在不足之处。比如,实时分析可能会希望从Kafka导入数据而不是从Hive;而Spark的迅速崛起,又使我们不得不考虑将MapReduce替换为Spark,以期大幅提高Cube的构建速度;至于HBase,它的读性能可能还不如Cassandra或Kudu等。因此Kylin1.5版本的系统架构进行了重构,将数据源、构建引擎、存储引擎三大依赖抽象为接口,而Hive、MapReduce、HBase只是默认实现。深度用户可以根据自己的需要做二次开发,将其中的一个或多个替换为更适合的技术。
1 | ln -s /opt/apache-kylin-3.1.0-bin-hbase1x /usr/local/kylin |
1 | vi /etc/profile |
1 | KYLIN_HOME=/usr/local/kylin |
1 | source /etc/proifle |
1 | bin/check-env.sh |
此处mac有坑,因为检查脚本使用的是gnu的一些命令,和mac上的命令不同。所以需要安装gnu命令:
1 | brew install gnu-sed |
1 | # 检查环境 |
Apache Hive™数据仓库软件有助于使用SQL读取,编写和管理驻留在分布式存储中的大型数据集。可以将结构投影到已存储的数据中。提供了命令行工具和JDBC驱动程序以将用户连接到Hive。
hive提供了SQL查询功能 hdfs分布式存储。
hive本质HQL转化为MapReduce程序。
如果想用hive的话,需要提前安装部署好hadoop集群。
1 | ln -s /opt/apache-hive-2.3.7-bin /usr/local/hive |
1 | vi /etc/profile |
1 | HIVE_HOME=/usr/local/hive |
1 | cd /usr/local/hive |
1 | <configuration> |
下面的部分如果不配置会产生错误
1 | <property> |
1 | # 添加 |
1 | vi hive-log4j.properties |
1 | hive.log.dir=自定义目录 |
1 | cp /mnt/share/mysql-connector-java-5.1.47.jar /usr/local/hive/lib/ |
1 | /usr/local/hive/bin/schematool -dbType mysql -initSchema |
1 | /usr/local/hive/bin/hive |
1 | create table users(user_id int,username varchar(20),pwd varchar(20),email varchar(30),grade int); |
[TOC]
HBase = Hadoop database,Hadoop数据库
开源数据库
官网:hbase.apache.org/
HBase源于Google的BigTable
Apache HBase™是Hadoop数据库,是一个分布式,可扩展的大数据存储。
当需要对大数据进行随机、实时读/写访问时,请使用Apache HBase™。该项目的目标是托管非常大的表 - 数十亿行X百万列 - 在商品硬件集群上。Apache HBase是一个开源的,分布式的,版本化的非关系数据库nosql,模仿Google的Bigtable: Chang等人的结构化数据分布式存储系统。正如Bigtable利用Google文件系统提供的分布式数据存储一样,Apache HBase在Hadoop和HDFS之上提供类似Bigtable的功能。
HBase可执行基于Yarn平台的计算任务,但不擅长。
< !–more–>
HRegionServer结构:
主机名 | IP |
---|---|
centos-node1 | 192.168.99.101 |
centos-node2 | 192.168.99.102 |
centos-node3 | 192.168.99.103 |
1 | $ tar -zxvf hbase-1.4.13.tar.gz -C 目标目录 |
1 | $ vi hbase-env.sh |
1 | # The java implementation to use. Java 1.7+ required. |
1 | $ vi hbase-site.xml |
1 | <configuration> |
加入节点主机名
1 | centos-node1 |
1 | $ cd /usr/local/hbase/lib |
把相关版本的zookeeper和hadoop的依赖包导入到hbase/lib
1 | $ ln -s /usr/local/hadoop/etc/hadoop/core-site.xml /usr/local/hbase/conf/core-site.xml |
1 | $ scp -r /usr/local/hbase centos-node2:/usr/local/ |
1 | $ vi /etc/profile |
1 | JAVA_HOME=/usr/local/java/ |
1 | $ source /etc/profile |
1 | # 查看当前区域 |
或者
1 | $ systemctl stop firewalld |
hbase-daemon.sh start master
hbase-daemon.sh start regionserver
hbase-daemon.sh stop master
hbase-daemon.sh stop regionserver
1 | # 进入终端 |
1 | # 查询表 |
1 | # 显示服务器状态 |
1 | # 显示当前用户 |
1 | # 创建表 |
1 | # 表的一些操作 |
[TOC]
下载过程就不说了,我们下载了最新的zookeeper-3.4.14
。
1、上传安装包
把下载的最新的包(如:zookeeper-3.4.14.tar.gz)上传到服务器,上传的方式也不多说了。
2、解压
1 | $ tar zxvf zookeeper-3.4.14.tar.gz |
3、移动到/usr/local目录下
1 | $ ln -s zookeeper-3.4.14 /usr/local/zookeeper |
主机名 | IP |
---|---|
centos-node1 | 192.168.99.101 |
centos-node2 | 192.168.99.102 |
centos-node3 | 192.168.99.103 |
Zookeeper集群原则上需要2n+1个实例才能保证集群有效性,所以集群规模至少是3台。
下面演示如何创建3台的Zookeeper集群,N台也是如此。
1、创建数据文件存储目录
1 | $ cd /usr/local/zookeeper |
2、添加主配置文件
1 | $ cd conf |
3、修改配置
1 | $ vi zoo.cfg |
先把dataDir=/tmp/zookeeper
注释掉,然后添加以下核心配置。
1 | dataDir=/usr/local/zookeeper/data |
4、创建myid文件
1 | $ cd ../data |
每台机器的myid里面的值对应server.后面的数字x。
5、开放3个端口
使用 iptables
1 | $ sudo /sbin/iptables -I INPUT -p tcp --dport 2181 -j ACCEPT |
或者 firewalld
1 | # 查看当前区域 |
6、配置集群其他机器
把配置好的Zookeeper目录复制到其他两台机器上,重复上面4-5步。
1 | $ scp -r /usr/local/zookeeper centos-node2:/usr/local/ |
1 | $ vi /etc/profile |
1 | JAVA_HOME=/usr/local/java/ |
7、重启集群
1 | $ /usr/local/zookeeper/bin/zkServer.sh start |
3个Zookeeper都要启动。
8、查看集群状态
1 | $ /usr/local/zookeeper/bin/zkServer.sh status |
1 | ./zkCli.sh -server 192.168.99.101:2181 |
连接本机的不用带-server。
如果是在单机创建的多个Zookeeper伪集群,需要对应修改配置中的端口、日志文件、数据文件位置等配置信息。
限制每台server的连接数,用于保护避免过载,可起到限流作用。测试参考配置如下:
1 | # worker进程设置1个,便于测试观察成功的连接数 |
配置了这个参数,他会覆盖权重,慢慢从0开始到正常值。
*商业版,需要付费*
配置参考如下:
1 | upstream tomcats { |
注意:
hash
和 random load balancing
中。down
用于标记服务节点不可用:
1 | upstream tomcats { |
**backup
**表示当前服务器节点是备用机,只有在其他的服务器都宕机以后,自己才会加入到集群中,被用户访问到:
1 | upstream tomcats { |
注意:
backup
参数不能使用在hash
和 random load balancing
中。**max_fails
**:表示失败几次,则标记server已宕机,剔出上游服务。
**fail_timeout
**:表示失败的重试时间。假设目前设置如下:
1 | max_fails=2 fail_timeout=15s |
则代表在15秒内请求某一server失败达到2次后,则认为该server已经挂了或者宕机了,随后再过15秒,这15秒内不会有新的请求到达刚刚挂掉的节点上,而是会请求到正常运作的server,15秒后会再有新请求尝试连接挂掉的server,如果还是失败,重复上一过程,直到恢复。
[Toc]
Hadoop官方指导传送门 传送门
服务器规划,提供 3 台服务器,OS 为centos 7
主机名 | IP | 预备分配服务 |
---|---|---|
centos-node1 | 192.168.99.101 | DataNode,NodeManager,NameNode |
centos-node2 | 192.168.99.102 | DataNode,NodeManager,SecondaryNameNode |
centos-node3 | 192.168.99.103 | DataNode,NodeManager,ResourceManager,HistoryServer |
1 | $ hostnamectl set-hostname centos-node1 |
可以使用 netstat -r
来查询网关如下图所示:
然后将 dhcp 改为 静态IP
1 | $ vim /etc/sysconfig/network-scripts/ifcfg-enp0s8 |
完全配置如下所示:
1 | TYPE="Ethernet" |
1 | $ vi /etc/hosts |
1 | $ vi /etc/profile |
通常,建议HDFS和YARN以单独的用户身份运行。
在大多数安装中,HDFS进程以 “hdfs” 执行。YARN通常使用 “yarn” 帐户
1 | $ adduser hdfs |
为 /etc/sudoers
添加如下图所示:
3 台服务器全部设置
1 | $ ssh-keygen -t rsa |
各自分配 ssh key
1 | $ ssh-copy-id centos-node1 |
1 | $ su - hdfs |
1 | $ curl -O https://archive.apache.org/dist/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz |
1 | $ tar -zxf hadoop-2.7.4.tar.gz -C /opt/hadoop-2.7.4 |
1 | $ sudo vi /etc/profile |
这里我们进入$HADOOP_HOME
文件夹开始操作
1 | $ mkdir -p $HADOOP_HOME/hdfs/data |
1 | $ sudo vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh |
增加 或 修改
1 | export JAVA_HOME=/usr/local/java/ |
1 | $ sudo vi $HADOOP_HOME/etc/hadoop/core-site.xml |
configuration配置如下
1 | <configuration> |
配置说明:
fs.defaultFS
为NameNode
的地址。
hadoop.tmp.dir
为hadoop
临时目录的地址。默认情况下,NameNode
和DataNode
的数据文件都会存在这个目录下的对应子目录下。
1 | $ sudo vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml |
内容如下:
1 | <configuration> |
配置说明:
dfs.namenode.secondary.http-address
是指定secondaryNameNode
的http访问地址和端口号,因为在规划中,我们将centos-node2
规划为SecondaryNameNode
服务器。
dfs.http.address
配置的是本机默认的dfs
地址,有些服务器可以不用配置,我的试过了,必须加上,不然后续网页打不开。
dfs.namenode.name.dir
指定name文件夹。
dfs.datanode.data.dir
指定data文件夹。
dfs.datanode.data.dir
指定副本数,一般小于服务器数,我们设置为3
在hadoop2.x
中叫做slaves
,在3.x
版本中改名workers
。 用来指定HDFS
上有哪些DataNode
节点,以及各个节点使用ip地址
或者主机名
,用换行分隔。
1 | $ sudo vi $HADOOP_HOME/etc/hadoop/slaves |
这里我们就使用主机名
1 | centos-node1 |
1 | $ sudo vi $HADOOP_HOME/etc/hadoop/yarn-site.xml |
配置如下
1 | <configuration> |
配置说明:
按照规划使用centos-node3
做为 resourcemanager
使用yarn.log-aggregation-enable
开启日志聚合,yarn.log-aggregation.retain-seconds
配置聚集的日志在HDFS上最多保存多长时间。
1 | $ sudo vi $HADOOP_HOME/etc/hadoop/mapred-site.xml |
配置如下:
1 | <configuration> |
配置说明:
mapreduce.framework.name
设置mapreduce
任务运行在yarn上。
mapreduce.jobhistory.address
是设置mapreduce
的历史服务器安装在centos-node3
上。
mapreduce.jobhistory.webapp.address
是设置历史服务器的web页面地址和端口号。
yarn.app.mapreduce.am.env
,mapreduce.map.env
,mapreduce.reduce.env
需要设置为HADOOP_MAPRED_HOME=${HADOOP_HOME}
,否则在运行yarn程序的时候会出现jar包未找到的错误。
1 | # 查看当前区域 |
完成上述所有必要的配置后,将文件分发到所有服务器的HADOOP_CONF_DIR
目录下/usr/local/hadoop/etc/hadoop
。在所有计算机上,该目录应该是相同的目录。
注意:启动和停止单个hdfs相关的进程使用的是”hadoop-daemon.sh”脚本,而启动和停止yarn使用的是”yarn-daemon.sh”脚本。
要启动Hadoop集群,需要同时启动HDFS
和YARN
集群。 首次启动HDFS
时,必须对其进行格式化。将新的分布式文件系统格式化为hdfs
.
1 | $ $HADOOP_HOME/bin/hdfs namenode -format <群集名称> |
集群名称可以不填写,不出意外,执行完成后$HADOOP_HOME/hdfs
中就有东西了。
如果配置了slaves
和ssh互信
我们可以
1 | $ $HADOOP_HOME/sbin/start-dfs.sh |
如果配置了workers和ssh互信我们可以
1 | $ $HADOOP_HOME/sbin/start-yarn.sh |
规划在centos-node3
上,因此我们在centos-node3
上执行
1 | $ $HADOOP_HOME/sbin/yarn-daemon.sh start resourcemanager |
规划在centos-node3
上,因此我们在centos-node3
上执行
1 | $ $HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver |
ps: Hadoop 3.3.0 版本时用这个命令启动mapred --daemon start
位于centos-node1
的50070
端口:http://centos-node1:50070/
位于centos-node3
的8088
端口:http://centos-node3:8088/
位于centos-node3
的19888
端口:http://centos-node3:19888/
为了测试我们使用 wordcount
来测试
新建文件
1 | $ sudo vi /opt/word.txt |
文本内容
1 | hadoop mapreduce hive |
新建hadoop
里文件夹demo
1 | $ hadoop fs -mkdir /demo |
文件写入
1 | $ hdfs dfs -put /opt/word.txt /demo/word.txt |
执行输入到hadoop
的/output
1 | $ yarn jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar wordcount /demo/word.txt /output |
查看文件列表
1 | $ hdfs dfs -ls /output |
1 | Found 2 items |
查看文件中内容
1 | $ hdfs dfs -cat /output/part-r-00000 |
1 | hadoop 3 |