Impala安裝和使用問題彙總

近日調研了Kudu+Impala大數據存儲引擎,在安裝和使用的過程中也遇到不少問題,解決起來也是不容易(原諒我比較菜鳥),在這裏記錄一下,也當是分享吧。

1.Impala不能創建表,提示權限的問題

具體情況:

[data.beta.com:21000] > create table user_data(user_id string,code string,value string);
Query: create table user_data(user_id string,tag_code string,tag_value string)
ERROR:
ImpalaRuntimeException: Error making 'createTable' RPC to Hive Metastore:
CAUSED BY: MetaException: Got exception: org.apache.hadoop.security.AccessControlException Permission denied: user=impala, access=WRITE, inode="/user/hive/warehouse/user_data":hive:hadoop:drwxr-xr-x
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:319)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:292)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:213)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:190)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1955)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1939)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkAncestorAccess(FSDirectory.java:1922)
at org.apache.hadoop.hdfs.server.namenode.FSDirMkdirOp.mkdirs(FSDirMkdirOp.java:71)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesystem.java:4150)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.mkdirs(NameNodeRpcServer.java:1109)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.mkdirs(ClientNamenodeProtocolServerSideTranslatorPB.java:633)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtosClientNamenodeProtocol2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
at org.apache.hadoop.ipc.ProtobufRpcEngineServerProtoBufRpcInvoker.call(ProtobufRpcEngine.java:640)
at org.apache.hadoop.ipc.RPCServer.call(RPC.[java:982](http://java:982/))
at org.apache.hadoop.ipc.ServerHandler1.run(Server.[java:2351](http://java:2351/))
at org.apache.hadoop.ipc.ServerHandler1.run(Server.[java:2347](http://java:2347/))
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.[java:422](http://java:422/))
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.[java:1866](http://java:1866/))
at org.apache.hadoop.ipc.ServerHandler.run(Server.java:2345)

權限問題我就不多說了,解決方案:

1.hadoop fs -ls /user/hive/

drwxr-xr-x - hive hadoop 0 2017-11-22 10:55 /user/hive/spark-jars drwxr-xr-x - hive hadoop 0 2018-01-08 14:37 /user/hive/spark-jars-hdp drwxr-xr-x - hive hadoop 0 2017-11-22 10:35 /user/hive/tez

2.hadoop fs -chmod -R 777 /user/hive

3.hadoop fs -ls /user/hive

可以看到都是可讀可寫了 drwxrwxrwx - hive hadoop 0 2017-11-22 10:55 /user/hive/spark-jars drwxrwxrwx - hive hadoop 0 2018-01-08 14:37 /user/hive/spark-jars-hdp drwxrwxrwx - hive hadoop 0 2017-11-22 10:35 /user/hive/tez

參考:http://orax.blog.sohu.com/305504807.html

2.表查詢錯誤(文件格式不對)

錯誤詳情:

ERROR: AnalysisException: Unrecognized table type for table: data_takeaway.dim_store_sku_info
CAUSED BY: TableLoadingException: Unrecognized table type for table: data_takeaway.dim_store_sku_info

一直以爲是我有什麼配置搞的不太穩妥,檢查了半天,有一張表突然就可以查了。但是又發現有的表不能查,還是報上面的錯。

這是因爲:Impala不支持ORC的表,不過我們數倉表基本都是ORC格式的,這就很尷尬了。

那麼Impala到底支持哪些文件格式呢? 官方文檔:http://impala.apache.org/docs/build/impala-2.8.pdf

文檔大約第640頁說明:

Impala暫時支持Parquet、Text、Avro、RCFile 、SequenceFile,巧得很,ORC固然是好,但是Impala並不支持。

此外,Impala支持以下壓縮編解碼器

Snappy(Impala推薦使用的壓縮格式,因爲有效平衡了壓縮比和減壓速度,瞬間壓縮速度很快,但是空間來說,Gzip可以節省更多空間,Snappy壓縮支持Impala 2.0及更高版本中的文本文件)

Gzip(推薦在最高壓縮級別時使用是最理想的,可以節省最多的存儲空間,支持Impala 2.0及更高版本中的文本文件)

Deflate(不支持文本文件)

Bzip2(支持Impala 2.0及更高版本中的文本文件)

LZO(只支持Text. Impala可以查詢LZO壓縮的文本表,但目前無法創建或插入數據,如果需要的話可以在Hive中執行這些操作。)

參考文檔:https://groups.google.com/a/cloudera.org/forum/#!topic/impala-user/ttVgCVEWSeo

3.查詢錯誤(表文件壓縮格式不支持)

Impala select查詢錯誤

ERROR:
TableLoadingException: Failed to load metadata for table: test_text_compress1
CAUSED BY: RuntimeException: Expected compressed text file with {.lzo,.gzip,.snappy,.bz2} suffix: 000001_0.deflate

查看錶的存儲文件

$ hdfs dfs -lsr /apps/hive/warehouse/app_rpt_day_v1/pt=xxxx

-rwxrwxrwx 3 root hdfs 261568095 2019-01-07 15:59 /apps/hive/warehouse/app_rpt_day_v1/pt=xxxx/000000_0.deflate
-rwxrwxrwx 3 root hdfs 97496501 2019-01-07 15:54 /apps/hive/warehouse/app_rpt_day_v1/pt=xxxx/000001_0.deflate

果然文件是被壓縮成了.deflate格式的文件了。但是隻是其中的一個分區是這個格式,其他的都是正常的,Impala不識別.deflate壓縮格式,所以報錯了。 impala支持的壓縮格式包括{.lzo,.gzip,.snappy,.bz2}四種,所以需要使用到Impala的表應該是需要設置成這幾種壓縮格式,或者說,不用壓縮。

Impala支持的幾種壓縮格式參考:https://www.cloudera.com/documentation/enterprise/5-11-x/topics/impala_file_formats.html

那麼需要怎麼去調整過來呢?

首先在hive裏面,設置壓縮格式

如果需要壓縮MapReduce中間文件(可以不用設置)

set hive.exec.compress.intermediate=true
set mapreduce.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec
set mapreduce.map.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;

最終落表的壓縮格式設置:

set hive.exec.compress.output=true 
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec

把之前有錯誤的分區(xxxx)數據重新刷一遍:

insert overwrite app_rpt_day_v1 parition(pt=xxxx) select a,b,c from temp_table

刷完成了之後去查看一下存儲文件的格式

$ hdfs dfs -lsr /apps/hive/warehouse/app_rpt_day_v1/pt=xxxx

-rwxrwxrwx 3 root hdfs 261568095 2019-01-07 16:34 /apps/hive/warehouse/app_rpt_day_v1/pt=xxxx/000000_0.snappy
-rwxrwxrwx 3 root hdfs 97496501 2019-01-07 16:34 /apps/hive/warehouse/app_rpt_day_v1/pt=xxxx/000001_0.snappy

可以看到文件的壓縮格式已經是snappy,在impala-shell中刷新一下表就可以了:

invalidate metadata app_rpt_day_v1;

再通過查詢語句查詢一波,OK,搞定。

4.Impala創建新表出錯

創建語句

CREATE TABLE foo (key INT, value STRING)
TBLPROPERTIES(
'storage_handler' = 'com.cloudera.kudu.hive.KuduStorageHandler',
'kudu.table_name' = 'foo',
'kudu.master_addresses' = '10.255.206.155',
'kudu.key_columns' = 'key');

報錯:ERROR: AnalysisException: A data distribution must be specified using a DISTRIBUTE BY clause.

修改爲:

CREATE TABLE foo (key INT, value STRING)
DISTRIBUTE BY HASH (key) INTO 16 BUCKETS
TBLPROPERTIES(
'storage_handler' = 'com.cloudera.kudu.hive.KuduStorageHandler',
'kudu.table_name' = 'foo',
'kudu.master_addresses' = '10.255.206.155',
'kudu.num_tablet_replicas' = '1',
'kudu.key_columns' = 'key');

報錯:Not enough live tablet servers to create a table with the requested replication factor 3. 1 tablet servers are alive.

修改爲:

CREATE TABLE foo (key INT, value STRING)
DISTRIBUTE BY HASH (key) INTO 16 BUCKETS
TBLPROPERTIES(
'storage_handler' = 'com.cloudera.kudu.hive.KuduStorageHandler',
'kudu.table_name' = 'foo',
'kudu.master_addresses' = '10.255.206.155',
'kudu.key_columns' = 'key');

修改配置文件/etc/kudu/conf.dist/master.gflagfile

添加--default_num_replicas=1 默認的副本數量,一般和集羣的節點數量相同,必須要小於等於集羣節點數量,否則會報錯。

重啓:

$ sudo service kudu-master restart
$ sudo service kudu-tserver restart

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章