首页 文章 精选 留言 我的

精选列表

搜索[高DPI],共10000篇文章
优秀的个人博客,低调大师

教你在 Kubernetes 上部署 Redis 高可用集群

Redis 介绍 Redis 代表REmote DIctionary Server是一种开源的内存中数据存储,通常用作数据库,缓存或消息代理。它可以存储和操作高级数据类型,例如列表,地图,集合和排序集合。由于Redis接受多种格式的密钥,因此可以在服务器上执行操作,从而减少了客户端的工作量。它仅将磁盘用于持久性,而将数据库完全保存在内存中。Redis是一种流行的数据存储解决方案,并被GitHub,Pinterest,Snapchat,Twitter,StackOverflow,Flickr等技术巨头所使用。 为什么使用 Redis 它的速度非常快。它是用 ANSI C 编写的,并且可以在 POSIX 系统上运行,例如 Linux,Mac OS X 和 Solaris。 Redis 通常被排名为最流行的键/值数据库和最流行的与容器一起使用的 NoSQL 数据库。 其缓存解决方案减少了对云数据库后端的调用次数。 应用程序可以通过其客户端 API 库对其进行访问。 所有流行的编程语言都支持 Redis。 它是开源且稳定的。 什么是 Redis 集群 Redis Cluster 是一组 Redis 实例,旨在通过对数据库进行分区来扩展数据库,从而使其更具弹性。群集中的每个成员(无论是主副本还是辅助副本)都管理哈希槽的子集。如果主机无法访问,则其从机将升级为主机。在由三个主节点组成的最小 Redis 群集中,每个主节点都有一个从节点(以实现最小的故障转移),每个主节点都分配有一个介于 0 到 16,383 之间的哈希槽范围。节点 A 包含从 0 到 5000 的哈希槽,节点 B 从 5001 到 10000,节点 C 从 10001 到 16383。群集内部的通信是通过内部总线进行的,使用协议传播有关群集的信息或发现新节点。 在 Kubernetes 中部署 Redis 集群 在Kubernetes中部署Redis集群面临挑战,因为每个 Redis 实例都依赖于一个配置文件,该文件可以跟踪其他集群实例及其角色。为此,我们需要结合使用Kubernetes StatefulSets和PersistentVolumes。 克隆部署文件 gitclonehttps://github.com/llmgo/redis-sts.git 创建 statefulset 类型资源 [root@node01redis-sts]#catredis-sts.yml --- apiVersion:v1 kind:ConfigMap metadata: name:redis-cluster data: update-node.sh:| #!/bin/sh REDIS_NODES="/data/nodes.conf" sed-i-e"/myself/s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/${POD_IP}/"${REDIS_NODES} exec"$@" redis.conf:|+ cluster-enabledyes cluster-require-full-coverageno cluster-node-timeout15000 cluster-config-file/data/nodes.conf cluster-migration-barrier1 appendonlyyes protected-modeno --- apiVersion:apps/v1 kind:StatefulSet metadata: name:redis-cluster spec: serviceName:redis-cluster replicas:6 selector: matchLabels: app:redis-cluster template: metadata: labels: app:redis-cluster spec: containers: -name:redis image:redis:5.0.5-alpine ports: -containerPort:6379 name:client -containerPort:16379 name:gossip command:["/conf/update-node.sh","redis-server","/conf/redis.conf"] env: -name:POD_IP valueFrom: fieldRef: fieldPath:status.podIP volumeMounts: -name:conf mountPath:/conf readOnly:false -name:data mountPath:/data readOnly:false volumes: -name:conf configMap: name:redis-cluster defaultMode:0755 volumeClaimTemplates: -metadata: name:data spec: accessModes:["ReadWriteOnce"] resources: requests: storage:5Gi storageClassName:standard $kubectlapply-fredis-sts.yml configmap/redis-clustercreated statefulset.apps/redis-clustercreated $kubectlgetpods-lapp=redis-cluster NAMEREADYSTATUSRESTARTSAGE redis-cluster-01/1Running053s redis-cluster-11/1Running049s redis-cluster-21/1Running046s redis-cluster-31/1Running042s redis-cluster-41/1Running038s redis-cluster-51/1Running034s 创建 service [root@node01redis-sts]#catredis-svc.yml --- apiVersion:v1 kind:Service metadata: name:redis-cluster spec: type:ClusterIP clusterIP:10.96.0.100 ports: -port:6379 targetPort:6379 name:client -port:16379 targetPort:16379 name:gossip selector: app:redis-cluster $kubectlapply-fredis-svc.yml service/redis-clustercreated $kubectlgetsvcredis-cluster NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE redis-clusterClusterIP10.96.0.100 初始化 redis cluster “ 下一步是形成Redis集群。为此,我们运行以下命令并键入yes以接受配置。前三个节点成为主节点,后三个节点成为从节点。 $kubectlexec-itredis-cluster-0--redis-cli--clustercreate--cluster-replicas1$(kubectlgetpods-lapp=redis-cluster-ojsonpath='{range.items[*]}{.status.podIP}:6379') >>>Performinghashslotsallocationon6nodes... Master[0]->Slots0-5460 Master[1]->Slots5461-10922 Master[2]->Slots10923-16383 Addingreplica10.244.2.11:6379to10.244.9.19:6379 Addingreplica10.244.9.20:6379to10.244.6.10:6379 Addingreplica10.244.8.15:6379to10.244.7.8:6379 M:00721c43db194c8f2cacbafd01fd2be6a2fede2810.244.9.19:6379 slots:[0-5460](5461slots)master M:9c36053912dec8cb20a599bda202a654f241484f10.244.6.10:6379 slots:[5461-10922](5462slots)master M:2850f24ea6367de58fb50e632fc56fe4ba5ef01610.244.7.8:6379 slots:[10923-16383](5461slots)master S:554a58762e3dce23ca5a75886d0ccebd2d58250210.244.8.15:6379 replicates2850f24ea6367de58fb50e632fc56fe4ba5ef016 S:20028fd0b79045489824eda71fac9898f17af89610.244.2.11:6379 replicates00721c43db194c8f2cacbafd01fd2be6a2fede28 S:87e8987e314e4e5d4736e5818651abc1ed6ddcd910.244.9.20:6379 replicates9c36053912dec8cb20a599bda202a654f241484f CanIsettheaboveconfiguration?(type'yes'toaccept):yes >>>Nodesconfigurationupdated >>>Assignadifferentconfigepochtoeachnode >>>SendingCLUSTERMEETmessagestojointhecluster Waitingfortheclustertojoin ... >>>PerformingClusterCheck(usingnode10.244.9.19:6379) M:00721c43db194c8f2cacbafd01fd2be6a2fede2810.244.9.19:6379 slots:[0-5460](5461slots)master 1additionalreplica(s) M:9c36053912dec8cb20a599bda202a654f241484f10.244.6.10:6379 slots:[5461-10922](5462slots)master 1additionalreplica(s) S:87e8987e314e4e5d4736e5818651abc1ed6ddcd910.244.9.20:6379 slots:(0slots)slave replicates9c36053912dec8cb20a599bda202a654f241484f S:554a58762e3dce23ca5a75886d0ccebd2d58250210.244.8.15:6379 slots:(0slots)slave replicates2850f24ea6367de58fb50e632fc56fe4ba5ef016 S:20028fd0b79045489824eda71fac9898f17af89610.244.2.11:6379 slots:(0slots)slave replicates00721c43db194c8f2cacbafd01fd2be6a2fede28 M:2850f24ea6367de58fb50e632fc56fe4ba5ef01610.244.7.8:6379 slots:[10923-16383](5461slots)master 1additionalreplica(s) [OK]Allnodesagreeaboutslotsconfiguration. >>>Checkforopenslots... >>>Checkslotscoverage... [OK]All16384slotscovered. 验证集群 [root@node01redis-sts]#kubectlexec-itredis-cluster-0--redis-cliclusterinfo cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_ping_sent:16 cluster_stats_messages_pong_sent:22 cluster_stats_messages_sent:38 cluster_stats_messages_ping_received:17 cluster_stats_messages_pong_received:16 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:38 [root@node01redis-sts]#forxin$(seq05);doecho"redis-cluster-$x";kubectlexecredis-cluster-$x--redis-clirole;echo;done redis-cluster-0 master 14 10.244.2.11 6379 14 redis-cluster-1 master 28 10.244.9.20 6379 28 redis-cluster-2 master 28 10.244.8.15 6379 28 redis-cluster-3 slave 10.244.7.8 6379 connected 28 redis-cluster-4 slave 10.244.9.19 6379 connected 14 redis-cluster-5 slave 10.244.6.10 6379 connected 28 测试集群 我们想使用集群,然后模拟节点的故障。对于前一项任务,我们将部署一个简单的 Python 应用程序,而对于后者,我们将删除一个节点并观察集群行为。 部署点击计数器应用 我们将一个简单的应用程序部署到集群中,并在其前面放置一个负载平衡器。此应用程序的目的是在将计数器值作为 HTTP 响应返回之前,增加计数器并将其存储在 Redis 集群中。 $kubectlapply-fapp-deployment-service.yml service/hit-counter-lbcreated deployment.apps/hit-counter-appcreated 在此过程中,如果我们继续加载页面,计数器将继续增加,并且在删除Pod之后,我们看到没有数据丢失。 $curl`kubectlgetsvchit-counter-lb-ojson|jq-r.spec.clusterIP` Ihavebeenhit20timessincedeployment. $curl`kubectlgetsvchit-counter-lb-ojson|jq-r.spec.clusterIP` Ihavebeenhit21timessincedeployment. $curl`kubectlgetsvchit-counter-lb-ojson|jq-r.spec.clusterIP` Ihavebeenhit22timessincedeployment. $kubectldeletepodsredis-cluster-0 pod"redis-cluster-0"deleted $kubectldeletepodsredis-cluster-1 pod"redis-cluster-1"deleted $curl`kubectlgetsvchit-counter-lb-ojson|jq-r.spec.clusterIP` Ihavebeenhit23timessincedeployment. 参考文档 [redis-cluster集群配置1] http://llmgo.cn/post/redis-003/ [redis-cluster集群配置2] http://www.yunweipai.com/36338.html [Redis集群 cluster-slot操作指令] https://blog.csdn.net/shuyun123456789/article/details/60868718 原文链接:http://tinyurl.com/vpihglin文章转自:奇妙的Linux世界 关注「开源Linux」加星标,提升IT技能

