目录
a. 添加 impala 服务
Kudu是Hadoop生态系统中一个真正的列存储。
在进行继续的时候,由于在安装 impala 的时候,会导致集群中所有的服务进行重启,所以这里的下一步会执行失败,但是没有关系,因为 安装 impala 的配置文件已经在 节点上配置成功,执行失败也可以回到主页,然后手动的对各个服务进行重启,没有问题的。
在回到主页的时候,hdfs 服务会显示配置过期,这个时候需要进行重启(不要勾选重新部署客户端),重启的时候可能会重启失败(重启完服务依然不能正常使用),多尝试几次就可以了,由于是使用的虚拟机,并且物理机的内存也不够用,导致系统很卡,恢复正常的时间比较长,好几个小时,我这个集群才反应过来。
可以看到集群中分配的内存全部用完,并且发生内存交换,多点耐心,多尝试几次重启,(如果在安装impala之前的服务都运行正常)那最终就会变得正常。
b. impala客户端启动
c. 创建表
在 impala 客户端创建表, hive 端可以实时看到表
d. impala进行 mapreduce 计算
hive在执行 MapReduce 操作的时候,导致集群环境运行异常,无法正常使用
我这里要做的内容是,对比一下 impala 和 hive 在执行 MapReduce 任务的耗时(impala是完全基于内存的,所以执行的速度比较快),看来是没有办法实验了。
select count(*) name from student;
在使用impala 进行查询的时候速度非常快(第一次进行MapReduce计算的时候可能会有点慢,因为系统需要加载表的资源,后面再次进行计算的时候资源已经位于内存中了,计算的速度就比较快了)
在shell会话中,
-B 表示将查询的数据去格式化(只显示表中的数据,不显示字段信息),
-q 表示执行完命令后,不进入 impala-shell 的会话
> 表示将查询的内容追加到 impalaStudent 文件中 ,
impala-shell -B -q "select * from student;" > impalaStudent
查询结果不去格式化(正常输出)
impala-shell -q "select * from student;" > impalaStudent
e. 分区使用
创建表
-- 创建表
create table psnpartition(
id int,
name string,
aget int)
partitioned by(type string);
-- 增加分区
alter table psnpartition add partition(sex='boss');
-- 添加数据
insert into psnpartition partition(type='boss') values
(1, 'xiaozhang',18),
(2, 'xiaoli',23);
insert into psnpartition partition(type='coder') values
(3, 'daming',20),
(4, 'erming',21);
insert into psnpartition partition(type='coder') values
(3, 'tangsan',22),
(4, 'xiaowu',23);
在使用 insert into 进行插入数据的时候,每执行一次该命令,就会产生一个hdfs 文件,这样会造成文件系统中小文件太多,影响系统的效率。
使用 clouderaManager 进行服务的安装之后,hdfs 文件系统会产生权限的认证,通过直接访问9870 端口,是无法正常的查看文件的。
查询数据
select * from psnpartition where type='coder' and name='tangsan';
f. impala数据同步
refresh tableName 刷新指定表的元数据,将表新增的元数据新加载到内存(增量刷新)
invalidate metadata 默认将全部的表的元数据进行刷新
invalidate metadata | refresh | |
语法 | INVALIDATE METADATA [[db_name.]table_name] | REFRESH [table] PARTITION [partition] |
执行方式 | 异步 | 同步 |
操作 | 重量级 | 轻量级(速度快) |
使用场景 | 表的schema改变 | 表数据改变(增,删,重命名) 表的数据实际上是文件(增,删,重命名)是针对数据文件 |
1.使用hive插入数据
通过 hive 进行数据的插入,显示没有权限对数据文件进行修改
load data local inpath '/root/psnpartitiondate' into table psnpartition partition (type='coder');
psnpartitiondate 文件的数据
5 pangzi 24
6 zhuqing 25
修改 hdfs 中 /user/hive 文件夹的权限
sudo -uhdfs hdfs dfs -chmod -R 777 /user/hive/
这个时候,通过 hive 会话查询,可以查到数据,由于在建表的时候,没有指定数据字段的解析方式,导致查询的时候识别不出来(同时验证 hive 读检查)
2.impala查询数据
通过 impala 会话查询数据,发现没有新增加的两条数据。
3.进行数据同步
refresh tableName 刷新指定表的元数据,将表新增的元数据新加载到内存(增量刷新)
操作是同步的,命令执行完数据就完成了刷新
REFRESH [table] PARTITION [partition]
refresh psnpartition;
invalidate metadata 默认将全部的表的元数据进行刷新
操作是异步的,虽然命令执行完了,但是后台仍然在执行数据的同步
INVALIDATE METADATA [[db_name.]table_name]
是用于刷新全库或者某个表的元数据,包括表的元数据和表内的文件数据,它会首先清除表的缓存,然后从metastore中重新加载全部数据并缓存,该操作代价比较重,主要用于在hive中修改了表的元数据,例如create table/drop table/alter table add columns等,即改变的表的结构。
invalidate metadata psnpartition;
g. impala参数
-V 参数可以看到命令执行的详细内容
impala-shell -V
h. impala不支持的的特性
impala 是 hive 的子集,impala的唯一的优点是,完全基于内存计算速度比较快,同时 impala 要求的硬件尤其是内存比较高
h. impala空值 NULL
i. impala 整合 hbase 数据库
在 hive 上面创建的是 外部表,hive 和 impala 是无缝连的,现在将 hive 与 hbase 进行整合后,间接的相当于 impala 和 hbase 数据库是连接起来的
CREATE EXTERNAL TABLE test_info (key string, name string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe'
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping"=":key,info:name")
TBLPROPERTIES
("hbase.table.name"="test_info");
j. impala 优化