使用hadoop restful api实现对集群信息的统计

简介: 本文根据hadoop/spark的RESTful API,实现了对集群基本信息的统计功能,包括HDFS文件系统、job情况、资源队列情况的统计。这些API只提供了基础的数据,具体的统计与分析,还需要基于这些基础数据做一些简单的开发。

(适用于hadoop 2.7及以上版本)

涉及到RESTful API

1. 统计HDFS文件系统实时使用情况

{
  "ContentSummary":
  {
    "directoryCount": 2,
    "fileCount"     : 1,
    "length"        : 24930,
    "quota"         : -1,
    "spaceConsumed" : 24930,
    "spaceQuota"    : -1
  }
}
  • 关于返回结果的说明:
{
  "name"      : "ContentSummary",
  "properties":
  {
    "ContentSummary":
    {
      "type"      : "object",
      "properties":
      {
        "directoryCount":
        {
          "description": "The number of directories.",
          "type"       : "integer",
          "required"   : true
        },
        "fileCount":
        {
          "description": "The number of files.",
          "type"       : "integer",
          "required"   : true
        },
        "length":
        {
          "description": "The number of bytes used by the content.",
          "type"       : "integer",
          "required"   : true
        },
        "quota":
        {
          "description": "The namespace quota of this directory.",
          "type"       : "integer",
          "required"   : true
        },
        "spaceConsumed":
        {
          "description": "The disk space consumed by the content.",
          "type"       : "integer",
          "required"   : true
        },
        "spaceQuota":
        {
          "description": "The disk space quota.",
          "type"       : "integer",
          "required"   : true
        }
      }
    }
  }
}

2. 查看集群的实时信息和状态

  • URL

http://emr-header-1:8088/ws/v1/cluster

  • 返回结果
{
    "clusterInfo": {
        "id": 1495123166259, 
        "startedOn": 1495123166259, 
        "state": "STARTED", 
        "haState": "ACTIVE", 
        "rmStateStoreName": "org.apache.hadoop.yarn.server.resourcemanager.recovery.NullRMStateStore", 
        "resourceManagerVersion": "2.7.2", 
        "resourceManagerBuildVersion": "2.7.2 from 4bee04d3d1c27d7ef559365d3bdd2a8620807bfc by root source checksum c63f7cc71b8f63249e35126f0f7492d", 
        "resourceManagerVersionBuiltOn": "2017-04-17T12:28Z", 
        "hadoopVersion": "2.7.2", 
        "hadoopBuildVersion": "2.7.2 from 4bee04d3d1c27d7ef559365d3bdd2a8620807bfc by root source checksum 3329b146070a2bc9e249fa9ba9fb55", 
        "hadoopVersionBuiltOn": "2017-04-17T12:18Z", 
        "haZooKeeperConnectionState": "ResourceManager HA is not enabled."
    }
}

3. 查看资源队列的实时信息,包括队列的配额信息、资源使用实时情况

  • URL