优秀的个人博客,低调大师

在 Android 上进行高刷新率渲染

作者 / Ady Abraham, Software Engineer 长久以来,手机屏幕刷新率都是 60Hz。应用和游戏开发者也习惯了假定刷新率为 60Hz,也就是每 16.6ms 生成一帧,而且这样开发出来的应用和游戏都会正常进行。但现在的情况已经不同了。最新的旗舰级设备往往会搭载刷新率更高的屏幕,可以带来更流畅的动画效果、更低的延迟,从而获得更好的整体用户体验。还有一些设备支持可变刷新率,比如 Pixel 4,它支持 60Hz 和 90Hz 两种刷新率。 60Hz 的屏幕每 16.6ms 刷新一次显示内容。这意味着图像显示的时间是 16.6ms 的倍数 (16.6ms、33.3ms、50ms 等)。支持多种刷新率的屏幕则带来了更多的选择,这些屏幕能以不同的速度进行渲染,并且不会出现抖动。例如,一个无法维持 60fps 渲染的游戏,在 60Hz 的屏幕上必须一路降到 30fps 才能确保流畅无抖动 (因为显示器只能以 16.6ms 的倍数周期呈现图像,所以 60Hz 的下一档可用帧速是每 33.3ms 显示一帧,即 30fps)。而在 90Hz 设备上,同样的游戏只需要下降到 45fps (每帧 22.2ms) 即可,这就为用户带来了更流畅的体验。而同时支持 90Hz 和 120Hz 的设备,则可以用每秒 120、90、60 (120/2)、45 (90/2)、40 (120/3)、30 (90/3)、24 (120/5) 等帧率流畅地呈现内容。 高频率渲染 渲染频率越高,就越难维持帧率,因为只有更少的时间完成相同的工作量。要在 90Hz 下进行渲染,应用需要在 11.1ms 内生成一帧,与此相比,在 60Hz 时则有 16.6ms 来生成一帧。 为了详细说明这一点,我们来看看 Android UI 的渲染流水线。我们可以将帧渲染大致分为五个流水线阶段: 应用的 UI 线程处理输入事件,调用应用的回调,并更新视图 (View) 层次结构中记录的绘图命令列表; 应用的 RenderThread 将记录的命令发送到 GPU ; GPU 绘制这一帧; SurfaceFlinger 是负责在屏幕上显示不同应用窗口的系统服务,它会组合出屏幕应该最终显示出的内容,并将画面提交给屏幕的硬件抽象层 (HAL); 屏幕最终呈现该帧的内容。 整个流水线由 Android Choreographer 控制。Choreographer 基于显示垂直同步 (vsync) 事件,它表示屏幕开始扫描出图像并更新显示像素的时间点。虽然 Choreographer 基于 vsync 事件,但对应用和 SurfaceFlinger 来说,其唤醒偏移量不同。下图展示了在 Pixel 4 设备上运行的流水线,应用在 vsync 事件后 2ms 被唤醒,SurfaceFlinger 则在 vsync 事件后 6ms 被唤醒。这样一来,应用产生一帧画面的时间为 20ms,SurfaceFlinger 组合画面内容的时间则为 10ms。 当以 90Hz 频率运行时,应用依然在 vsync 事件后 2ms 被唤醒。然而,SurfaceFlinger 在 vsync 事件后 1ms 被唤醒,同样有 10ms 的时间来合成屏幕内容。但这样一来应用只有 10ms 来渲染一帧画面,这时间就非常窘迫了: 为了缓解这种情况,Android 的 UI 子系统采用了预先渲染 (render ahead,指维持一帧的启动时间不变,但推迟其呈现时间) 来深化流水线,并将帧的呈现时间推迟一个 vsync。这样一来,应用可以有 21ms 的时间来生成一帧,同时确保维持 90Hz 的吞吐量。 一些应用,包括大多数游戏,都有自己自定义的渲染流水线。这些流水线可能会有更多或更少的阶段,具体取决于它们要完成的任务。一般来说,流水线越深,可以并行执行的阶段就越多,整体的吞吐量也会相应增加。但另一方面,这样可能会增加单帧的延迟 (延迟量为 number_of_pipeline_stages x longest_pipeline_stage)。这中间如何取舍需要开发者审慎考虑。 利用可变刷新率 如上所述,可变刷新率允许我们使用更多样的渲染频率。对于可以控制渲染速度的游戏,以及需要以特定速率呈现内容的视频播放器来说,这一点尤其有用。例如,要在 60Hz 的显示器上播放 24fps 的视频,我们需要使用 3:2 pulldown 算法,这就会产生抖动。但是,如果设备的屏幕可以原生显示 24fps 的内容 (24/48/72/120Hz),就无需使用 pulldown 算法,自然也就不会出现抖动了。 设备运行时的刷新率是由 Android 平台控制的。应用和游戏可以通过多种方法影响刷新率 (下面会有解释),但最终结果由平台决定。尤其是当屏幕上同时有多个应用时,这一点至关重要: 平台需要满足所有应用的刷新率需求。24fps 视频播放器就是一个很好的例子。24Hz 对于视频播放来说可能很好,但对于响应式 UI 来说就很糟糕了。如果一个推送通知的动画只有 24Hz,感觉就会很扎眼。在这种情况下,平台会选择让屏幕上的内容都显示良好的刷新率。 为此,应用可能需要知道当前设备的刷新率。可以通过以下方法来实现: SDK 通过 DisplayManager.DisplayListener 注册一个显示监听器,并通过 Display.getRefreshRate 查询刷新率。 NDK 使用 AChoreographer_registerRefreshRateCallback 注册回调 (API 级别30)。 应用可以通过在其 Window 或 Surface 上设置帧率来影响设备刷新率。这是 Android 11 中引入的一个新功能,允许平台了解应用的渲染需求。应用可以调用以下方法之一: SDK Surface.setFrameRate SurfaceControl.Transaction.setFrameRate NDK ANativeWindow_setRrameRate ASurfaceTransaction_setFrameRate 关于如何使用这些 API,请参考 帧率指南 文档。 系统会根据 Window 或 Surface 上设置的帧率选择最合适的刷新率。 在较旧的 Android 版本 (Android 11 之前) 中并不存在 setFrameRate API,这时应用仍然可以通过直接将 WindowManager.LayoutParams.preferredDisplayModeId 设置为 Display.getSupportedModes 中的可用模式之一来影响刷新率。从 Android 11 开始,我们不建议大家采用这种方法,因为平台会不知道应用的渲染意图。例如,如果一个设备支持 48Hz、60Hz 和 120Hz,屏幕上有两个应用分别调用 setFrameRate(60, …) 和 setFrameRate(24, …),那么平台可以选择 120Hz 来同时满足这两个应用。而如果这些应用使用了 preferredDisplayModeId,它们很可能会把模式设置为 60Hz 和 48Hz,那这时平台就无法使用 120Hz 了。这时平台只能从 60Hz 或 48Hz 中选择一个,从而影响到另一个应用的显示效果。 总结 刷新率不一定是 60Hz——不要想当然地认为它一定会是 60Hz,也不要基于历史经验作出硬性假设。 刷新率并不总是恒定的——如果您想了解实际的刷新率,就需要注册一个回调来知晓刷新率的变动,并相应地更新您应用内部的数据。 如果您没有使用 Android UI 工具包,而使用自定义的渲染器,请考虑根据当前的刷新率来改变您的渲染流水线。通过使用 OpenGL 上的 eglPresentationTimeANDROID 或 Vulkan 上的 VkPresentationTimesInfoGOOGLE 设置一个呈现时间戳,即可深化流水线。设置呈现时间戳可以向 SurfaceFlinger 指示何时呈现图像。如果设置为未来的几帧,它就会按照设置的帧数加深流水线。前文例子中的 Android UI 将呈现时间设置成了 frameTimeNanos + 2 * vsyncPeriod。 注: frameTimeNanos 从 Choreographer 获取;vsyncPeriod 从 Display.getRefreshRate() 获取。 使用 setFrameRate API 告诉平台您的渲染意图,平台会选择合适的刷新率来匹配不同的需求。 您应该只在必要时才使用 preferredDisplayModeId: 当 setFrameRate API 不可用时,或是当您需要使用非常特定的模式时。 最后,请您深入了解一下 Android 的帧同步库。这个库可以为您的游戏妥善处理帧同步,并使用前文中的方法来处理多种刷新率。

