Hawq学习笔记 --- 构建于HDFS之上的Greenplum(实时查询引擎)

版权声明:学习交流为主,未经博主同意禁止转载,禁止用于商用。 https://blog.csdn.net/u012965373/article/details/54630950

1. HAWQ 是什么

  如果你知道Greenplum是什么,那么你就能很简单的明白HAWQ是什么。Greenplum是一个关系型的分布式MPP数据库,同样运行于X86架构的基础之上,具有查询、加载效率高,支持TB/PB级大数据量的OLAP应用, Greenplum的所有数据都存储于系统本地文件系统中。而HAWQ的最大改变就是将本地文件系统存储更换为了HDFS,成功的搭上了大数据库的班车。不过HAWQ相较于其它的SQL on Hadoop组件来说,也是具有很多优势的,比如:

  • 对SQL的完善支持,以及语法上的OLAP扩展支持
  • 具有比较成熟的SQL并行优化器,而这正是其它SQL on Hadoop组件比较欠缺的。
  • 支持ACID事务特性,这个在其它SQL on Hadoop组件也是比较欠缺的。
  • 支持多语言的UDF支持:Python, Perl, Java, C/C++, R
  • 等等,反正比较牛B,原Greenplum上支持的功能在HAWQ基本都能找到

2. HAWQ 结构

  HAWQ在结构仍然是Master-Slave的主从模式,典型的部署方式仍然是在Master服务器上部署:HAWQ Master, HDFS Master, YARN ResouceManager, 在每一个SLAVE机器上部署: HAWQ segment, DataNode, NodeManager。具体结构看图: 



下面是一张HAWQ的软件组件图: 



可以看出HAWQ包含了好几个重要的组件,分别是: 
1. HAWQ Master 
  HAWQ Master是整个系统的接口,它负责接收客户端查询请求,解析SQL,优化查询,分发和协调查询的执行。当然作为老大,任务肯定不是这么简单的,它还得负责global system catalog的管理工作。 
2. HAWQ Segment 
  Segments是并行处理数据的单元。每一个Slave机器上部署的HAWQ程序叫作物理Segment,而且第一台Slave上只能部署一个物理Segment。一个物理Segment上可以运行多个虚拟Segment(一个查询解析后的并行分片就是虚拟Segment).虚拟Segment的数量决定了一个查询的并行度。 
3. HAWQ Interconnect 
  Segment之间的高速通信网络,默认采用UDP协议,并且HAWQ软件提供了针对UDP额外的数据包验证。使其可靠性接近于TCP,但性能和可扩展性又比TCP好。HAWQ也可以使用TCP进行通信,但有最大1000个Segment的限制。而使用UDP则没有该限制。 
4. HAWQ Resource Manager 
  HAWQ资源管理用于从YARN获取资源并响应资源请求。同时HAWQ会缓存资源用于低延迟的查询请求。除了使用YARN来管理资源外,HAWQ还可以使用自带的资源管理器,而不需要YARN. 
5. HAWQ Catalog Service 
  元数据服务存在于HAWQ Master中。作用肯定就是用于存储metadata.比如UDF,表信息等。以及提供元数据的查询服务。 
6. HAWQ Fault Tolerance Service 
  容错服务自然就是针对各个Segment节点的状态监控和失败处理等工作。 
7. HAWQ Dispatcher 
  HAWQ分发器是则是分发查询到指定的Segment上和coordinates上进行执行。

3. HAWQ 安装


  如果你安装过Greenplum,那么你会发现HAWQ的安装过程与Greenplum是极期相似,必竟它们两可以说是不同存储的版本。而整个安装过程相对其它实时组件来说,还是比较繁琐的。同时也可以看出来HAWQ是基于HDFS的独立数据库。而不像其它实时查询组件除了HDFS,可能还需要依赖于其它Hadoop组件。 
  本文的测试环境为基于CDH 5.5的Hadoop集群环境的安装和测试。HAWQ的版本为:2.0.0, 另外HAWQ还可以使用Ambari图形界面安装。发竟安装过程请看:


 1. 设置系统参数,更改文件/etc/sysctl.conf,增加内容:

