我已经在链接上配置了我的Hive:http://www.youtube.com/watch?v = Dqo1ahdBK_A,但是在Hive中创建表时出现以下错误.我使用hadoop-1.2.1和hive-0.12.0.
hive> create table employee(emp_id int,name string,salary double);
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
Run Code Online (Sandbox Code Playgroud) 我有一个Hive表,它由列分区dt
.如果不存在,我需要添加一个分区,例如,dt='20181219'
.
现在我正在使用HiveMetaStoreClient#getPartition(dbName, tableName, 20181219)
.如果分区不存在,则捕获NoSuchObjectException
并添加它.
在Java中有没有优雅的方法来实现这一目标?
我有一个带有 Spark(v2.2.1) 的 AWS EMR 集群 (v5.11.1),并尝试使用 AWS Glue 数据目录作为其元存储。根据官方 AWS 文档(下面的参考链接)中提供的指南,我已按照这些步骤操作,但在访问 Glue 目录数据库/表时遇到了一些差异。EMR 集群和 AWS Glue 都在同一个账户中,并提供了适当的 IAM 权限。
AWS 文档:https : //docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-glue.html
观察:
- 使用 spark-shell(来自 EMR 主节点):
- 作品。能够使用以下命令访问 Glue DB/Tables:
Run Code Online (Sandbox Code Playgroud)spark.catalog.setCurrentDatabase("test_db") spark.catalog.listTables
- 使用 spark-submit(来自 EMR 步骤):
- 不起作用。不断收到错误“数据库'test_db'不存在”
错误跟踪如下:
INFO HiveClientImpl:Hive 客户端(版本 1.2.1)的仓库位置是 hdfs:///user/spark/warehouse
INFO HiveMetaStore: 0: get_database: 默认
INFO audit: ugi=hadoop ip=unknown-ip-addr cmd=get_database:默认
信息 HiveMetaStore:0:get_database:global_temp
信息审计:ugi=hadoop ip=unknown-ip-addr cmd=get_database:global_temp
WARN ObjectStore:无法获取数据库 global_temp,返回 NoSuchObjectException
INFO SessionState:创建的本地目录:/mnt3/yarn/ usercache / Hadoop的/应用程序缓存/ application_1547055968446_0005 / container_1547055968446_0005_01_000001的/ …
amazon-emr apache-spark aws-glue hive-metastore aws-glue-data-catalog
我知道这些,
要获取表中的列名,我们可以触发:
show columns in <database>.<table_name>
Run Code Online (Sandbox Code Playgroud)要获取表的描述(包括 column_name、column_type 和许多其他详细信息):
describe [formatted] <database>.<table_name>
Run Code Online (Sandbox Code Playgroud)我知道我可以使用上面的查询并过滤结果以获取列名称和类型。但我想知道是否有任何直接命令可以只获取列名和类型,例如select columns, column_type ...
?
在测试生产用例时,我创建并保存了(使用Hive Metastore)这样的表:
table1:
fields: key1, key2, value1
sortedBy key1,key2
bucketBy: key1, 100 buckets
table2:
fields: key1, key2, value2
sortedBy: key1,key2
bucketBy: key1, 100 buckets
Run Code Online (Sandbox Code Playgroud)
我正在运行这样的查询(以伪代码)
table1.join(table2, [“key1”, “key2”])
.groupBy(“value2”)
.countUnique(“key1”)
Run Code Online (Sandbox Code Playgroud)
常识说,这种连接应该简单地通过没有任何交换的排序合并连接来完成。但是spark进行了交流然后加入。
即使对于这个特定的用例,我也可以按两个键进行存储,由于其他一些用例,我需要按key1进行存储。当我使用这样的单个键进行(更简单的)连接时:
table1.join(table2, [“key1”])
Run Code Online (Sandbox Code Playgroud)
它按预期方式工作(即不进行任何排序的合并合并)。
现在,如果要过滤,我对这些表进行了优化联接,如下所示:
table1.join(table2, [“key1”])
.filter(table1.col(“key2”) == table2.col(“key2”))
Run Code Online (Sandbox Code Playgroud)
它恢复为交换,然后加入。
当联接密钥是bucketBy密钥的超集时,如何说服火花不要进行交换?
注意:
我知道的一个技巧是,如果我将不等式检查改写为等式检查,则火花不会洗牌。
(x == y)也可以表示为((x> = y)&(x <= y))。如果我在上一个示例中应用了两个这样的过滤器:
.filter(table1.col(“ key2”)> = table2.col(“ key2”))
.filter(table1.col(“ key2”)<= table2.col(“ key2”))
它将继续使用sort-merge join,而不会进行交换,但这不是解决方案,这是一个hack。
我试图hive
从体系结构方面来理解,我指的是汤姆·怀特(Tom White)关于Hadoop的书。
我遇到下列条款进来问候蜂巢:Hive Services
,hiveserver2
,metastore
等等。
请参考本书中的以下图表(Hadoop:权威指南)。
我无法理解以下内容:
1)Hive Services
Hive架构图中有什么?我们说的也一样hiveserver2
吗?
2)Driver
Hive架构图中是什么?
3)是什么MetaStore
(我不是指Metastore数据库)。是否正在运行某些流程?如果是这样,这是hiveserver2
吗?由于该图MetaStore
可以是远程的,因此,如果这是一个JVM进程,它属于哪个组件?
4)说Hive service JVM
,MetaStore JVM Server
。但是,这些组件在哪里安装?它们是“配置单元”的“服务器”端的一部分吗?
5)在“ Hive体系结构”图中,是否显示“ Hive Server”?这是什么?这就是我们所说的“ Hive Server 1”,“ Hive Server2”。
谁能帮忙了解一下?
比方说,datalake在AWS上.使用S3作为存储,使用Glue作为数据目录.因此,我们可以使用Glue作为Metastore轻松使用athena,redshift或EMR来查询S3上的数据.
我的问题是,是否可以将Glue数据目录公开为AWS上托管的Databricks等外部服务的Metastore?
我正在尝试使用附加到 EMR 的 EMR 笔记本在公共数据集上使用 Spark.sql() 或 sqlContext.sql() 方法(此处 Spark 是我们启动 EMR Notebook 时可用的 SparkSession 对象的变量)运行 SQL 查询安装了 Hadoop、Spark 和 Livy 的集群。但在运行任何基本 SQL 查询时我遇到错误:
AnalysisException: u'java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient;
Run Code Online (Sandbox Code Playgroud)
我想使用 SQL 查询,所以我不想使用 Dataframe API 作为替代方案。
这个 Spark EMR 集群没有安装单独的 Hive 组件,我不打算使用它。我尝试寻找此问题的各种原因,其中一个原因可能是 EMR 笔记本可能没有创建 Metastore_db 的写入权限。不过,我无法证实这一点。我尝试在集群中的日志文件中查找此错误,但找不到它,并且不确定哪个文件可能包含此错误以便获取更多详细信息。
重现问题的步骤:
使用控制台创建 AWS EMR 集群并使用快速启动视图,选择 Spark 选项。它将包括 Hadoop 2.8.5 YARN 上的 Spark 2.4.3、Ganglia 3.7.2 和 Zeppelin 0.8.1。它可以只有 1 个主节点和 2 个核心节点,甚至可以有 1 个主节点。
从 EMR 页面中的笔记本链接创建一个 EMR 笔记本,将其附加到您刚刚创建的集群并打开它(默认情况下,选择的内核将为 pyspark,如笔记本右上角所示)。
我正在使用 Hadoop 3 处理 Hadoop 集群 (HDP)。还安装了 Spark 和 Hive。
由于 Spark 和 Hive 目录是分开的,因此有时会有点混乱,要知道如何以及在 Spark 应用程序中保存数据的位置。
我知道,该属性spark.sql.catalogImplementation
可以设置为in-memory
(使用基于 Spark 会话的目录)或hive
(使用 Hive 目录进行持久元数据存储 -> 但元数据仍与 Hive DB 和表分开)。
我想知道物业metastore.catalog.default
是做什么的。当我将其设置hive
为时,我可以看到我的 Hive 表,但由于这些表存储/warehouse/tablespace/managed/hive
在 HDFS的目录中,我的用户无权访问该目录(因为 hive 是所有者)。
那么,metastore.catalog.default = hive
如果我无法从 Spark 访问表,为什么要设置, 呢?和 Hortonwork 的 Hive Warehouse Connector 有关系吗?
感谢您的帮助。
我正在开发一个关于 Kubernetes 的项目,在该项目中我使用 Spark SQL 创建表,并且我想将分区和模式添加到 Hive Metastore。但是,我没有找到任何在 Kubernetes 上安装 Hive Metastore 的正确文档。知道我已经安装了 PostGreSQL 数据库是否有可能?如果是的话,您能帮我提供任何官方文件吗?
提前致谢。
hive-metastore ×10
apache-spark ×5
hive ×5
hadoop ×3
amazon-emr ×2
aws-glue ×2
amazon-s3 ×1
bucket ×1
data-lake ×1
databricks ×1
hadoop3 ×1
hiveql ×1
java ×1
join ×1
kubernetes ×1
pyspark ×1