优秀的个人博客,低调大师

MaxCompute/Dataworks云数仓高可用最佳实践

学习工具通过MaxCompute官方文档和DataWorks官方文档了解相关产品的最新功能和使用方式MaxCompute官方文档:MaxCompute官方文档DataWorks官方文档:DataWorks官方文档一、logview排查作业在日常的开发过程中我们偶尔会发现某些任务突然耗时比较长,或者某些任务突然挂掉需要排查原因。Logview将用来协助我们完成这件事情。Logview是MaxCompute Job提交后查看和Debug任务的工具。通过Logview可看到一个Job的运行状态、运行结果以及运行细节和每个步骤的进度。当Job提交到MaxCompute后,会生成Logview的链接,用户可以直接在浏览器上打开Logview链接,进入查看Job的信息,而对于Logview上的诸多参数信息,究竟应该怎么发现问题所在呢?又如何通过Logview了解每个instance、task运行状态及资源占用情况,如何分析执行计划,分析query存在问题。下面主要介绍如何去使用Logview。1、Logview参数详解主要的信息包括ODPS Instance,其涵盖了队列信息以及子状态信息,另外一部分包括Fuxi Job,这可以进一步拆解成Task信息和Fuxi Instance信息。在整个任务结束之后可以看到其Summary以及Diagnosis诊断信息,此外还有上传下载的小功能。(1)ODPS Instance信息ODPS Instance中有这样的几个字段:URL、Project、InstanceID、Owner、StartTime、EndTime、Latency、Status以及Process等。URL是Endpoint的地址,Project存放项目的名称,InstanceID其实是时间戳跟着随机字符串,这个时间戳是精确到毫秒的,而这个时间是UTC时间,与电脑提交任务的时间是不一致的。StartTime和EndTime分别是任务开始和结束的时间,Latency则是任务运行所消耗的时间。而对于Status而言,则有四种状态:Waiting状态代表任务正在ODPS中处理,还没提交到Fuxi中运行;Waiting List代表任务已经到了Fuxi,并且在Fuxi中排队,N代表排队的位置;Running代表在Fuxi中运行;Terminated代表运行已经结束了。在表格里面,只要Status不是Terminated的状态,只要双击就能打开Queue Detail和SubStatus History详细信息。(2)Queue Detail&SubStatus History信息Queue Detail&SubStatus History最上面的Table是关于队列的信息,首先是Fuxi Job的name,SubStatus则是目前Job的运行状态,Progress是目前的执行进度。红框里面有两个字段,分别是WaitPOS和QueueLength,前者是目前排队的位置,后者是队列长度,根据这两个字段就能看到整个队列里面有多少任务在排队,这个任务排在第几位。Total Priority是其优先级,点击SubStatus History的图标可以打开下图中下侧的Table。对于SubStatus History而言着重介绍一下SubStatus Code以及其含义,在下图中列出了一些常见的SubStatus Code以及其对应含义。(3)ODPS Task信息ODPS Task信息,上面的表格的第一个字段是TaskName,Type指的是作业类型,Status指的是运行状态,双击Rusult会输出作业的整个结果集,双击Detail信息则会打开整个Fuxi Job的详细Table。(4)Fuxi Job Detail信息Fuxi Job详细信息主要分为三个部分,最左侧是任务的执行计划,这个执行计划是在Executor里面生成的,执行计划就是将一个任务分成不同的Stage来执行,每个Stage的都可以看做一个图上的点,而Stage之间的依赖关系就可以看做图的边,这样就构成一个有向无环图。(5)Fuxi Task Detail信息对于Fuxi Job Detail信息而言,又有哪些需要关注呢?第一个字段就是TaskName,其和执行计划的生成是相关的。后面的字段Fatal/Finished/TotalInstCount,在表格里面Fatal表示严重错误个数,因此被标红了;Finished表示已经结束的Instance的个数,后面的TotalInstCount指的是为每个Task启动的总Task数量。下一个字段I/O Records指的是输入和输出的记录的个数,I/O Bytes指的是输入和输出的字节数。FinishedPercentage指的是进度条,Status则指的是每个Task的运行状态。(6)Fuxi Instance Detail信息Fuxi Instance是整个作业流中最小的颗粒,其左侧的Terminated、Running、Ready以及Failed分别是相应状态的实例个数。而SmartFilter则会给出最早结束、最晚结束、运行时间最短和运行时间最长的四个Instance,将其筛选处理方便观察。Latency Chart则是以图表的形式展示所有的Instance的运行时长分布,而在Latency里面则是最长运行时间和最短运行时间以及平均运行时长,其实这三个时间对于分析长尾任务是非常有用的。在每个Instance的表格里面详细信息里面有一个StdOut,这是每个Instance在执行过程中打印的信息,而StuErr则是当Instance失败的时候可以用来查看出错原因的。(7)Fuxi Job Detail信息 之 Summary信息FuxiJob的Summary是在整个Job运行完之后才能查看的信息,主要包括Job消耗的CPU、内存、Job输入的表名以及记录数和字节数。此外,Job的运行时间单位是秒。Fuxi Task的Summary信息则主要包括Instance数量、Task运行时间、所有Instance里面的最大、最小和平均运行时间。2、Logview排查问题 (1)任务出错对于出错任务而言,从控制台输出就可以看到出错的原因,如果想要查看更加详细的信息,则可以打开Logview去查看ODPS的Result信息,如果失败了可以看到Status变成红色了。当双击Result之后就可以看到报错输出的整体信息。在出错信息里面会有错误码,而错误码与详细错误的对照表可以在官网找到。所以查看出错任务的方式有两种,一种是在作业结束之后查看其Result信息,另外一种方式则是去查看Instance的StdErr信息。**(2)慢作业诊断a、作业排队**对于慢任务诊断而言,可能看到一种现象就是作业一直在排队或者在控制台看到Fuxi Job一直在Waiting。进一步在Logview里面查看,发现Status到底是Waiting还是Waiting List,这样就可以发现其到底在哪里排队,如果状态是Waiting List则可以进一步地看其详细队列长度到底是多少,排到了第几位。还可以在SubStatus里面看到其子状态的信息。对于慢任务而言,如果不能够知道到底是哪一个作业是慢任务,可以采取两种方法:一种是“show p”,可以查看所有示例信息;而“top instance”可以查看当前正在执行的作业,而运行时间最长的作业可能就是阻塞队列导致其他任务排队的任务。对于由于资源抢占所导致的问题,可以做如下的优化:• 对于后付费用户而言,可以根据作业特性把相对稳定的周期性常规任务放到预付费资源组去执行,可以保证资源不被抢占。• 对于预付费用户而言,如果并行执行多个作业,最好合理安排作业执行时间,让作业错峰执行,临时任务则建议在后付费资源组执行。b、大量小文件大量小文件的存在也会导致任务执行很慢,比如在作业开始执行的时候,执行计划图中当Reduce的Task执行之后,发现系统自动增加一个MergeTask,这就是因为系统在做合并小文件的操作。其实,分布式文件系统的数据文件是按照块来存储的,盘古的块大小就是64M,所以如果文件小于64M就可以称为小文件。小文件的产生主要有这样的3种原因:(1)当Reduce计算过程中会产生大量小文件;(2)Tunnel数据采集过程中会生成小文件;(2)Job执行过程中生成的各种临时文件、回收站保留的过期文件等。而因为小文件过多,就会导致在Map阶段读取的数据出现分布不均匀的情况,进而引起长尾。如果存在大量的小文件,除了会浪费资源并降低磁盘空间利用率之外,还会影响整体的执行性能,因此从存储和性能两方面考虑都需要将计算过程中的小文件都合并。其实MaxCompute系统已经做了很多的优化,系统会自动分配一个Fuxi的MergeTask来做小文件的合并,但是其实还有很多情况下产生的小文件没有被合并。因此,MaxCompute提供了一些参数帮助用户进行小文件的合并。c、合并小文件首先可以查看小文件的数量,也就是判断自己的表里面是否存在很多小文件。可以用“desc extended TableName”命令就可以输出小文件数量。如果小文件数量很多就可以通过如图中下面的SQL来整合小文件。ALTER TABLE tablename [PARTITION] MERGE SMALLFILES;d、如何避免小文件产生为了避免小文件的操作,可以给出一些相关建议。比如在Reduce过程中产生的小文件建议可以使用insert overwrite向原表写入数据,或者把数据写入新表之后,将原表删除。其次,为了避免在Tunnel的数据采集过程中产生小文件,可以调用Tunnel SDK。也就是在上传数据的时候最好等到Buffer达到64M的时候再进行提交,不要过于频繁地进行提交。在导入分区表的时候建议为表设置生命周期,对于过期的数据可以进行自动清理。而针对大量临时表的情况,也可以加上生命周期,到期之后进行自动回收。(3)数据倾斜导致长尾任务数据倾斜导致长尾任务也会导致慢作业。其实数据倾斜就是因为数据分布不均匀,少数的Fuxi Instance处理的数据量远远超过其他的Instance,因此导致长尾任务。在MaxCompute的Logview里面,将鼠标放在Longtails标签上面就可以看到提示“Latency is more than twice average”,也就是说运行时间超过平均的两倍,就将其定义为长尾任务。如何判断任务是否长尾通过Logview有两种方式查看其是否属于长尾任务,第一种方法就是查看Long-Tails的Fuxi Instances的Max Lantency。如果括号里面的数量大于0,那就说明已经出现了长尾,点击标签之后就会将所有长尾Instance列出来,并且可以查看其各种信息。另外一种查看长尾任务的方法就是查看Fuxi Job的Summary信息以及Diagnosis信息,通过分析Summary可以查看长尾分布在哪个阶段。如果instance time的max和avg两个值相差很大就说明出现了长尾;而对于input records而言,如果输入数据量的max和avg相差也很大就说明发生了数据倾斜。在Diagnosis信息里面专门有一项是检查数据倾斜和长尾的,所以通过系统所给出的信息就能够查看出是否出现了长尾还是数据倾斜,也同时给出了一些改进意见。二、MaxCompute CU管家MaxCompute管家为系统运维人员提供作业、存储资源查询、配额组设置等功能。使用MaxCompute管家前,您需要购买MaxCompute包年包月CU资源。1、进入MaxCompute管家执行如下步骤进入MaxCompute管家。(1)登录DataWorks控制台。(2)单击左侧导航栏计算引擎列表 > MaxCompute,进入 计算引擎列表-MaxCompute页面,并选择您所在的Region。(3)单击包年包月区域的CU管理,进入MaxCompute管家页面。 2、概览概览页面可以按照不同的配额组和时间段查看当前使用CU、总CU、当前存储量、CU资源使用趋势、存储使用趋势。配额组:指定需要查看的配额组信息。默认为空,表示查看全部配额组。您可以在配额组后选择需要查询的时间段,默认为最近24小时。当前使用CU:指定配额组下全部的项目在搜索截止时刻的CU资源使用量。总CU:配额组为空时(即选择所有配额组):总CU=(搜索截止时刻的订单预留CU)+(搜索截止时刻的订单非预留CU)。配额组非空时(即指定单个配额组):总CU=(搜索截止时刻的指定配额组预留CU最大配额)+(搜索截止时刻的指定配额组非预留CU最大配额)。当前存储量:指定配额组下全部的项目在搜索截止时刻的存储使用量。申请CU趋势:指定配额组下的全部项目在搜索时段内作业计划申请的CU资源量(包括预留CU资源和非预留CU资源)。已用CU趋势:指定配额组下的全部项目在搜索时段内作业实际使用的CU资源量(包括预留CU资源和非预留CU资源)。总CU趋势:指定配额组在搜索时间段内总CU资源的使用量(包括预留CU资源和非预留CU资源)。存储大小趋势:指定配额组下的全部项目在搜索时间段内存储使用量。3、查看作业运行情况作业运行情况每2分钟采集一次。(1)单击左侧导航栏上的作业,进入作业快照页面。(2)选择需要查询的配额组以及时间段,查看选择时间段内当前配额组下所有作业情况。支持查看历史作业快照。(3)在概览页面,单击CU资源使用趋势图上的任意一点可跳转至该时刻下指定配额组对应全部项目内的作业历史快照。(4)终止作业,对于没有必要继续运行的作业,主账号可以单个或批量终止提交的作业。批量终止作业时,一次不能超过10个。在包年包月作业列表页面,单击作业列表上方的终止作业,在终止作业页面,输入将要终止作业对应instance Id列表和备注信息。4、查看作业快照操作记录MaxCompute管家支持查看作业快照操作的记录,目前最多保存7天的操作记录。单击左侧导航栏作业。单击作业快照操作记录页签,查看作业快照操作记录。5、查看存储资源消耗您可以通过包年包月项目列表页面,了解存储的消耗情况。 存储量每1个小时采集一次。(1)单击左侧导航栏上的项目,进入包年包月项目列表页面,列表中会显示项目的已用存储量。您也可以通过右上角的筛选器筛选配额组查看存储量。(2)单击指定项目名称,查看项目某段时间的存储水位。(3)选择查看的时间段。单击时间下拉框,选择开始时间和结束时间后,单击OK。6、查看CU资源消耗您可以通过包年包月配额组列表页面,查看CU资源消耗。 计算资源CU每2分钟采集1次。(1)单击左侧导航栏上的配额,进入包年包月配额组列表页面。(2)单击指定的资源组名称,查看资源消耗情况。(3)选择查看的时间段。单击时间下拉框,选择开始时间和结束时间后,单击OK。7、配额组设置您可以在包年包月配额组列表页面,进行相关配额组设置,例如,新建配额组、修改和删除配额组。8、修改项目配额组支持将项目当前指定的配额组修改为其它配额组,新建的配额组即可通过该功能进行资源隔离。(1)单击项目,进入包年包月项目列表页面。(2)选择需要修改配额组的项目名称,单击其后的修改,进入修改配额组信息页面。(3)在Quota名称的下拉框中,选择配额组。(4)单击执行,完成修改。9、注意事项CU过小无法发挥计算资源及管家的优势。如果禁用主账号的AccessKey,会导致相应的子账号无法使用MaxCompute管家。三、数据备份和恢复日常开发过程中会存在误删表数据这个时候应该怎么去恢复呢?MaxCompute提供数据备份与恢复功能(目前处于公测阶段),系统会自动备份数据的历史版本(例如被删除或修改前的数据)并保留一定时间,您可以对保留周期内的数据进行快速恢复,避免因误操作丢失数据。1、数据备份相关命令查看所有表的备份数据:show history for tables;查看指定表的备份数据:show history for table ;查看已删除表的备份数据:show history for table table_name ('id'='xxxx');查看分区表的备份数据:show history for table table_name ('id'='xxxx');查看分区的备份数据:show history for table table_name partition_spec;或show history for table table_name PARTITION('id'='xxxx');2、数据恢复相关命令恢复已删除的表:restore table table_name ('id'='xxxxx'); 如果存在同名的表,您需要将同名的表重命名后才能执行恢复操作。恢复表至指定版本:restore table table_name to LSN 'xxxx';恢复表至指定版本,并命名为新表或将数据更新到不同名的表中:restore table table_name to LSN 'xxxx' as new_table_name;恢复分区表:restore table table_name ('id'='xxxxx');恢复分区:restore table table_name PARTITION('id'='xxxx')[PARTITION('id'='xxxx')];恢复分区至指定版本,并命名为新表:restore table table_name partition_spec1[partition_spec2 ]to LSN 'xxxx' as new_table_name;**四、类型转换1、支持的数据类型**当前Maxompute一共支持3个数据类型版本。1.0数据类型版本、2.0数据类型版本和Hive兼容数据类型。MaxCompute设置数据类型版本属性的参数共有3个:odps.sql.type.system.odps2:MaxCompute 2.0数据类型版本的开关,属性值为True或False。odps.sql.decimal.odps2:MaxCompute 2.0的Decimal数据类型的开关,属性值为True或False。odps.sql.hive.compatible:MaxCompute Hive兼容模式(即部分数据类型和SQL行为兼容Hive)数据类型版本的开关,属性值为True或False。在新增项目时MaxCompute可以对3个版本的数据类型进行选择。当我们开启2.0数据类型版本需要注意以下问题:• 部分隐式类型转换会被禁用。例如,STRING->BIGINT、STRING->DATETIME、DOUBLE->BIGINT、DECIMAL->DOUBLE、DECIMAL->BIGINT有精度损失或者报错的风险。禁用类型可以通过CAST函数强制进行数据类型转换。• VARCHAR类型常量可以通过隐式转换为STRING常量。2、谨慎修改类型flag根据以往客户经验,有客户任务每天都是正常执行的。突然某一天凌晨任务失败,导致依赖作业都在等待。排查发现是有账号需改了数据类型的flag,导致部分数据类型转换失败任务报错。所以在日常的开发过程中需要谨慎设置数据类型的fla。以免造成任务报错。五、权限控制日常开发中MaxCompute的项目空间所有者(Project Owner)或安全管理员需要对项目空间进行日常安全运维和数据安全保障,如何去合理的控制权限是一个非常关键的环节。权限控制包括MaxCompute安全模型,DataWorks的安全模型。当通过DataWorks使用MaxCompute,而DataWorks的安全模型不满足业务安全需求时,需要合理地将两个安全模型结合使用。1、MaxCompute和DataWorks权限关系通过MaxCompute的安全模型进行权限控制,并不会影响成员在DataWorks界面上的操作。但是通过DataWorks的用户角色分配,则有可能影响成员的MaxCompute资源权限。可以参考这个文档:https://help.aliyun.com/document_detail/105012.html?spm=a2c4g.11186623.6.913.3a7c713fH2gG3k2、MaxCompute管理员Admin一个企业使用多款阿里云产品,MaxCompute是其中一个产品,用的是同个主账号,主账号不是由使用MaxCompute的大数据同学管理,大数据同学使用的是子账号。大数据同学日常需要给MaxCompute项目 操作新增子账号(add user),新的子账号授权(grant xx on project/table)等操作,即日常权限管理。 但是MaxCompute项目权限管理默认只有owner可以操作,而MaxCompute项目的owner只能是主账号。当我们使用子账号开通MaxCompute并创建项目,项目的owner依然是对应的主账号。DataWorks中,子账号拥有项目空间的“项目管理员”或“安全管理员”角色,都只是拥有对应DataWorks的操作权限,并不能操作MaxCompute 项目的权限管理。所以需要指定一个子账号作为大数据MaxCompute的权限管理账号,让主账号给该子账号授admin role--如主账号是bob@aliyun.com,作为日常权限管理的子账号是Allengrant admin TO ram$bob@aliyun.com:Allen;注意:admin可以满足常用的一些日常权限管理,但并不能代替owner做所有管理,此时还是必须要owner才能进行操作。3、MaxCompute超级管理员主账号不是大数据团队管理,使用MaxCompute员工都只持有子账号,而project的owner只能为主账号,但是很多MaxCompute的权限管理还需要owner才可以操作(如项目级别的flag设置,package跨项目资源共享配置等),因此非常需要一个子账号拥有超级管理员权限。(1)关于super_administrator roleSuper_Administrator role:MaxCompute内置的管理角色,拥有操作项目内所有类型资源的权限和管理类权限,具体权限请参考文档管理角色。该角色可由project owner指派给子账号,子账号获得该角色后,即可代替owner对该project在进行数据开发过程中所需的各种管理操作,包括常用的项目级别的flag设置以及所有权限管理操作。(2)指派子账号为超级管理员前提建议:• 可以将有权限创建project的子账号指派为super_administrator role,这样该账号既可以很好的管理DataWorks项目的同时管理对应的Max Compute project。如何授权子账号可创建project可参考子账号创建project子账号创建project• 建一个project只能指派一个子账号为super_administrator role,其他需要有基本的权限管理可以指派admin role• 需要注意明确该子账号持有人的职责,建议一个子账号对应一个开发者,避免账号共用,以便能更好的保障数据安全。确认好具体哪个子账号可以用户超级管理员(同时该子账号可以创建项目空间),子账号创建好project,此时projec的owner依然是主账号,主账号可以通过以下方式将super_administrator role 授权给该子账号。• 通过MaxCompute客户端授权:假设主账号用户bob@aliyun.com是项目空间project_a的Owner,Allen是bob@aliyun.com中的RAM子账号。打开项目空间project_a。use project_a;为项目空间project_a添加RAM子账号Allen。add user ram$bob@aliyun.com:Allen;为子账号Allen授权Super_Administrator角色权限。grant super_administrator TO ram$bob@aliyun.com:Allen;为子账号Allen授权Admin角色权限。grant admin TO ram$bob@aliyun.com:Allen;• 通过DataWorks授权:a、 登录DataWorks,进入工作空间配置页面。b、添加子账号为项目空间成员(已经添加过可忽略)。1) 单击左侧导航栏上的成员管理,进入成员管理页面。2) 单击右上角的添加成员。3) 在添加成员页面,从待添加账号列表中选择需要添加的组织成员显示在已添加账号列表中。4) 勾选角色并单击确定。c、 为子账号授权Super_Administrator角色。1) 单击左侧导航栏MaxCompute高级配置。2) 单击左侧导航栏自定义用户角色。3) 单击需要授权角色后的成员管理,从待添加账号列表中选择需要添加的组织成员显示在已添加账号列表中。20/jpeg/36371/1580893560423-d5235e7c-b42f-4809-805b-faa68d5c9d08.jpeg) 单击确定,完成账号授权。• 子账号查看自身的权限:cmd中执行 show grants;,如果有Super_Administrator 这个role,说明已经赋权成功。(3)成员、权限管理拥有super_administrator 角色的子账号本身已经拥有所有project资源的查询和操作权限,所以无须再给自身授权。以下给出针对其他成员和成员权限管理的建议。成员管理•MaxComopute 支持云账号和RAM子账号(子账号只能为Project owner的子账号),为了更好的保障数据安全,建议project中添加的user均为owner主账号的RAM子账号。主账号可控制子账号,如人员转岗离职等,主账号可以注销或更新对应的子账号。若通过DataWorks进行项目成员管理,只能添加owner的RAM子账号。• RAM子账号只能通过主账号添加(这个不是MaxCompute可以改变的事实),所以对于某project 成员即使拥有super_administrator 角色的超级管理员,也只能先需要主账号先创建好其他子账号才可以将其他子账号添加到project中。• 建议只添加需要在当前project进行数据开发(即会在当前project执行job)的user,对于有数据交互业务需求的user,建议通过package方式进行跨project资源共享,避免把user添加到project增加成员管理的复杂度。• 员工转岗或离职,先把对应子账号在project里remove掉,然后再通知owner注销子账号。如果是拥有super_administrator 角色的子账号持有者转岗或离职,则需要由主账号进行remove以及注销账号。权限管理• 建议通过角色进行权限管理,即权限和role关联,role和user关联。• 建议实施最小够用原则,避免权限过大造成安全隐患。• 跨project使用数据时,建议通过package方式实现,避免资源提供方增加成员管理成本,只需要管理package。权限审计可以通过MaxCompute的元数据服务Information_Schema服务提供的相关视图进行权限审计。4、跨项目访问资源和函数这篇文章通过3种方式介绍跨项目访问函数和资源,可以参考使用:https://developer.aliyun.com/article/741262?groupCode=maxcompute5、如何仅给某个子账号所有表的select权限(1)在项目工作空间中创建一个自定义角色create role select_only_role;(2)为自定义角色select_only_role对项目内所有表(包括未来项目内新建的表)赋予Describe,Select权限项目下的所有表:GRANT SELECT ON table * TO Role select_only_role privilegeproperties("policy" = "true");(3)给用户赋予自定义角色权限(也可以在Dataworks的自定义角色web-ui界面里,添加某个成员到该自定义角色下)grant role select_only_role to RAM$account@company_name.com:ram_account;六、DataWorks任务未按时调度运行 被提交发布至生产环境的任务,会按照调度周期来产生实例。通常来讲,实例的状态有:未运行、等待时间、等待资源、运行中、运行失败、运行成功。定时时间到了,但是实例的状态还是「未运行」,此时需要检查上游节点的运行情况。只有上游节点全部运行成功,该节点才会开始调度。1、如何处理DataWorks任务未按时调度运行,运行日志中显示槽位等待、正在等待在云端的gateway资源等信息的情况?DataWorks免费为您提供了一定的任务调度能力,但如果达到一定的任务并发量,则需要等待运行中的任务结束后,才可以继续运行等待中的任务。在满足业务诉求的前提下,建议您合理安排任务错峰运行,以便在各个时间段,充分利用已购买的计算资源。 如果需要获得更高任务并发调度能力,可以购买独享资源组。2、运行诊断同时运维中心新推出「运行诊断」的功能,针对实例各个环节可能出现的问题,为您提供全链路的诊断和建议。定时时间到了还不运行?任务一直在等资源?运行失败但是日志看不懂?这些问题通通帮您解决。运行诊断功能的介绍文档链接: https://help.aliyun.com/document_detail/158815.html七、数据同步任务出现脏数据怎么办? 1、产生脏数据的可能场景同步任务在任务运行过程中遇到插件的所有异常都会作为脏数据进行统计。• 数据类型转换(源端表和目的表字段类型不匹配,大概率)• 源端表数据过长• 数据源异常• Reader/Writer插件异常• 数据中有表情符2、解决方案(1)增大脏数据限制条数,扩大阈值,容忍脏数据(源端脏数据仍存在,不同步到目的端,日志会显示脏数据记录,任务不会报错)。(2)根据运行日志定位源端脏数据。日志中会显示具体是哪个列有问题,同时会有列数据信息,根据日志去修复后再同步。(3)当同步任务脏数据报错 XXXX command denied to user ‘XXXX’这类报错是因为没有数据源权限造成的问题,联系对应DBA申请一下update、insert、delete权限。(4)当我们的数据源有带表情的数据做同步时,需要注意只有utf8mb4编码支持同步表情符。例如:添加JDBC格式的数据源时,需要修改utf8mb4的设置,如jdbc:mysql://xxx.x.x.x:3306/database?com.mysql.jdbc.faultInjection.serverCharsetIndex=45。八、如何排查周期任务取不到数据(产出数据为空)的问题?首先我们需要知道节点依赖和业务逻辑之间是什么关系,其实任务依赖关系(调度关系)和业务逻辑并没有确切性的关联,业务依赖(即抽数/写数表之间的逻辑)并不等于任务依赖之间的关系。举个栗子:A任务产出A表,B任务产出B表,A、B同级,C任务依赖A、B的表数据产出C表,但是任务依赖关系上C可以不依赖A而只依赖B,这样C任务仍然能够取得符合业务逻辑的数据并对表C进行写入数据。1、几种容易取不到源表数据的情况(1)分区&参数的影响:比如说我有A、B两个小时任务。A任务业务逻辑样例:create table if not exists A(id bigint,name string)partitioned by(dt string,hh string);insert overwrite table A partition(dt='${bidate}',hh='${hh}') select * from S wheredt='${bizdate}';其中S表为初始数据表(即底表);B表的业务逻辑样例:create table if not exists B(id bigint,name string)partitioned by(dt string,hh string);insert overwrite table B partition (dt='${bidate}',hh='${hh}') select * from A wheredt='${bizdate}' and hh='${hh}';当A任务的参数中hh这个参数前推了一个小时,实际hh值变成了hh='$[hh24-1],而B任务的hh参数不变,hh='$[hh24]'这种形式,那么一定会找不到A表对应的分区而导致inputs数据为空,从而B表没有写入数据.(2)没有严格的依赖关系而直接取源表的某一个还没有产出数据的分区导致没有数据:比如说,A、B两个小时表作为C表的数据来源端,但是C并没有严格依赖A、B两个任务(即C任务没有依赖A、B只在业务上对A、B取数)。当A表任务产出ds='20200421',hh='10'的这个二级分区的时间是 10点30分,而C任务执行并取A表的ds='20200421',hh='10'这个分区的时间是10点10分,那么,就会导致C任务执行时取不到具体的A表对应分区数据而输入为空。(3)sql逻辑问题导致输入为空在A、B做join关联后并将数据写入到C表,不符合sql逻辑的条件筛选,没有select出符合条件的数据.九、数据源连通性测试失败怎么办?测试数据源连通性失败,是大家在使用数据集成时经常会遇到的问题。排除某些时候粗心大意填错配置信息外,很多时候大家发现都配置对了,但为什么还不通?此时怎么知道问题出在什么地方了呢?1、测试原理数据集成由管控服务和执行集群两部分组成,数据源连通性测试由管控服务发起,而同步任务实际运行在执行集群,由于二者部署在不同服务器,所以可能存在数据源连通性测试成功但同步任务执行失败,或者数据源连通性测试失败但同步任务执行成功等情况。2、可能的原因对于用户添加的数据源,不能连通具体原因可能有:• 网络不可达• 数据源应用层权限控制• 白名单、应用层acl限制等至于后两者,是没有办法来推断的,但是判断物理网络通与不通非常关键,如果网络是通的,但是权限受控,就直接找对应的数据源管理员协调就好了。3、网络通路排查借助FTP/SFTP数据源辅助验证数据源网络是否可达。操作方法:(1)添加ftp数据源,设置ip、port为待测试数据源的相关信息(2)协议Protocol类型选择SFTP(3)用户名、密码任意填写(4)点击【测试连通性】 十、员工离职,任务如何去修改如果有员工离职,运维人员应该在相关人员离职之前修改离职人员创建的任务节点、资源、表的Owner。同时注意检查生产环境MaxCompute访问者身份。1、修改MaxCompute访问者身份需要注意事项一般建议生产环境配置MaxCompute访问者身份为主账号。如果生产环境配置MaxCompute访问者身份为子账号那么离职员工离职前需要修改为其他员工账号或者主账号。开发环境离职员工账号删除RAM账号之后,该账号创建的所有节点在开发环境冒烟测试、开发环境运维中心执行其名下任务会失败。需要在员工离职之前做好任务节点、资源、表的Owner。(1)主账号需要转交任务,批量转交任务操作如下:批量修改任务节点责任人如果人员流动,需要将离职人员的任务批量修改责任人。可以去运维中心周期任务找到该责任人节点。选中节点之后修改责任人即可。 (2)修改表的OwnerMaxCompute SQL支持通过changeowner命令来修改表的拥有人(表Owner),相应的语法格式如下。alter table table_name changeowner to 'ALIYUN$xxx@aliyun.com';(3)修改资源权限该账号可以访问的资源可以通过角色的形式授权给交接人相同的资源访问权限。十一、Spark访问VPCSpark on MaxCompute可以访问位于阿里云VPC内的实例(例如ECS、HBase、RDS),默认MaxCompute底层网络和外网是隔离的,Spark on MaxCompute提供了一种方案通过配置spark.hadoop.odps.cupid.vpc.domain.list来访问阿里云的vpc网络环境的Hbase。Hbase标准版和增强版的配置不同,本文通过访问阿里云的标准版和增强版的Hbase简单的描述需要加的配置。1、配置步骤如下(1)需要添加spark.hadoop.odps.cupid.vpc.domain.list配置,该配置描述了需要访问的一个或多个实例的网络情况。配置值为json格式,注意,需要把json压缩成一行。以下给出了示例,把regionId, vpcId, 实例域名,端口等替换成真实值即可。{"regionId":"cn-beijing", "vpcs":[{"zones":[{"urls":[{ "domain":"spark-oss.oss-cn-beijing-internal.aliyuncs.com", "port":80}] }]}]}(2)在要访问的服务中添加ip白名单,允许100.104.0.0/16网段的访问(3)如果region是cn-shanghai或者cn-beijing,需要设置spark.hadoop.odps.cupid.smartnat.enable=true注意: 只能配置访问本Region下面某一个vpc的服务,不支持同时和多个vpc打通。必须要将配置压缩为一行,并且配置在spark-defaults.conf或dataworks的配置项中,而不能写在代码中!!!十二、任务执行慢调度任务执行缓慢首先我们可以找到周期任务执行的节点。然后查看任务运行的日志。1、如何区分哪些是DataWorks资源延迟哪些是MaxCompute计算延迟呢?日志中如果看到的是正在等待在云端的gateway资源那么可能是执行的任务达到一定的任务并发量,则需要等待运行中的任务结束后,才可以继续运行等待中的任务。在满足业务诉求的前提下,建议您合理安排任务错峰运行,以便在各个时间段,充分利用已购买的计算资源。同时可以购买独享资源组来保证高峰时间任务的正常运行。如果看任务的日志是Job Queueing,那基本是等待计算资源了。对于慢任务而言,如果不能够知道到底是哪一个作业是慢任务,可以采取两种方法:一种是“show p”,可以查看所有示例信息;而“top instance”可以查看当前正在执行的作业,而运行时间最长的作业可能就是阻塞队列导致其他任务排队的任务。对于由于资源抢占所导致的问题,可以做如下的优化:• 对于后付费用户而言,可以根据作业特性把相对稳定的周期性常规任务放到预付费资源组去执行,可以保证资源不被抢占。• 对于预付费用户而言,如果并行执行多个作业,最好合理安排作业执行时间,让作业错峰执行,临时任务则建议在后付费资源组执行。如果按量付费用户需要转包年包月可以提交工单咨询。2、按量付费转包年包月思路先通过元数据统计下过去的job消耗情况。https://help.aliyun.com/document_detail/135433.html?spm=a2c4g.11186623.6.944.40527312UEAT6A#title-r2c-tak-zfi大致思路:(1)统计最近1个月所有需要转预付的Project每日cost_cpu消耗总和。表 information_schema.tasks_history,cost_cpu原始单位为core.s,需转换成CU.时(cost_cpu/100/3600)。找出正常消费中最高消费的那一天。(2)对正常消费最高的那一天按小时分别统计所有任务CU时消耗。(3)按业务划分时间段,取最高时间段进行分析。如业务是0-7点为业务高峰期划分为“ETL夜间高峰段”,其他的使用都很低则为一个时间段。(4)汇总高峰期时间段CU时总量/时间,得出该时间段内需要的CU量。如:0-7点这8个小时,CU时为800,则需要100CU跑8个小时才能跑完800CU时的计算量。当然这个是最理想的状态,任务不都是很平均,所以需要根据情况设置一定的冗余。另外还有比较极端的情况, 比如有些任务有依赖关系到5点的时候才需要超大量的CU量,但是这个时候用100CU来跑即使跑3个小时也跑不完,所以这种情况就要结合业务需求,如果这个实在不能延迟时间,要么加大CU量,要么这个Project不适合用包年包月资源。(5)建议不要一次性转所有Project,逐步转,每转一个Project需要通过MaxCompute管家监控资源使用情况,看情况进行扩容/缩容。 欢迎加入“MaxCompute开发者社区2群”,点击链接MaxCompute开发者社区2群申请加入或扫描二维码

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册