kernel.shmmax = 1000000000
kernel.shmmni = 4096
kernel.shmall = 4000000000
kernel.sem = 250 512000 100 2048
kernel.sysrq = 1
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.msgmni = 2048
net.ipv4.tcp_syncookies = 0
net.ipv4.ip_forward = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 200000
net.ipv4.conf.all.arp_filter = 1
net.ipv4.ip_local_port_range = 1281 65535
net.core.netdev_max_backlog = 200000
vm.overcommit_memory = 50
fs.nr_open = 3000000
kernel.threads-max = 798720
kernel.pid_max = 798720
# increase network
net.core.rmem_max=2097152
net.core.wmem_max=2097152
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

   然后使用命令sysctl -p生效 
 2. 更改文件/etc/security/limits.conf,增加内容:

* soft nofile 2900000
* hard nofile 2900000
* soft nproc 131072
* hard nproc 131072
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

 3. 安装epel-release包。该包在 http://fedoraproject.org/wiki/EPEL 官网下载后,安装到每一台集群节点上:

rpm -ivh epel-release-latest-6.noarch.rpm
  • 1
  • 1

 4. 选择一台服务器上,配置HAWQ安装的YUM源

#启动httpd 服务,如果没有安装使用yum安装并启动:
service httpd start

#解压hdb 包:
tar -xzvf hdb-2.0.0.0-22126.tar.gz
cd hdb-2.0.0.0 #进到解压后的目录
./setup_repo.sh #执行脚本创建YUM源

#将生成的/etc/yum.repos.d/HDB.repo源文件拷由到每台集群节点上
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

 5. 先只在主节点上安装HAWQ:

yum install hawq
  • 1
  • 1

 6. 在主节点上创建主机名文件

创建文件 hostfile包含集群所有主机(包含MASTER),如:
[root@master hzh]# cat hostfile 
master
slave2
slave3
slave4
5.创建文件仅包含seg(Slave)主机,如:
[root@master hzh]# cat seg_hosts 
slave2
slave3
slave4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

 7. 打通各主机root用户ssh

source /usr/local/hawq/greenplum_path.sh
hawq ssh-exkeys -f hostfile  #这里的hostfile就是上面创建的那个文件
  • 1
  • 2
  • 1
  • 2

 8. 然后在每个节点上安装hawq:

source /usr/local/hawq/greenplum_path.sh
hawq ssh -f hostfile -e "yum install -y epel-release"
hawq ssh -f hostfile -e "yum install -y hawq"
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

 9. 在每个节点上增加gpadmin用户,并设置密码

hawq ssh -f hostfile -e '/usr/sbin/useradd gpadmin'
hawq ssh –f hostfile -e 'echo -e "changeme\changeme" | passwd gpadmin'
  • 1
  • 2
  • 1
  • 2

 10. 在主节点上切换到gpadmin 用户,打通每个节点的ssh

su - gpadmin
source /usr/local/hawq/greenplum_path.sh
hawq ssh-exkeys -f hostfile
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

 11. 检查安装是否完成,在gpadmin用户下执行:

hawq ssh -f hostfile -e "ls -l $GPHOME" #如有输出目录文件则安装成功
  • 1
  • 1

 12. 创建hawq的数据存储目录:

hawq ssh -f hostfile -e 'mkdir -p /hawq/master' #主节点目录数据存放位置
hawq ssh -f hostfile -e 'mkdir -p /hawq/segment' #segment 节点数据存放目录
hawq ssh -f hostfile -e 'mkdir -p /hawq/tmp' #spill临时数据存放目录,每台服务器可以建多个
hawq ssh -f hostfile -e 'chown -R gpadmin /hawq'
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

 13.编辑hawq-site.xml文件在 $GP_HOME/etc/, 如果文件不存在,直接从template-hawq-site.xml复制一个出来就是,属性设置包括:

<property>
        <name>hawq_dfs_url</name>
        <value>localhost:8020/hawq</value> # hdfs的URL, 也可以设置成HDFS HA: <value>hdpcluster/hawq</value>
                                #注意前面不要带hdfs://前缀
        <description>URL for accessing HDFS.</description>
    </property>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

另外还要包括属性:

Property Example Value
hawq_master_address_host mdw
hawq_master_address_port 5432
hawq_standby_address_host smdw
hawq_segment_address_port 40000
hawq_master_directory /data/master
hawq_segment_directory /data/segment
hawq_master_temp_directory /data1/tmp,/data2/tmp
hawq_segment_temp_directory /data1/tmp,/data2/tmp
hawq_global_rm_type none

* 注意如果你需要安装HAWQ在 secure mode (Kerberos-enabled),则需要设置hawq_global_rm_type为none,来避开已知的安装问题。 这里设置为none,就是没有采用YARN来作资源管理,而使用了自带的标准模式。

 14. 创建HDFS /hawq数据目录

hadoop fs -mkdir /hawq
hadoop fs -chown gpadmin /hawq
  • 1
  • 2
  • 1
  • 2

 15. 创建 $GPHOME/etc/slaves文件包含所有segment机器的主机名,如:

[root@master etc]# cat slaves 
slave2
slave3
slave4
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

 16.如果HDFS是使用的HA模式,则需要在${GPHOME}/etc/hdfs-client.xml下配置一个hdfs-client.xml文件。幸好这里是单机,少配一个.

 17. 将以上的hawq-site.xml slaves hdfs-client.xml文件拷贝到集群的每个节点上。

 18. 准备工作终于作完了,接下来开始干正事了,初始化HAWQ

chown -R gpadmin /usr/local/hawq-2.0.0.0  #先要给安装目录授权,在每一台
#仅在主节点上,使用gpadmin 用户执行:
hawq init cluster
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

  初始后后,HAWQ就安装完成啦,你可以使用以下命令检查集群状态:

[gpadmin@master ~]$ hawq state
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--HAWQ instance status summary
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:------------------------------------------------------
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   Master instance                                = Active
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   No Standby master defined                           
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   Total segment instance count from config file  = 3
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:------------------------------------------------------ 
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   Segment Status                                    
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:------------------------------------------------------ 
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   Total segments count from catalog      = 3
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   Total segment valid (at master)        = 3
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   Total segment failures (at master)     = 0
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   Total number of postmaster.pid files missing   = 0
20161122:23:46:07:120722 hawq_state:master:gpadmin-[INFO]:--   Total number of postmaster.pid files found     = 3

4. 使用HAWQ

  在HAWQ的使用上跟Greenplum基本就一样一样的了。比如: 
 1. 创建表空间

#选创建filespace,生成配置文件
[gpadmin@master ~]$ hawq filespace -o hawqfilespace_config
Enter a name for this filespace
> hawqfs
Enter replica num for filespace. If 0, default replica num is used (default=3)
> 0

Please specify the DFS location for the filespace (for example: localhost:9000/fs)
location> master:8020/fs
#执行创建
[gpadmin@master ~]$ hawq filespace --config ./hawqfilespace_config 
Reading Configuration file: './hawqfilespace_config'

CREATE FILESPACE hawqfs ON hdfs 
('slave2:8020/fs/hawqfs')
20161121:11:26:25:122509 hawqfilespace:master:gpadmin-[INFO]:-Connecting to database
20161121:11:27:38:122509 hawqfilespace:master:gpadmin-[INFO]:-Filespace "hawqfs" successfully created

#再创建表空间
[gpadmin@master ~]$ psql template1
psql (8.2.15)
Type "help" for help.

template1=# 
template1=# CREATE TABLESPACE hawqts FILESPACE hawqfs;
CREATE TABLESPACE
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

 2. 创建数据库

template1=# CREATE DATABASE testdb WITH TABLESPACE=hawqts; #指定存储表空间为hawqts
CREATE DATABASE
  • 1
  • 2
  • 1
  • 2

 3. 创建表到新的数据库中