http://emr-header-1:8088/ws/v1/cluster/scheduler

  • 返回结果
{
    "scheduler": {
        "schedulerInfo": {
            "type": "capacityScheduler", 
            "capacity": 100, 
            "usedCapacity": 0, 
            "maxCapacity": 100, 
            "queueName": "root", 
            "queues": {
                "queue": [
                    {
                        "type": "capacitySchedulerLeafQueueInfo", 
                        "capacity": 1, 
                        "usedCapacity": 0, 
                        "maxCapacity": 90, 
                        "absoluteCapacity": 1, 
                        "absoluteMaxCapacity": 90, 
                        "absoluteUsedCapacity": 0, 
                        "numApplications": 0, 
                        "queueName": "algorithm_aliyun", 
                        "state": "RUNNING", 
                        "resourcesUsed": {
                            "memory": 0, 
                            "vCores": 0
                        }, 
                        "hideReservationQueues": false, 
                        "nodeLabels": [
                            "*"
                        ], 
                        "numActiveApplications": 0, 
                        "numPendingApplications": 0, 
                        "numContainers": 0, 
                        "maxApplications": 100, 
                        "maxApplicationsPerUser": 100, 
                        "userLimit": 100, 
                        "users": null, 
                        "userLimitFactor": 1, 
                        "AMResourceLimit": {
                            "memory": 11776, 
                            "vCores": 7
                        }, 
                        "usedAMResource": {
                            "memory": 0, 
                            "vCores": 0
                        }, 
                        "userAMResourceLimit": {
                            "memory": 160, 
                            "vCores": 1
                        }, 
                        "preemptionDisabled": true
                    }, 
                    {
                        "type": "capacitySchedulerLeafQueueInfo", 
                        "capacity": 1, 
                        "usedCapacity": 0, 
                        "maxCapacity": 90, 
                        "absoluteCapacity": 1, 
                        "absoluteMaxCapacity": 90, 
                        "absoluteUsedCapacity": 0, 
                        "numApplications": 0, 
                        "queueName": "dcps_aliyun", 
                        "state": "RUNNING", 
                        "resourcesUsed": {
                            "memory": 0, 
                            "vCores": 0
                        }, 
                        "hideReservationQueues": false, 
                        "nodeLabels": [
                            "*"
                        ], 
                        "numActiveApplications": 0, 
                        "numPendingApplications": 0, 
                        "numContainers": 0, 
                        "maxApplications": 100, 
                        "maxApplicationsPerUser": 100, 
                        "userLimit": 100, 
                        "users": null, 
                        "userLimitFactor": 1, 
                        "AMResourceLimit": {
                            "memory": 11776, 
                            "vCores": 7
                        }, 
                        "usedAMResource": {
                            "memory": 0, 
                            "vCores": 0
                        }, 
                        "userAMResourceLimit": {
                            "memory": 160, 
                            "vCores": 1
                        }, 
                        "preemptionDisabled": true
                    }, 
                    {
                        "type": "capacitySchedulerLeafQueueInfo", 
                        "capacity": 31, 
                        "usedCapacity": 0, 
                        "maxCapacity": 100, 
                        "absoluteCapacity": 31, 
                        "absoluteMaxCapacity": 100, 
                        "absoluteUsedCapacity": 0, 
                        "numApplications": 0, 
                        "queueName": "default", 
                        "state": "RUNNING", 
                        "resourcesUsed": {
                            "memory": 0, 
                            "vCores": 0
                        }, 
                        "hideReservationQueues": false, 
                        "nodeLabels": [
                            "*"
                        ], 
                        "numActiveApplications": 0, 
                        "numPendingApplications": 0, 
                        "numContainers": 0, 
                        "maxApplications": 3100, 
                        "maxApplicationsPerUser": 3100, 
                        "userLimit": 100, 
                        "users": null, 
                        "userLimitFactor": 1, 
                        "AMResourceLimit": {
                            "memory": 13088, 
                            "vCores": 8
                        }, 
                        "usedAMResource": {
                            "memory": 0, 
                            "vCores": 0
                        }, 
                        "userAMResourceLimit": {
                            "memory": 4064, 
                            "vCores": 3
                        }, 
                        "preemptionDisabled": true
                    }, 
                    {
                        "type": "capacitySchedulerLeafQueueInfo", 
                        "capacity": 15.000001, 
                        "usedCapacity": 0, 
                        "maxCapacity": 100, 
                        "absoluteCapacity": 15.000001, 
                        "absoluteMaxCapacity": 100, 
                        "absoluteUsedCapacity": 0, 
                        "numApplications": 0, 
                        "queueName": "feed_aliyun", 
                        "state": "RUNNING", 
                        "resourcesUsed": {
                            "memory": 0, 
                            "vCores": 0
                        }, 
                        "hideReservationQueues": false, 
                        "nodeLabels": [
                            "*"
                        ], 
                        "numActiveApplications": 0, 
                        "numPendingApplications": 0, 
                        "numContainers": 0, 
                        "maxApplications": 1500, 
                        "maxApplicationsPerUser": 7500, 
                        "userLimit": 100, 
                        "users": null, 
                        "userLimitFactor": 5, 
                        "AMResourceLimit": {
                            "memory": 12320, 
                            "vCores": 8
                        }, 
                        "usedAMResource": {
                            "memory": 0, 
                            "vCores": 0
                        }, 
                        "userAMResourceLimit": {
                            "memory": 9856, 
                            "vCores": 7
                        }, 
                        "preemptionDisabled": true
                    }, 
                    {
                        "type": "capacitySchedulerLeafQueueInfo", 
                        "capacity": 51, 
                        "usedCapacity": 0, 
                        "maxCapacity": 90, 
                        "absoluteCapacity": 51, 
                        "absoluteMaxCapacity": 90, 
                        "absoluteUsedCapacity": 0, 
                        "numApplications": 0, 
                        "queueName": "hot_aliyun", 
                        "state": "RUNNING", 
                        "resourcesUsed": {
                            "memory": 0, 
                            "vCores": 0
                        }, 
                        "hideReservationQueues": false, 
                        "nodeLabels": [
                            "*"
                        ], 
                        "numActiveApplications": 0, 
                        "numPendingApplications": 0, 
                        "numContainers": 0, 
                        "maxApplications": 5100, 
                        "maxApplicationsPerUser": 5100, 
                        "userLimit": 100, 
                        "users": null, 
                        "userLimitFactor": 1, 
                        "AMResourceLimit": {
                            "memory": 11776, 
                            "vCores": 7
                        }, 
                        "usedAMResource": {
                            "memory": 0, 
                            "vCores": 0
                        }, 
                        "userAMResourceLimit": {
                            "memory": 6688, 
                            "vCores": 5
                        }, 
                        "preemptionDisabled": true
                    }, 
                    {
                        "type": "capacitySchedulerLeafQueueInfo", 
                        "capacity": 1, 
                        "usedCapacity": 0, 
                        "maxCapacity": 90, 
                        "absoluteCapacity": 1, 
                        "absoluteMaxCapacity": 90, 
                        "absoluteUsedCapacity": 0, 
                        "numApplications": 0, 
                        "queueName": "push_aliyun", 
                        "state": "RUNNING", 
                        "resourcesUsed": {
                            "memory": 0, 
                            "vCores": 0
                        }, 
                        "hideReservationQueues": false, 
                        "nodeLabels": [
                            "*"
                        ], 
                        "numActiveApplications": 0, 
                        "numPendingApplications": 0, 
                        "numContainers": 0, 
                        "maxApplications": 100, 
                        "maxApplicationsPerUser": 100, 
                        "userLimit": 100, 
                        "users": null, 
                        "userLimitFactor": 1, 
                        "AMResourceLimit": {
                            "memory": 11776, 
                            "vCores": 7
                        }, 
                        "usedAMResource": {
                            "memory": 0, 
                            "vCores": 0
                        }, 
                        "userAMResourceLimit": {
                            "memory": 160, 
                            "vCores": 1
                        }, 
                        "preemptionDisabled": true
                    }
                ]
            }
        }
    }
}

