我想访问具有完全限定名称的hdfs,例如:
hadoop fs -ls hdfs://machine-name:8020/user
Run Code Online (Sandbox Code Playgroud)
我也可以简单地访问hdfs
hadoop fs -ls /user
Run Code Online (Sandbox Code Playgroud)
但是,我正在编写应该适用于不同发行版(HDP,Cloudera,MapR等)的测试用例,其中涉及访问具有限定名称的hdfs文件.
据我所知,hdfs://machine-name:8020它在core-site.xml中定义为fs.default.name.但这在不同的发行版上似乎有所不同.例如,hdfs是MapR上的maprfs.IBM BigInsights甚至没有core-site.xml在$HADOOP_HOME/conf.
hadoop似乎没有办法告诉我fs.default.name使用它的命令行选项定义了什么.
如何fs.default.name从命令行可靠地获取定义的值?
测试将始终在namenode上运行,因此机器名称很容易.但是获取端口号(8020)有点困难.我试过lsof,netstat ..但仍然找不到可靠的方法.
我遇到的问题是Hive表的架构在使用Spark 2.1.0和Hive 2.1.1的Mapr集群上的Spark和Hive之间不同步.
我需要尝试专门为托管表解决此问题,但可以使用非托管/外部表重现该问题.
saveAsTable一个数据帧保存到一个给定的表.mode("overwrite").parquet("path/to/table")覆盖数据之前保存表.我实际上是通过Spark和Hive外部的进程修改数据,但这会重现同样的问题.spark.catalog.refreshTable(...)刷新元spark.table(...).show().原始数据框和覆盖的数据框之间的任何列都将正确显示新数据,但不会显示仅在新表中的任何列.db_name = "test_39d3ec9"
table_name = "overwrite_existing"
table_location = "<spark.sql.warehouse.dir>/{}.db/{}".format(db_name, table_name)
qualified_table = "{}.{}".format(db_name, table_name)
spark.sql("CREATE DATABASE IF NOT EXISTS {}".format(db_name))
Run Code Online (Sandbox Code Playgroud)
另存为托管表
existing_df = spark.createDataFrame([(1, 2)])
existing_df.write.mode("overwrite").saveAsTable(table_name)
Run Code Online (Sandbox Code Playgroud)
请注意,使用以下内容保存为非托管表将产生相同的问题:
existing_df.write.mode("overwrite") \
.option("path", table_location) \
.saveAsTable(qualified_table)
Run Code Online (Sandbox Code Playgroud)
查看表的内容
spark.table(table_name).show()
+---+---+
| _1| _2|
+---+---+
| 1| 2|
+---+---+
Run Code Online (Sandbox Code Playgroud)
直接覆盖镶木地板文件
new_df = spark.createDataFrame([(3, 4, 5, 6)], ["_4", "_3", "_2", "_1"])
new_df.write.mode("overwrite").parquet(table_location)
Run Code Online (Sandbox Code Playgroud)
使用镶木地板阅读器查看内容,内容显示正确
spark.read.parquet(table_location).show()
+---+---+---+---+
| _4| _3| …Run Code Online (Sandbox Code Playgroud) Cloudera和Hortonworks使用HDFS,这是Apache Hadoop的基本概念之一.MapR使用自己的概念/实现.您可以直接使用本机文件系统而不是HDFS.您可以在MapR网站上使用此方法找到许多优势.
我想知道这种方法的缺点是什么?
这个问题类似,但不一样,因为Hive JDBC getConnection没有返回.然而,这是一个远程连接.此时,Metastore存在于启动hiveserver2的目录中.
我们在远程计算机上有一个正在运行的映射器集群.我想使用Java JDBC连接到此集群上的Hive.
因此我们启动了配置单元服务器:
/opt/mapr/hive/hive-0.11/bin/hiveserver2
服务器进程的输出不包含任何错误消息.它监听netstat报告的端口10000.
我尝试按照https://cwiki.apache.org/confluence/display/Hive/HiveClient中的描述连接到服务器,从而用运行hiveserver2的服务器名称替换localhost:
Connection con =
DriverManager.getConnection("jdbc:hive://myserver.example.com:10000/default", "", "");
Run Code Online (Sandbox Code Playgroud)
然而,该计划完全依赖于这一声明.它似乎没有连接.
可能我需要提供用户名和密码?
最初我使用过驱动程序org.apache.hadoop.hive.jdbc.HiveDriver.
但是,如果hive2服务器正在运行,我似乎应该使用驱动程序org.apache.hive.jdbc.HiveDriver.现在我得到以下例外:
Exception in thread "main" java.sql.SQLException: Could not establish connection to jdbc:hive2://myserver.example.com:10000/default: Required field 'client_protocol' is unset! Struct:TOpenSessionReq(client_protocol:null)
at org.apache.hive.jdbc.HiveConnection.openSession(HiveConnection.java:246)
at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:132)
at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105)
at java.sql.DriverManager.getConnection(DriverManager.java:579)
at java.sql.DriverManager.getConnection(DriverManager.java:221)
at HiveJdbcClient.main(HiveJdbcClient.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: org.apache.thrift.TApplicationException: Required field 'client_protocol' is unset! Struct:TOpenSessionReq(client_protocol:null)
at org.apache.thrift.TApplicationException.read(TApplicationException.java:108)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:71)
at org.apache.hive.service.cli.thrift.TCLIService$Client.recv_OpenSession(TCLIService.java:144)
at org.apache.hive.service.cli.thrift.TCLIService$Client.OpenSession(TCLIService.java:131) …Run Code Online (Sandbox Code Playgroud) 我正在尝试找到登录MapReduce作业的最佳方法.我在其他Java应用程序中使用slf4j和log4j appender,但由于MapReduce作业在集群中以分布式方式运行,我不知道应该在哪里设置日志文件位置,因为它是一个访问受限的共享集群特权.
是否有任何标准做法用于登录MapReduce作业,因此您可以在作业完成后轻松查看群集中的日志?
好!所以我决定使用Parquet作为hive表的存储格式,在我实际在集群中实现之前,我决定运行一些测试.令人惊讶的是,Parquet在我的测试中速度较慢,因为它比普通文本文件更快.
请注意,我在MapR上使用Hive-0.13
遵循我的操作流程
表A.
格式 - 文本格式
表大小 - 2.5 Gb
表B.
格式 - 镶木地板
表大小 - 1.9 Gb
[创建表格B作为选择*从A存储为镶木地板]
表C.
格式 - 带有快速压缩的镶木地板
表大小 - 1.9 Gb
[创建表格C存储为镶木地板tblproperties("parquet.compression"="SNAPPY")作为select*from A]
现在我对上面提到的表进行了一些测试并遵循了细节.
表A.
地图 - 15
减少 - 1
累积CPU - 123.33秒
所需时间 - 59.057秒
表B.
地图 - 8
减少 - 1
累计CPU - 204.92秒
所需时间 - 50.33秒
表A.
地图 - 15
减少 - 0
累计CPU - 51.18秒
所需时间 - 25.296秒
表B.
地图 - 8
减少 - 0
累计CPU …
我们有一个3节点MapR 集群.所有3个节点都在zookeeper运行,第一个节点有CLDB,webserver和ResourceManagerzookeeper不同.
群集已启动并运行,但是第一个节点昨天发布了CLDB服务未到来的帖子.
该MFS服务也未被视为在同一节点上运行.
我们试图通过给出命令maprcli dump zkinfo -json来获取最新的cldb时代,但是这给了我错误:
"Unable to obtain the ZooKeeper connection string”.
Run Code Online (Sandbox Code Playgroud)Warden日志也给出了同样的zookeeper错误.
我已经检查过zookeeper qstatus,它显示正在运行.
我们确保第一个节点有zookeeper作为leader,另外两个节点是follower,但仍然重启cldb会产生相同的错误,MFS服务也无法启动.
不知道如何调试以及如何启动和运行集群.
谢谢,
我尝试在论坛上搜索,在那里我可以从现有的hbase表架构创建一个新的空hbase表,但无法找到.
更确切地说,假设我有一个包含多个列族的表,并且在这些族中有许多列限定符.
现在我必须使用相同的模式创建另一个空表.我们是否像在RDBMS中那样创建表.
Create table new_table as
select * from existing_table where 1=2;
Run Code Online (Sandbox Code Playgroud)
现有表具有复杂的结构,因此create table指定列族和列限定符的常规hbase 命令不是一个选项.
仅供参考我正在使用Mapr HBase 0.98.12-mapr-1506,我没有选择切换到任何高级版本或其他发行版.
当我最初编写一个 delta 湖时,使用或不使用分区(使用 partitionBy)并没有任何区别。
在写入之前在同一列上使用重新分区,只会更改镶木地板文件的数量。使列显式分区为“不可为空”不会改变效果。
版本:
import org.apache.spark.sql.Row
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._
val tmp = spark.createDataFrame(
spark.sparkContext.parallelize((1 to 10).map(n => Row(n, n % 3))),
StructType(Seq(StructField("CONTENT", IntegerType), StructField("PARTITION", IntegerType))))
/*
tmp.show
+-------+---------+
|CONTENT|PARTITION|
+-------+---------+
| 1| 1|
| 2| 2|
| 3| 0|
| 4| 1|
| 5| 2|
| 6| 0|
| 7| 1|
| 8| 2|
| 9| 0|
| 10| 1|
+-------+---------+
tmp.printSchema
root
|-- CONTENT: integer (nullable = …Run Code Online (Sandbox Code Playgroud) 我在MapR中有点新,但我知道hbase.我正在阅读其中一个视频,我发现Mapr-DB是MapR中的NoSQL DB,它与Hbase类似.除此之外,Hbase也可以在MapR上运行.我在MapR-Db和Hbase之间感到困惑.它们之间的确切区别是什么?
何时使用Mapr-DB以及何时使用Hbase?
基本上我有一个java代码在MapR上的Hbase中进行批量加载,现在这里如果我使用我用于Apache hadoop的相同代码,那么代码在这里工作吗?
请帮我避免这种混乱.