[gpadmin@master ~]$ psql testdb  //这里指定连接到新的数据库中
testdb=# create TABLE books( 
testdb(#   id integer
testdb(#   , isbn varchar(100)
testdb(#   , category varchar(100)
testdb(#   , publish_date TIMESTAMP
testdb(#   , publisher varchar(100)
testdb(#   , price money 
testdb(# ) DISTRIBUTED BY (id);  #指定表的数据打散列 
CREATE TABLE
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

  创建的表默认都创建在了public schema中,也就是所有用户都可以访问,但可以在建表时指定schema. 如: testschema.books 
 4. 加载数据文件到表中

testdb=# COPY books(id,isbn,category,publish_date,publisher,price) 
testdb-# FROM '/tmp/books'
testdb-# WITH
testdb-# DELIMITER AS '|'
testdb-# ;
COPY 15970428
Time: 41562.606 ms
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

  加载速度达到了 380248条/秒. 还是不错的 
 5. 查询表, HAWQ作为主用于数据仓库的数据库在SQL支持方面非常丰富,在标准SQL基础上,还支持OLAP的窗口函数,窗口函数等。

testdb=# SELECT COUNT(*) FROM books;
  count   
----------
 15970428
(1 row)

Time: 4750.786 ms
//求每个类别下的最高价,最低价
testdb=# SELECT category, max(price) max_price, min(price) min_price
testdb-# FROM books
testdb-# group by category
testdb-# LIMIT 5;
    category    | max_price | min_price 
----------------+-----------+-----------
 COMPUTERS      |   $199.99 |     $5.99
 SELF-HELP      |   $199.99 |     $5.99
 COOKING        |   $199.99 |     $5.99
 SOCIAL-SCIENCE |   $199.99 |     $5.99
 SCIENCE        |   $199.99 |     $5.99
(5 rows)

Time: 4755.163 ms
//求每类别下的最高,最小价格,及对应的BOOK ID
testdb=# SELECT category
testdb-#  , max(case when desc_rn = 1 then id end) max_price_id, max(case when desc_rn = 1 then id end) max_price
testdb-#  , max(case when asc_rn = 1 then id end) min_price_id, max(case when asc_rn = 1 then id end) min_price
testdb-# FROM (
testdb(#  SELECT id, category, price
testdb(#   , row_number() over(PARTITION BY category ORDER BY price desc) desc_rn
testdb(#   , row_number() over(PARTITION BY category ORDER BY price asc) asc_rn
testdb(#  FROM books
testdb(# ) t
testdb-# WHERE desc_rn = 1 or asc_rn = 1
testdb-# GROUP BY category
testdb-# limit 5;
    category    | max_price_id | max_price | min_price_id | min_price 
----------------+--------------+-----------+--------------+-----------
 CRAFTS-HOBBIES |        86389 |   $199.99 |      7731780 |     $5.99
 GAMES          |      5747114 |   $199.99 |     10972216 |     $5.99
 STUDY-AIDS     |      2303276 |   $199.99 |     13723321 |     $5.99
 ARCHITECTURE   |      9294400 |   $199.99 |      7357451 |     $5.99
 POETRY         |      7501765 |   $199.99 |       554714 |     $5.99
(5 rows)

Time: 23522.772 ms

5. 使用HAWQ查询HIVE数据

  HAWQ是一个基于HDFS的一个独立的数据库系统,若需要访问其它第三方数据,则还需要再安装HAWQ Extension Framework (PXF) 插件。PXF支持在HDFS上的HiveHbase数据,还支持用户开发自定义的其它并行数据源的连接器。

7. 最后

  HAWQ作为一个从Greenplum更改过来的系统,在功能上支持上还是非常丰富的,除了上面介绍的查询功能外,还支持像PL/Java, PL/Perl, PL/pgSQL, PL/Python, PL/R等存储过程。但个人觉得,它最大的缺点就是这是一个独立的数据库,在当前的这样一个具有多种多样组件的HADOOP平台上,不能实现数据共享,进而根据不同场景采用多种数据处理方式着实是一大遗憾。

建于关系型数据库之上的RDFDB

09-21

最近我在做一个RDF Database,构架于关系型数据库之上。以下是关于RDFDatabase的结构设计(草案),确定后就要code了(java&oracle)。大家有兴趣的话,不妨看一下,给我提些建议,万分感谢!!rnrnTable RDFModelrn ModelId intrn StatementID intrn //Other fields as Click,Channel and so on.rnrnTable RDFStatementrn Subject intrn Predicate textrn Object intrn Prefix textrn Flag intrnrnTable RDFResourcern ID intrn Uri textrn Value textrn Flag intrnrnTable NameSpacern Prefix textrn NS textrnrn 任何一个RDF文档都可以分解成许多形如主语-动词-宾语(Subject-Predicate-Object)的三元组(triple)形式声明。档得到一个RDF文档后,首先在表RDFModel中进行注册,然后将一个RDF文档分解成三元组之后一一存入表RDFStatement和RDFResource。rn RDFStatement.Rredicate字段存放动词词汇、RDFStatement.Subject和RDFStatement.Object指向资源值存放的地址,Prefix字段存放动词前缀(该词汇的名称域),RDFStatement.Flag字段表示该声明的类型,可能是:0,简单三元组(triple)声明;1,复杂三元组声明(一),其宾语部分为一个匿名资源(又一个);2,复杂三元组声明(二),其宾于部分为一个RDF Container(或...)。rn 三元组中的主语和宾语都是资源,他们的值都将存放于RDFResource中。但是资源又可分为直接资源与间接资源(direct resource/indirect resource),由RDFResource.Flag标出。若是直接资源,RDFResource.Value中将存放该值(value),同时RDFResource.Uri为空;若是间接资源,则RDFResource.Uri将存放该资源定位符(uri),则RDFResource.Value为空。rnrnrnSample1:rn简单三元组声明的处理:rnrnrn rn 思航网——思想的航程rn f0103405班rn 2002-9-1rn rnrnrn数据库:rn--RDFModel--rnModelId StatementIdrn1 1rnrn--RDFStatement--rnSubject Predicate Object Prefix Flagrn1 title 2 dc 0rn1 creator 3 dc 0rn1 date 4 dc 0rnrn--RDFResource--rnID Uri Value Flagrn1 null http://jd.sjtu.edu.cn/sail/ 0rn2 null 思航网——思想的航程 0rn3 null f0103405班 0rn4 null 2002-9-1 0rnrn--NameSpace--rnPrefix NSrndc http://www.purl.org/dc/elements/1.0/rnrnrnsample2:rn复杂三元组声明(一)的处理:rnrnrn rn 思航网——思想的航程rn rn rn f0103405班rn Webrn rn rn 2002-9-1rn rnrnrn数据库(继续上面的):rn--RDFModel--rnModelId StatementIdrn1 1rn2 5rnrn--RDFStatement--rnSubject Predicate Object Prefix Flagrn1 title 2 dc 0rn1 creator 3 dc 0rn1 date 4 dc 0rn5 title 6 dc 0rn5 creator 6 dc 1rn6 value 7 rdf 0rn6 createType 8 dcq 0rn5 date 9 dc 0rnrn--RDFResource--rnID Uri Value Flagrn1 null http://jd.sjtu.edu.cn/sail/ 0rn2 null 思航网——思想的航程 0rn3 null f0103405班 0rn4 null 2002-9-1 0rn5 null http://jd.sjtu.edu.cn/sail/ 0rn6 null 思航网——思想的航程 0rn7 null f0103405班 0rn8 null Web 0rn9 null 2002-9-1 0rnrnrn--NameSpace--rnPrefix NSrndc http://www.purl.org/dc/elements/1.0/rnrdf http://www.w3c.org/1999/02/22-rdf-syntax-ns#rndcq http://www.purl.org/dc/qualifiers/1.0/

没有更多推荐了,返回首页