4. 查看实时的作业列表,列表信息中也包含了作业运行的详情信息,包括作业名称、id、运行状态、起止时间,资源使用情况。

  • URL

http://emr-header-1:8088/ws/v1/cluster/apps

  • 返回结果
{
  "apps":
  {
    "app":
    [
       {
          "finishedTime" : 1326815598530,
          "amContainerLogs" : "http://host.domain.com:8042/node/containerlogs/container_1326815542473_0001_01_000001",
          "trackingUI" : "History",
          "state" : "FINISHED",
          "user" : "user1",
          "id" : "application_1326815542473_0001",
          "clusterId" : 1326815542473,
          "finalStatus" : "SUCCEEDED",
          "amHostHttpAddress" : "host.domain.com:8042",
          "progress" : 100,
          "name" : "word count",
          "startedTime" : 1326815573334,
          "elapsedTime" : 25196,
          "diagnostics" : "",
          "trackingUrl" : "http://host.domain.com:8088/proxy/application_1326815542473_0001/jobhistory/job/job_1326815542473_1_1",
          "queue" : "default",
          "allocatedMB" : 0,
          "allocatedVCores" : 0,
          "runningContainers" : 0,
          "memorySeconds" : 151730,
          "vcoreSeconds" : 103
       },
       {
          "finishedTime" : 1326815789546,
          "amContainerLogs" : "http://host.domain.com:8042/node/containerlogs/container_1326815542473_0002_01_000001",
          "trackingUI" : "History",
          "state" : "FINISHED",
          "user" : "user1",
          "id" : "application_1326815542473_0002",
          "clusterId" : 1326815542473,
          "finalStatus" : "SUCCEEDED",
          "amHostHttpAddress" : "host.domain.com:8042",
          "progress" : 100,
          "name" : "Sleep job",
          "startedTime" : 1326815641380,
          "elapsedTime" : 148166,
          "diagnostics" : "",
          "trackingUrl" : "http://host.domain.com:8088/proxy/application_1326815542473_0002/jobhistory/job/job_1326815542473_2_2",
          "queue" : "default",
          "allocatedMB" : 0,
          "allocatedVCores" : 0,
          "runningContainers" : 1,
          "memorySeconds" : 640064,
          "vcoreSeconds" : 442
       } 
    ]
  }
}

