impala一些乱七八糟的整理

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/englishsname/article/details/47204109
一、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 的值应当一致。例如:
  • - BytesRead: 180.33 MB
    - BytesReadLocal: 180.33 MB
    - BytesReadShortCircuit: 180.33 MB
    
    假如 BytesReadLocal 低于 BytesRead,你集群中的一些配置可能错了, 例如 impalad 守护进程没有在全部数据节点上都运行。假如 BytesReadShortCircuit 低于 BytesRead,这一节点上可能没有启用 short-circuit 读;参见 Post-Installation Configuration for Impala 了解相关信息
26.用户通过beewax thrift api提交query到某个impalad。Impalad的Query Planner使用jflex和CUP解析SQL语句。然后Planner把这个query的parse trees变成若干PlanFragment,然后把PlanFragment发送到backend/Query Coordinator。

  Important: After adding or replacing data in a table used in performance-critical queries, issue a COMPUTE STATSstatement to make sure all statistics are up-to-date. Consider updating statistics for a table after any INSERTLOAD DATA, orCREATE TABLE AS SELECT statement in Impala, or after loading data through Hive and doing a REFRESH table_name in Impala. This technique is especially important for tables that are very large, used in join queries, or both.
一、
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安装过程:
  • Install a MySQL or PostgreSQL database. Start the database if it is not started after installation.
  • Download the MySQL connector or the PostgreSQL connector and place it in the /usr/share/java/ directory.
  • Use the appropriate command line tool for your database to create the metastore database.
  • Use the appropriate command line tool for your database to grant privileges for the metastore database to the hive user.
  • Modify hive-site.xml to include information matching your particular database: its URL, user name, and password. You will copy thehive-site.xml file to the Impala Configuration Directory later in the Impala installation process.
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
  1. show tables in database_name.
  2. show tables in database_name like 'sub_tablename'
3.查看自己所在哪个库:
  1. select current_database()
4.查看当前版本:
  1. select version()
5.将一个表放到另外一个库里。
  1. alter table t1 rename to experiments.t1;
  2. 创建表:
    1. 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:
  1. 确保 hive.metastore.warehouse.dir对impala有写的权限,权限是hive:hive,并且impala属于hive组。
7.运行impala sql脚本命令:
  1. impala-shell -i localhost -f customer_setup.sql
    
8.直接运行查询语句:
  1. 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的两种注释:
  1. -
  2. /* */







三、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 }


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操作。

展开阅读全文

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