我编写了一个Spark应用程序,它通过SparkConf实例设置一些配置内容,如下所示:
SparkConf conf = new SparkConf().setAppName("Test App Name");
conf.set("spark.driver.cores", "1");
conf.set("spark.driver.memory", "1800m");
conf.set("spark.yarn.am.cores", "1");
conf.set("spark.yarn.am.memory", "1800m");
conf.set("spark.executor.instances", "30");
conf.set("spark.executor.cores", "3");
conf.set("spark.executor.memory", "2048m");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> inputRDD = sc.textFile(...);
...
Run Code Online (Sandbox Code Playgroud)
当我使用命令(master=yarn&deploy-mode=client)运行此应用程序时
spark-submit --class spark.MyApp --master yarn --deploy-mode client /home/myuser/application.jar
Run Code Online (Sandbox Code Playgroud)
一切似乎都运行良好,Spark History UI显示正确的执行者信息:

但是当用(master=yarn&deploy-mode=cluster)运行时
我的Spark UI显示错误的执行程序信息(~512 MB而不是~1400 MB):

此外,我的应用程序名称Test App Name在客户端模式下运行时等于,但spark.MyApp在群集模式下运行时.但是,在群集模式下运行时,似乎会采用某些默认设置.我在这做错了什么?如何为群集模式进行这些设置?
我在由YARN管理的HDP 2.5集群上使用Spark 1.6.2.
我在 YARN 集群 (HDP 2.4) 中使用 Spark,设置如下:
当我使用命令运行我的 spark 应用程序时,spark-submit --num-executors 10 --executor-cores 1 --executor-memory 5g ...Spark 应该为每个执行程序提供5 GB 的 RAM(由于一些开销内存约为 10%,我将内存设置为 5g)。
但是当我查看 Spark UI 时,我看到每个执行程序只有 3.4 GB 的内存,请看截图:
有人可以解释为什么分配的内存这么少吗?
containers executor hadoop-yarn hortonworks-data-platform apache-spark
我安装Kerberos for Windows在新设置的 Windows 8.1 机器上。
我编辑了目录中的krb5.ini文件,C:\ProgramData\MIT\Kerberos5如下所示:
[libdefaults]
default_realm = HSHADOOPCLUSTER.DE
[realms]
HSHADOOPCLUSTER.DE = {
admin_server = had-job.server.de
kdc = had-job.server.de
}
Run Code Online (Sandbox Code Playgroud)
重新启动后,我kinit -kt daniel.keytab daniel通过控制台对 Realm进行了身份验证。还通过用户和密码获取票证Kerberos Ticket Manager似乎工作正常,因为票证显示在 UI 中。
我想知道的是,当我调用 a 时,klist我会得到一个空列表,它说的是cached tickets: 0:
这对我来说似乎不正常,因为我的 Ubuntu 计算机klist在kinit.
我究竟做错了什么?还有一些配置要做吗?有时我读到一个ksetup工具,但我不知道这里哪些设置是必要的,哪些不是......
================================================== ==========
我设置后
[libdefaults]
...
default_ccache_name = FILE:C:/ProgramData/Kerberos/krb5cc_%{uid}
Run Code Online (Sandbox Code Playgroud)
在 my 中krb5.conf,kinit通过控制台和 Kerberos 票证管理器的命令在指定路径中创建一个文件。到目前为止,一切看起来都很好。
但是:该 …
我想通过将巨大的csv文件细分为不同的分区来优化Spark应用程序的运行时,这取决于它们的特性.
例如,我有一个客户ID(整数,A),与日期的列(月+年,如01.2015,B)一列,并与产品ID列(整数,C)(多列有产品的具体数据,而不是分区所需的).
我想构建一个类似的文件夹结构/customer/a/date/b/product/c.当用户想要了解2016年1月出售的客户X的产品信息时,他可以加载并分析保存的文件/customer/X/date/01.2016/*.
是否有可能通过通配符加载此类文件夹结构?还应该可以加载特定时间范围的所有客户或产品,例如01.2015至2015年9月.是否可以使用通配符/customer/*/date/*.2015/product/c?或者如何解决这样的问题呢?
我想对数据进行一次分区,然后在分析中加载特定文件,以减少这些作业的运行时间(忽略分区的额外工作).
解决方案:使用Parquet文件
我更改了我的Spark应用程序以将我的数据保存到Parquet文件,现在一切正常,我可以通过给出文件夹结构来预先选择数据.这是我的代码片段:
JavaRDD<Article> goodRdd = ...
SQLContext sqlContext = new SQLContext(sc);
List<StructField> fields = new ArrayList<StructField>();
fields.add(DataTypes.createStructField("keyStore", DataTypes.IntegerType, false));
fields.add(DataTypes.createStructField("textArticle", DataTypes.StringType, false));
StructType schema = DataTypes.createStructType(fields);
JavaRDD<Row> rowRDD = goodRdd.map(new Function<Article, Row>() {
public Row call(Article article) throws Exception {
return RowFactory.create(article.getKeyStore(), article.getTextArticle());
}
});
DataFrame storeDataFrame = sqlContext.createDataFrame(rowRDD, schema);
// WRITE PARQUET FILES
storeDataFrame.write().partitionBy(fields.get(0).name()).parquet("hdfs://hdfs-master:8020/user/test/parquet/");
// READ PARQUET FILES
DataFrame read = sqlContext.read().option("basePath", "hdfs://hdfs-master:8020/user/test/parquet/").parquet("hdfs://hdfs-master:8020/user/test/parquet/keyStore=1/");
System.out.println("READ : " + read.count()); …Run Code Online (Sandbox Code Playgroud) 我想知道,我的字符串是否包含#1,#a,#abc,#123,#abc123dsds等文本...('#'字符包含一个或多个字符(数字和字母).
到目前为止我的代码不起作用:
string test = "#123";
boolean matches = test.Contains("#.+");
Run Code Online (Sandbox Code Playgroud)
该matches变量false.
apache-spark ×3
executor ×2
hadoop-yarn ×2
c# ×1
containers ×1
hdfs ×1
kerberos ×1
klist ×1
regex ×1
wildcard ×1