5. 统计作业扫描的数据量情况

job扫描的数据量,需要通过History Server的RESTful API查询,MapReduce的和Spark的又有一些差异。

5.1 Mapreduce job扫描数据量

  • URL

http://emr-header-1:19888/ws/v1/history/mapreduce/jobs/job_1495123166259_0962/counters

  • 返回结果
{
   "jobCounters" : {
      "id" : "job_1326381300833_2_2",
      "counterGroup" : [
         {
            "counterGroupName" : "Shuffle Errors",
            "counter" : [
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "BAD_ID"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "CONNECTION"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "IO_ERROR"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "WRONG_LENGTH"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "WRONG_MAP"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "WRONG_REDUCE"
               }
            ]
          },
         {
            "counterGroupName" : "org.apache.hadoop.mapreduce.FileSystemCounter",
            "counter" : [
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 2483,
                  "name" : "FILE_BYTES_READ"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 108525,
                  "name" : "FILE_BYTES_WRITTEN"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "FILE_READ_OPS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "FILE_LARGE_READ_OPS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "FILE_WRITE_OPS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 48,
                  "name" : "HDFS_BYTES_READ"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "HDFS_BYTES_WRITTEN"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 1,
                  "name" : "HDFS_READ_OPS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "HDFS_LARGE_READ_OPS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "HDFS_WRITE_OPS"
               }
            ]
         },
         {
            "counterGroupName" : "org.apache.hadoop.mapreduce.TaskCounter",
            "counter" : [
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 1,
                  "name" : "MAP_INPUT_RECORDS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 1200,
                  "name" : "MAP_OUTPUT_RECORDS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 4800,
                  "name" : "MAP_OUTPUT_BYTES"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 2235,
                  "name" : "MAP_OUTPUT_MATERIALIZED_BYTES"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 48,
                  "name" : "SPLIT_RAW_BYTES"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "COMBINE_INPUT_RECORDS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "COMBINE_OUTPUT_RECORDS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 1200,
                  "name" : "REDUCE_INPUT_GROUPS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 2235,
                  "name" : "REDUCE_SHUFFLE_BYTES"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 1200,
                  "name" : "REDUCE_INPUT_RECORDS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "REDUCE_OUTPUT_RECORDS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 2400,
                  "name" : "SPILLED_RECORDS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 1,
                  "name" : "SHUFFLED_MAPS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "FAILED_SHUFFLE"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 1,
                  "name" : "MERGED_MAP_OUTPUTS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 113,
                  "name" : "GC_TIME_MILLIS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 1830,
                  "name" : "CPU_MILLISECONDS"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 478068736,
                  "name" : "PHYSICAL_MEMORY_BYTES"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 2159284224,
                  "name" : "VIRTUAL_MEMORY_BYTES"
               },
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 378863616,
                  "name" : "COMMITTED_HEAP_BYTES"
               }
            ]
         },
         {
            "counterGroupName" : "org.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter",
            "counter" : [
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "BYTES_READ"
               }
            ]
         },
         {
            "counterGroupName" : "org.apache.hadoop.mapreduce.lib.output.FileOutputFormatCounter",
            "counter" : [
               {
                  "reduceCounterValue" : 0,
                  "mapCounterValue" : 0,
                  "totalCounterValue" : 0,
                  "name" : "BYTES_WRITTEN"
               }
            ]
         }
      ]
   }
}

其中org.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter里面的BYTES_READ为job扫描的数据量
具体参数:https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/HistoryServerRest.html#Job_Counters_API

5.2 Mapreduce job扫描数据量

  • URL

http://emr-header-1:18080/api/v1/applications/application_1495123166259_1050/executors

每个executor的totalInputBytes总和为整个job的数据扫描量。
更多参考:http://spark.apache.org/docs/latest/monitoring.html

