一、load操作
1.不支持LOCAL关键字,不能load本地文件,只能load HDFS中的文件。
2.同一张表不能同时存在压缩与非压缩格式的文件
3.load操作是一个move操作。hive从本地磁盘的load操作是copy操作。
4. hdfs文件夹中的load操作不会move隐藏文件。
5.load后文件名会保留下来,如果有名称冲突,会把新move的文件改名,而在hive里面会直接覆盖。
6.快速查看文件所在hdfs位置:
DESCRIBE FORMATTED
table_name
7.如果表是多个分区的,load的时候必须指定所有的分区。
8.如果想要做Impala-shell 的loadbanlance操作,可以使用
SYNC_DDL
,这样在下一个查询被提交前对每一个impala node的metastore做更新。
9.impala1.2后,在impala一个节点所有的操作都会通知其他节点的守护进程,而不需要刷新表。
10.impala支持的文件格式:Textfile、RCFile、parquet、sequencefile。
11.支持的压缩格式:Gzip、BZip、snappy。
12.impala守护进程与statestore维持着长连接,以便获取每个节点的信息,是否能接受新任务。
13.catalog守护进程监控着其他impala节点对数据库的操作
14.当statestore挂了,其他impala节点仍然可以运行,但是如果一个节点挂了,其他节点不会被告知。当statestore重启后,重新建立与各个impala守护进程的联系。
15.statestore与catalog频繁通信,最好放在同一个节点上。
16.impala各个节点缓存了所有impala节点的metadata。
17.impala不支持删除单行操作。
{
In fact, Impala doesn’t actually support deleting single records from a table. Instead you have to use the “INSERT OVERWRITE” command again and use a clever where clause to create the result set you want.
}
18.修改表名
ALTER TABLE [old_db_name.]old_table_name RENAME TO [new_db_name.]new_table_name
19.hive连接beeline:beeline -u "jdbc:hive2://10.1.33.23:10000/default" -nbi -pbi_1473
20.impala连接:beeline -u "jdbc:hive2://10.1.33.23:21050/default;" -nbi -pbi_1473
21.模拟update使用:
INSERT
or
CREATE TABLE AS SELECT from where ...,hive从1.4开始已经支持update操作。
22.impala多是io密集型,当impala查询超出内存限制,会kill掉一些查询请求。
23.
查询 Parquet 表时需要相对较少的内存,因为 Impala 以 8MB /块来进行读取和解压缩数据。而向 Parquet 表插入数据则是内存密集型操作,因为每一个数据文件(最大大小为 1GB)的数据被放在内存中,直到编码、压缩并写入硬盘。
24.
最终的结果集是否使用 ORDER BY 子句来排序。请记住,
Impala 要求所有包含的 ORDER BY 子句的查询同时包含 LIMIT 子句(有待验证)
,或者在语句中直接包含,或者隐式的通过 DEFAULT_ORDER_BY_LIMIT 查询选项设置来实现。每一个 Impala 节点扫描并过滤总数据的一部分,并且对他们自己那部分数据应用 LIMIT。中间结果集 (包含最大 LIMIT 行记录)都发送回协调节点,在上面执行最终的排序并对最终结果集应用 LIMIT 子句。例如,假如你执行查询
25.
在查询完成之后,在
impala-shell 中立即
执行 PROFILE 命令。对于指定的节点,其中 BytesRead、BytesReadLocal、BytesReadShortCircuit 的值应当一致。例如:
26.用户通过beewax thrift api提交query到某个impalad。
Impalad的Query Planner使用jflex和CUP解析SQL语句。然后Planner把这个query的parse trees变成若干PlanFragment,然后把PlanFragment发送到backend/Query Coordinator。
一、
1.不支持
update和delete,只能drop或者overwrite
2.不能insert。。values这样插入单条语句
3.与hive一样支持外部表,对表只读
二、impala与hive、hdfs、hbase
1.只要是impala支持的数据类型,impala就可以使用hive的数据
2.impala可以读取hive中avro,sequencefile,RCFile的数据
3.impala会cache表的元信息
|
Programming Impala Applications
1.相对于refresh操作,这个操作耗费比较大。
2.语法:INVALIDATE METADATA [[db_name.]table_name],当在表中插入新的数据后,最好使用refresh操作。
3.在一个impala 节点上创建一个表,其他impala节点会通过catalog默认获取最新的信息。但是如果用hive建表,必须使用invalidate metadata来刷新表。
4.refresh关键字只对impala能看见的表生效,在hive中新建表需要是用invalidate metadata
5.数据块发生外部移动的时候比如rebalance 的时候也要使用
invalidate metadata
6.刷新meta数据的三种情况:(1)meta发生变动(2)数据在其他impala节点或者hive变动(3)
the change is made to a database to which clients such as the Impala shell or ODBC directly connect.
7.同一个节点的操作不需要刷新。
8.impala删除数据的三种形式:(1)drop table (2)drop partition (3)insert overwrite
9.数据进入impala的形式:insert,不支持insert values形式,但是测试可用。不支持load。
10.不限制string类型的长度。
11.访问impala接口的几种方式:shell,hue,JDBC,odbc。
12.impala进程监控一些端口响应请求,hue和shell也使用这些端口,JDBC和ODBC使用另外一些端口。
How Impala Fits Into the Hadoop Ecosystem
1.
metastore
是impala存储在关系数据库中的元数据,与hive的元数据一样,所以只要hive使用了impala支持的文件类型,压缩格式,字段类型,impala就可以读取。
2.impala面向读取,所以impala可以读取的数据类型要比可以写入的数据类型要多。load 数据一般用hive。
3.每个
Impala node caches
中保留着
metadata以快速查询
。
4.使用hive插入已经存在的表的新数据,可以用refresh或者invalidate metadata。对于新建的一张表,必须使用invalidate metadata。
5.impala与hbase的集成:
Cloudera Impala Requirements
1.位防止版本之间的兼容性,需要运行一个来
Hive metastore service
解决
2.metastore安装过程:
|
3.java依赖:java依赖jar放在
/usr/lib/impala/lib/下面
impala-dependencies.jar文件。
4.做join操作的时候,impala会把join相关的表的数据全部load进内存,所以需要确保足够大的内存来存放数据。
5.内存:推荐128G,最好256G或者以上。如果中间结果超过了impala的内存,那么会写入磁盘。
6.磁盘:每个datanode可以有12个或者以上的硬盘数量。
7.如果升级impala从10或者1.1到cdh5,那么手动修改impala用户为hdfs组。
Guidelines for Designing Impala Schemas
1.impala可以创建和查询
RCFile 和 SequenceFile file格式的表,但是这种基于text属性的文件对于impala读取不是最优的,impala也不能对这种属性的表进行insert操作。
2.对于高性能,高可靠的表要使用parquet文件格式。
3.作为中间结果或者给其他用户使用,avro是不错的选择。
4.为了方便导入数据,使用text格式而不是RCFile或者sequenceFIle。
5.压缩格式建议snappy。
6.优先使用数值类型而不是string。因为int或者smallint等可以节省大量存储空间,这在join等的时候很有用。
7.impala2.0以后,默认的parquet block变成256m。
8.如果数据量较小,为了提高并行性,可以设置block的体积小一些。这样可以使文件分布在多个机器上。
9.在做大表join等操作前或者loading data之后使用
COMPUTE
STATS
tablename命令,可以优化性能。show stats tablename来查看。
10.资源紧张型查询,最好先执行查询计划,如果比较耗费资源,可以修改文件格式,使用分区,使用
COMPUTE
STATS
语句,详情见:
http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/impala_performance.html#performance
Impala Tutorial
1.impala两个默认数据库:
(1)default:不指定数据库则操作此数据库。
(2)
_impala_builtins:存放内置函数。
2.show tables
- show tables in database_name.
- show tables in database_name like 'sub_tablename'
3.查看自己所在哪个库:
- select current_database()
4.查看当前版本:
- select version()
5.将一个表放到另外一个库里。
- alter table t1 rename to experiments.t1;
- 创建表:
-
CREATE EXTERNAL TABLE tab2 ( id INT, col_1 BOOLEAN, col_2 DOUBLE ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/user/cloudera/sample_data/tab2';
-
6.note:
- 确保 hive.metastore.warehouse.dir对impala有写的权限,权限是hive:hive,并且impala属于hive组。
7.运行impala sql脚本命令:
-
impala-shell -i localhost -f customer_setup.sql
8.直接运行查询语句:
-
impala-shell -i impala-host -q 'select count(*) from customer_address'
9.创建表并指定partition的location的时候,需要使用alter语句来导入。
10.对一些
RCFile, SequenceFile, and Avro
impala可以读取但是不能写入的数据进行load和转换使用hive。
11.contact连接用法
[localhost:21000] > select concat(heroes.name,' vs. ',villains.name) as battle > from heroes join villains > where heroes.era = villains.era and heroes.planet = villains.planet;
12.不加where条件的join要使用cross join,代表两个表做笛卡尔积。
Setting Timeout Periods for Daemons, Queries, and Sessions
1.如果集群比较忙,表库比较多,增加timeout的时间: statestore_subscriber_timeout_seconds,否则可能出现 Connection with state-store lost,Trying to re-register with state-store这样的错误。2.使用 DESCRIBE FORMATTED 来检查一个表或者分区是内部表还是外部表。
3.对于impala管理的内部表,使用drop命令可以删除数据,对于外部表可以使用hdfs相关命令来删除数据。
4.计算的中间结果放在
/tmp/impala-scratch 中。
5.sql的两种注释:
- -
- /* */
三、ALTER TABLE
1.修改表名,增加删除列,修改列名列属性,增加修改删除partition,是否添加进入缓存等。
ALTER TABLE [old_db_name.]old_table_name RENAME TO [new_db_name.]new_table_name
ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])
ALTER TABLE name DROP [COLUMN] column_name
ALTER TABLE name CHANGE column_name new_name new_type
ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])
ALTER TABLE name { ADD | DROP } PARTITION (partition_spec)
ALTER TABLE name [PARTITION (partition_spec)]
SET { FILEFORMAT file_format
| LOCATION 'hdfs_path_of_directory'
| TBLPROPERTIES (table_properties)
| SERDEPROPERTIES (serde_properties) }
ALTER TABLE name [PARTITION (partition_spec)] SET { CACHED IN 'pool_name' | UNCACHED }
new_name ::= [new_database.]new_table_name
col_spec ::= col_name type_name
partition_spec ::= partition_col=constant_value
table_properties ::= 'name'='value'[, 'name'='value' ...]
serde_properties ::= 'name'='value'[, 'name'='value' ...]
file_format ::= { PARQUET | TEXTFILE | RCFILE | SEQUENCEFILE | AVRO }
ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])
ALTER TABLE name DROP [COLUMN] column_name
ALTER TABLE name CHANGE column_name new_name new_type
ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])
ALTER TABLE name { ADD | DROP } PARTITION (partition_spec)
ALTER TABLE name [PARTITION (partition_spec)]
SET { FILEFORMAT file_format
| LOCATION 'hdfs_path_of_directory'
| TBLPROPERTIES (table_properties)
| SERDEPROPERTIES (serde_properties) }
ALTER TABLE name [PARTITION (partition_spec)] SET { CACHED IN 'pool_name' | UNCACHED }
new_name ::= [new_database.]new_table_name
col_spec ::= col_name type_name
partition_spec ::= partition_col=constant_value
table_properties ::= 'name'='value'[, 'name'='value' ...]
serde_properties ::= 'name'='value'[, 'name'='value' ...]
file_format ::= { PARQUET | TEXTFILE | RCFILE | SEQUENCEFILE | AVRO }
http://www.cloudera.com/content/cloudera/en/documentation/cloudera-impala/latest/topics/impala_development.html
1.没有insert...values插入一行数据(实际是可以插入一条语句)
2.可以创建外部表防止移动数据
3.impala里string类型是没有长度限制的,2.0以后可以使用长度限制的varchar或者char
五.jdbc 连接impala
六.
query planner:将提交的sql转化成执行计划。语法解析,生成语法树,并生成执行计划,获取一些表或者文件的信息。java实现
query coordinator:协调各个节点的查询。并行的执行计划中的内容
Execution engine:具体执行组件。
catalog service:连接监控hive的metadata。推送元数据的更新到statestore中。metadata发生变化时,catalog service检测到变化,并传给statestore server,statestoreserver分发给各个daemon。此进程集群只有一个。
statestore server:监控impalad的存活状况,管理impalad。如果任何一台机器变得不可用,statestore会同志其他机器不再向该机器发请求。此进程集群只有一个。
metadata:元数据信息。
两大进程:
state store:用于协调各个运行impalad的实例之间的信息关系,Impala正是通过这些信息去定位查询请求所要的数据。换句话说,state store的作用主要为跟踪各个impalad实例的位置和状态,让各个impalad实例以集群的方式运行起来。
与 HDFS的NameNode不一样,虽然State Store一般只安装一份,但一旦State Store挂掉了,各个impalad实例却仍然会保持集群的方式处理查询请求,只是无法将各自的状态更新到State Store中,如果这个时候新加入一个impalad实例,则新加入的impalad实例不为现有集群中的其他impalad实例所识别。而且如果此时其他的impalad挂了,其他机器也不知道。然而,State Store一旦重启,则所有State Store所服务的各个impalad实例(包括state store挂掉期间新加入的impalad实例)的信息(由impalad实例发给state store)都会进行重建。 Impalad:对应进程为 impalad(核心进程,数据的计算就靠这个进程来执行) 该进程应运行在DataNode机器上,每个DataNode机器运行一个impalad,每个impalad实例会接收、规划并调节来自ODBC或Impala Shell等客户端的查询。每个impalad实例会充当一个Worker,处理由其它impalad实例分发出来的查询片段(query fragments)。客户端可以随便连接到任意一个impalad实例,被连接的impalad实例将充当本次查询的协调者(Ordinator),将查询分发给集群内的其它impalad实例进行并行计算。当所有计算完毕时,其它各个impalad实例将会把各自的计算结果发送给充当 Ordinator的impalad实例,由这个Ordinator实例把结果返回给客户端。每个impalad进程可以处理多个并发请求。 State Store
客户端连接的node就成为impala的coordinator。
catalogd进程:
当在hdfs级别上对数据进行操作是,需要 在一台机器上执行REFRESH and INVALIDATE METADATA操作。
|