我有一个全天候运行的EMR集群.我无法将其关闭并启动新的.
我想要做的是在已经运行的集群上执行类似bootstrap操作的操作,最好使用Python和boto或AWS CLI.
我可以想象通过两个步骤做到这一点:
1)在所有正在运行的实例上运行脚本(如果以某种方式可能,例如来自boto,这将是很好的)
2)将脚本添加到引导操作以用于我想要调整集群大小的情况.
所以我的问题是:使用boto或至少AWS CLI是否可以这样?我会通过GitHub上的文档和源代码,但我无法弄清楚如何添加新的"引导"行为时,集群已在运行.
我在Amazon Elastic Map Reduce(EMR)上运行Apache Spark上的工作.目前我正在运行emr-4.1.0,其中包括Amazon Hadoop 2.6.0和Spark 1.5.0.
当我开始工作时,YARN正确地将所有工作节点分配给spark作业(当然,一个用于驱动程序).
我将魔术"maximizeResourceAllocation"属性设置为"true",并将spark属性"spark.dynamicAllocation.enabled"也设置为"true".
但是,如果通过将节点添加到工作计算机的CORE池来调整emr集群的大小,则YARN仅会将一些新节点添加到spark作业.
例如,今天早上我有一个使用26个节点的工作(m3.2xlarge,如果这很重要) - 1个用于驱动程序,25个执行程序.我想加快工作,所以我尝试添加8个节点.YARN已经获取了所有新节点,但只将其中一个分配给了Spark作业.Spark成功地接收了新节点,并将其用作执行器,但我的问题是为什么YARN让其他7个节点闲置?
由于显而易见的原因,这很烦人 - 即使它们没有被使用,我也必须为资源付费,而我的工作根本没有加速!
有人知道YARN如何决定何时添加节点来运行火花作业?什么变量发挥作用?记忆?V-核心?什么?
提前致谢!
我通过我的EMR笔记本使用其他库时非常困难.EMR的AWS界面允许我创建Jupyter笔记本并将它们附加到正在运行的集群.我想在其中使用其他库.SSH进入机器并手动安装ec2-user或root不会使库可用于笔记本,因为它显然使用了livy用户.引导操作安装的东西hadoop.我无法从笔记本电脑安装,因为它的用户显然没有sudo,git等等,它可能不会安装到奴隶反正.
为通过EMR界面创建的笔记本安装附加库的规范方法是什么?
bash amazon-web-services libraries amazon-emr jupyter-notebook
最近,AWS 发布了 Amazon EMR Serverless(预览版)https://aws.amazon.com/blogs/big-data/announcing-amazon-emr-serverless-preview-run-big-data-applications-without-managing-servers/ - 非常有前途的新服务。
根据我的理解 - AWS Glue 是 Apache Spark 之上的托管服务(用于转换层)。AWS EMR 也主要用于 Apache Spark。因此,EMR Serverless(适用于 Apache Spark)看起来与 AWS Glue 非常相似。
现在我脑子里有一个问题 - 与 AWS Glue 的核心区别是什么以及何时选择 EMR Serverless 而不是 Glue?
潜在的 EMR Serverless,甚至可能成为 AWS Glue 转换层生态系统的一部分?也许 AWS 将用 EMR Serverless 取代 AWS Glue 中的转换层,这样就有意义了。AWS Glue 将扮演 ETL Overlay、Metastore 的角色,并以 EMR Serverless 作为处理层。
我正在小型三台服务器Amazon EMR 5(Spark 2.0)集群上运行Spark工作.我的工作运行了一个小时左右,因以下错误而失败.我可以手动重启并运行,处理更多数据,最终再次失败.
我的Spark代码非常简单,不直接使用任何Amazon或S3 API.我的Spark代码将S3文本字符串路径传递给Spark,Spark在内部使用S3.
我的Spark程序在循环中执行以下操作:从S3加载数据 - >处理 - >将数据写入S3上的不同位置.
我的第一个怀疑是,某些内部Amazon或Spark代码未正确处理连接,并且连接池已耗尽.
com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.AmazonClientException: Unable to execute HTTP request: Timeout waiting for connection from pool
at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:618)
at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient.doExecute(AmazonHttpClient.java:376)
at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient.executeWithTimer(AmazonHttpClient.java:338)
at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:287)
at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3826)
at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.AmazonS3Client.getObjectMetadata(AmazonS3Client.java:1015)
at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.AmazonS3Client.getObjectMetadata(AmazonS3Client.java:991)
at com.amazon.ws.emr.hadoop.fs.s3n.Jets3tNativeFileSystemStore.retrieveMetadata(Jets3tNativeFileSystemStore.java:212)
at sun.reflect.GeneratedMethodAccessor45.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:191)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
at com.sun.proxy.$Proxy44.retrieveMetadata(Unknown Source)
at com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem.getFileStatus(S3NativeFileSystem.java:780)
at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1428)
at com.amazon.ws.emr.hadoop.fs.EmrFileSystem.exists(EmrFileSystem.java:313)
at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand.run(InsertIntoHadoopFsRelationCommand.scala:85)
at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:60)
at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:58)
at org.apache.spark.sql.execution.command.ExecutedCommandExec.doExecute(commands.scala:74)
at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:115)
at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:115)
at org.apache.spark.sql.execution.SparkPlan$$anonfun$executeQuery$1.apply(SparkPlan.scala:136)
at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
at org.apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:133)
at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:114) …Run Code Online (Sandbox Code Playgroud) 我正在努力建立公司的新数据湖,并试图找到最好的和最近的选择在这里工作.因此,我找到了一个非常好的解决方案来使用EMR + S3 + Athena + Glue.
我做的过程是:
1 - 运行Apache Spark脚本,在Orc存储的S3中按日期分区生成3000万行.
2 - 运行Athena查询以创建外部表.
3 - 检查与胶水数据目录相关的EMR表,它运行良好.Spark和Hive都可以访问.
4 - 在按日期分区的其他文件夹中生成另外3000万行.在Orc格式
5 - 运行识别新表的Glue Crawler.添加到数据目录,Athena能够进行查询.但Spark和Hive无法做到这一点.请参阅以下例外:
火花
Caused by: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.hive.ql.io.orc.OrcStruct
蜂巢
Error: java.io.IOException: org.apache.hadoop.hive.ql.metadata.HiveException: Error evaluating audit_id (state=,code=0)
我正在检查是否有任何序列化问题,我发现了这个:
输入格式 org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
输出格式为 org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat
Serde序列化lib org.apache.hadoop.hive.ql.io.orc.OrcSerde
orc.compress SNAPPY
输入格式 org.apache.hadoop.mapred.TextInputFormat
输出格式 org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Serde序列化lib org.apache.hadoop.hive.ql.io.orc.OrcSerde
因此,这不适用于从Hive或Spark读取.它适用于雅典娜.我已经更改了配置,但对Hive或Spark没有任何影响.
有人遇到过这个问题?
amazon-s3 amazon-web-services amazon-emr apache-spark aws-glue
我刚刚建立了一个AWS EMR集群(带有Spark 2.3.2的EMR版本5.18).我ssh到主maschine并运行spark-shell或pyspark并得到以下错误:
$ spark-shell
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: /stderr (Permission denied)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:133)
at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
at org.apache.log4j.DailyRollingFileAppender.activateOptions(DailyRollingFileAppender.java:223)
at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)
at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)
at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:842)
at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:768)
at org.apache.log4j.PropertyConfigurator.parseCatsAndRenderers(PropertyConfigurator.java:672)
at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:516)
at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:580)
at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526)
at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
at org.apache.spark.internal.Logging$class.initializeLogging(Logging.scala:120)
at org.apache.spark.internal.Logging$class.initializeLogIfNecessary(Logging.scala:108)
at org.apache.spark.deploy.SparkSubmit$.initializeLogIfNecessary(SparkSubmit.scala:71)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:128)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
log4j:ERROR Either File or DatePattern options are not set for appender [DRFA-stderr].
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: /stdout (Permission denied)
at java.io.FileOutputStream.open0(Native …Run Code Online (Sandbox Code Playgroud) 根据AWS Athena 限制,您一次最多可以提交 20 个相同类型的查询,但这是一个软限制,可以根据要求增加。我曾经boto3与 Athena 进行交互,我的脚本提交了 16 个 CTAS 查询,每个查询大约需要 2 分钟才能完成。在 AWS 账户中,只有我在使用 Athena 服务。但是,当我通过控制台查看查询状态时,我发现尽管所有查询都处于 state 状态,但实际上只有少数查询(平均 5 个)正在执行Running。以下是通常会在 Athena 历史选项卡中看到的内容:

我了解,在我向 Athena 提交查询后,它会根据整体服务负载和传入请求的数量分配资源来处理查询。但是我尝试在不同的日期和时间运行它们,仍然会同时执行大约 5 个查询。
所以我的问题是它应该如何?如果是这样,那么如果其中大约 15 个查询处于空闲状态并等待可用插槽,那么能够提交多达 20 个查询又有什么意义呢?
刚刚在 presto 文档中偶然发现了 HIVE CONNECTOR,其中有一节AWS Glue Catalog Configuration Properties。在那里我们可以看到
hive.metastore.glue.max-connections:到 Glue 的最大并发连接数(默认为 5)。
这让我想知道它是否与我的问题有关。据我了解,Athena 只是一个在 EMR 集群上运行的 Presto,该集群配置为使用 AWS Glue 数据目录作为 Metastore。
那么,如果我的问题来自这样一个事实,即 Athena 的 EMR 集群只是使用默认值来连接到 Glue 的并发连接,即 5,这正是在我的情况下实际执行(平均)并发查询的数量。
Athena 团队最近为 Athena 部署了许多新功能。虽然 …
我想调试在AWS EMR集群上运行的Spark应用程序.如果我可以使用IntelliJ远程连接和调试它将是太棒了.我搜索过但发现很少.
有可能,如果是这样,有人可以指出我正确的方向吗?
谢谢.
remote-debugging intellij-idea amazon-web-services amazon-emr apache-spark
amazon-emr ×10
apache-spark ×5
aws-glue ×3
emr ×3
amazon-s3 ×1
bash ×1
boto ×1
concurrency ×1
hadoop-yarn ×1
libraries ×1
limit ×1
pyspark ×1
python ×1