相关实践学习
数据湖构建DLF快速入门
本教程通过使⽤数据湖构建DLF产品对于淘宝用户行为样例数据的分析,介绍数据湖构建DLF产品的数据发现和数据探索功能。
快速掌握阿里云 E-MapReduce
E-MapReduce 是构建于阿里云 ECS 弹性虚拟机之上,利用开源大数据生态系统,包括 Hadoop、Spark、HBase,为用户提供集群、作业、数据等管理的一站式大数据处理分析服务。 本课程主要介绍阿里云 E-MapReduce 的使用方法。
目录
相关文章
|
16天前
|
缓存 监控 API
构建高效可扩展的RESTful API:后端开发的实践指南
【4月更文挑战第26天】在现代Web开发中,构建一个高效、可扩展且易于维护的RESTful API是后端工程师必须面对的挑战。本文将深入探讨如何利用最佳实践和流行技术,设计出符合REST架构原则的服务端接口。我们将重点讨论API版本控制、资源路由、数据库优化、缓存策略以及安全性考虑等方面,旨在为开发者提供一套综合性解决方案,帮助其提升API的性能与可靠性。
|
12天前
|
弹性计算 JSON Shell
基于Web API的自动化信息收集和整理
【4月更文挑战第30天】
20 0
|
12天前
|
JSON API 数据处理
【Swift开发专栏】Swift中的RESTful API集成实战
【4月更文挑战第30天】本文探讨了在Swift中集成RESTful API的方法,涉及RESTful API的基础概念,如HTTP方法和设计原则,以及Swift的网络请求技术,如`URLSession`、`Alamofire`和`SwiftyJSON`。此外,还强调了数据处理、错误管理和异步操作的重要性。通过合理利用这些工具和策略,开发者能实现高效、稳定的API集成,提升应用性能和用户体验。
|
1天前
|
缓存 测试技术 API
RESTful API的最佳实践
【5月更文挑战第11天】在Python中构建RESTful API时,可以选择轻量级的Flask或全栈的Django框架。Flask适用于小型到中型API,而Django适合大型复杂项目。示例代码展示了如何在两个框架中创建任务列表API。
5 0
|
5天前
|
存储 缓存 JavaScript
深入理解RESTful API设计原则与实践
【5月更文挑战第7天】在现代Web服务开发中,表述性状态传递(REST)是一种广泛采用的架构风格,用于构建可扩展的网络应用程序接口(APIs)。本文将探讨RESTful API的核心设计原则,并通过具体实例展示如何实现一个符合REST约束的后端服务。我们将讨论资源的识别、客户端-服务器通信模式、无状态性、以及统一接口的重要性,并探索如何使用当前的流行技术栈来实现这些概念。
|
12天前
|
缓存 监控 JavaScript
Node.js中构建RESTful API的最佳实践
【4月更文挑战第30天】本文介绍了在Node.js中构建RESTful API的最佳实践:选择合适的框架(如Express、Koa)、设计清晰的API接口(遵循HTTP动词和资源路径)、实现认证授权(JWT、OAuth 2.0)、错误处理、限流缓存、编写文档和测试,以及监控性能优化。这些实践有助于创建健壮、可维护和易用的API。
|
12天前
|
存储 关系型数据库 Go
【Go语言专栏】基于Go语言的RESTful API开发
【4月更文挑战第30天】本文介绍了使用Go语言开发RESTful API的方法,涵盖了路由、请求处理、数据存储和测试关键点。RESTful API基于HTTP协议,无状态且使用标准方法表示操作。在Go中,通过第三方库如`gorilla/mux`进行路由映射,使用`net/http`处理请求,与数据库交互可选ORM库`gorm`,测试则依赖于Go内置的`testing`框架。Go的简洁性和并发性使得它成为构建高效API的理想选择。
|
12天前
|
机器学习/深度学习 算法 安全
深度学习在图像识别中的应用与挑战构建高效可扩展的RESTful API:后端开发的实战指南
【4月更文挑战第30天】 随着计算机视觉技术的飞速发展,深度学习在图像识别领域取得了显著的成果。本文将探讨深度学习技术在图像识别中的应用及其所面临的挑战。首先,我们将介绍深度学习的基本原理和关键技术,然后分析其在图像识别中的优势和应用案例。最后,我们将讨论当前深度学习在图像识别领域所面临的主要挑战和未来的发展趋势。
|
13天前
|
XML JSON API
【PHP开发专栏】PHP RESTful API设计与开发
【4月更文挑战第29天】本文探讨了在Web开发中流行的前后端分离模式,重点介绍了RESTful API的设计与实现。REST是一种基于HTTP协议的架构风格,核心概念包括资源、表述和状态转换。RESTful API设计遵循无状态、统一接口等原则,使用GET、POST、PUT、DELETE等HTTP方法执行操作,并通过状态码和JSON/XML传输数据。在PHP中实现RESTful API,可通过定义路由、创建控制器、处理请求和响应,同时注意安全性措施,如使用HTTPS。文中还提供了一个用户管理API的实战示例,以帮助读者更好地理解和应用RESTful API。
|
13天前
|
缓存 监控 API