开发者社区> 问答> 正文

Hadoop Restful问题。 400 请求出错 

第一部分:什么是<span style=""font-size:12px;"">REST 与<span style=""font-size:12px;"">RESTful

<span style=""font-weight:bold;"">•什么是REST及RESTful

   REST 描述了一个架构样式的互联系统(如 Web 应用程序)。REST 约束条件作为一个整体应用时,将生成一个简单、可扩展、有效、安全、可靠的架构。由于它简便、轻量级以及通过 HTTP 直接传输数据的特性,RESTful Web 服务成为基于 SOAP 服务的一个最有前途的替代方案。用于 web 服务和动态 Web 应用程序的多层架构可以实现可重用性、简单性、可扩展性和组件可响应性的清晰分离。Ajax 和 RESTful Web 服务本质上是互为补充的。开发人员可以轻松使用 Ajax 和 RESTful Web 服务一起创建丰富的界面。 
 
 
 <strong>REST </strong> 
 <strong>指的是一组架构约束条件和原则。</strong>满足这些约束条件和原则的应用程序或设计就是 RESTful。  
 




<span style=""font-weight:bold;""><span><span>•</span>RESTful </span>原则</span> 



  •  
 <u>客户端</u>和服务器之间的交互在请求之间是无状态的。 从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。 
 

  •在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI (Universal Resource Identifier) 得到一个惟一的地址。所有资源都共享统一的界面,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 GET、PUT、POST 和 DELETE。Hypermedia 是应用程序状态的引擎,资源表示通过超链接互联。 
 

    
 

  •  
 <strong>分层系统</strong>,这表示组件无法了解它与之交互的中间层以外的组件。 通过将系统知识限制在单个层,可以限制整个系统的复杂性,促进了底层的独立性。 
 
 
  
  <span style=""font-weight:bold;""><span>REST </span>实现方式</span> 
  
  
  
    •  
   <strong>RESTful Web </strong> 
   <strong>服务与</strong>  
   <strong></strong> 
   <strong>RPC </strong> 
   <strong>样式的</strong>  
   <strong></strong> 
   <strong>Web </strong> 
   <strong>服务</strong> 
   
  
    •  
   <strong>WebService</strong> 
   
  
    •  
   <strong>RESTful Web </strong> 
   <strong>服务的</strong>  
   <strong></strong> 
   <strong>Java </strong> 
   <strong>框架</strong> 
   
  
    •Restlet 
   
  
    •JSR-311 
   <strong></strong> 
   
  
    •  
   <strong>构建</strong>  
   <strong></strong> 
   <strong>RESTful Web </strong> 
   <strong>服务的多层架构</strong> 
   
  
    •  
   <strong>SSH</strong> 
   
  
       
   
   
    
    <span style=""font-weight:bold;""><span>REST</span><span> 特点</span></span> 
    
   
  •REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表示方式。获得这些表徵致使这些应用程序转变了其状态。随着不断获取资源的表示方式,客户端应用不断地在转变着其状态 
  
  
      
   
  
 
 
  
  <span>REST</span>  
  <span>中的资源操作</span> 
  
  
   
   
     •资源是由URI来指定。 
    
   
     •对资源的操作包括获取、创建、修改和删除资源,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。 
    
   
     •通过操作资源的表现形式来操作资源。 
    
   
     •资源的表现形式则是XML或者HTML,取决于读者是机器还是人,是消费web服务的客户软件还是web浏览器。当然也可以是任何其他的格式。 
    
   
       
    
   
  
  
  <span style=""font-weight:bold;""><span>RESTful </span><span>API 要求</span></span> 
  
  
   
   
     •客户端和服务器结构 
    
   
     •连接协议具有无状态性 
    
   
     •能够利用Cache机制增进性能 
    
   
     •层次化的系统 随需代码 - Javascript (可选) 
    
    
     
     <span style=""font-weight:bold;""><span>REST</span>的优点</span> 
     
     
     
       •可以利用缓存Cache来提高响应速度 
      
     
       •通讯本身的无状态性可以让不同的服务器的处理一系列请求中的不同请求,提高服务器的扩展性 浏览器即可作为客户端, 
      
     
       •简化软件需求 
      
     
       •相对于其他叠加在HTTP协议之上的机制,REST的软件依赖性更小 不需要额外的资源发现机制 
      
     
       •在软件技术演进中的长期的兼容性更好 
      
     
         
      
      
       
       <span style=""font-weight:bold;""><span>RESTful </span><span>Web 服务</span></span> 
       
       
       
         •RESTful Web 服务(也称为 RESTful Web API)是一个使用HTTP并遵循REST原则的Web服务。 
        
       
         • Web服务接受与返回的互联网媒体类型,比如:JSON,XML ,YAML 等 
        
       
         •Web服务在该资源上所支持的一系列请求方法(比如:POST,GET,PUT或DELETE)。 
        
       
         •不像基于SOAP的Web服务,RESTful Web服务并没有的“正式”标准。 这是因为REST是一种架构,而SOAP只是一个协议。虽然REST不是一个标准,但在实现RESTful Web服务时可以使用其他各种标准(比如HTTP,URL,XML,PNG等)。 
        
        
         
          
          <span style=""font-size:20px;font-weight:bold;"">第二部分:Hadoop RESTful API接口</span> 
          
          
           
           <span style=""font-weight:bold;""><span>Hadoop </span><span>RESTful </span><span>API 介绍</span></span> 
           
           
           
             •全称为webHDFS 
            
           
             •在Hadoop 1.0 提供 
            
            
             
             <span>Hadoop </span> 
             <span>RESTful </span> 
             <span>API-Get </span> 
             
             
             <table cellspacing=""0"" cellpadding=""0"" style=""padding:0px;margin:0px;font-size:12px;border:none;width:463px;height:273px;""> 
              <tbody> 
               <tr> 
                <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                  
                  <strong>操作</strong> 
                  </td> 
                <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                  
                  <strong>参考</strong> 
                  <strong></strong> 
                  
                 
                     
                  </td> 
               </tr> 
               <tr> 
                <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                 
                   OPEN 
                  
                 
                     
                  </td> 
                <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                 
                   FileSystem.open 
                  </td> 
               </tr> 
               <tr> 
                <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                 
                   GETFILESTATUS 
                  </td> 
                <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                 
                   FileSystem.getFileStatus 
                  
                 
                     
                  </td> 
               </tr> 
               <tr> 
                <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                 
                   GETCONTENTSUMMARY 
                  </td> 
                <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                 
                   FileSystem.getContentSummary 
                  
                 
                     
                  </td> 
               </tr> 
               <tr> 
                <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                 
                   LISTSTATUS 
                  </td> 
                <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                 
                   FileSystem.listStatus 
                  </td> 
               </tr> 
               <tr> 
                <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                 
                   GETFILECHECKSUM 
                  
                 
                     
                  </td> 
                <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                 
                   FileSystem.getFileChecksum 
                  
                 
                     
                  </td> 
               </tr> 
               <tr> 
                <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                 
                   GETHOMEDIRECTORY 
                  
                 
                     
                  </td> 
                <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                 
                   FileSystem.getHomeDirectory 
                  
                 
                     
                  </td> 
               </tr> 
               <tr> 
                <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                 
                   GETDELEGATIONTOKEN 
                  </td> 
                <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                 
                   FileSystem.getDelegationToken 
                  
                 
                     
                  </td> 
               </tr> 
              </tbody> 
             </table> 
             
            
            
             
             <span style=""font-weight:bold;""><span>Hadoop </span><span>RESTful </span><span>API-Put</span></span> 
             
            <table cellspacing=""0"" cellpadding=""0"" style=""padding:0px;margin:0px;font-size:12px;border:none;width:463px;height:278px;""> 
             <tbody> 
              <tr> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                 
                 <strong>操作</strong> 
                 </td> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                 
                 <strong>参考</strong> 
                 <strong></strong> 
                 
                
                    
                 </td> 
              </tr> 
              <tr> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  CREATE 
                 
                
                    
                 </td> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  FileSystem.create 
                 </td> 
              </tr> 
              <tr> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  MKDIRS 
                 </td> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  FileSystem.mkdirs 
                 
                
                    
                 </td> 
              </tr> 
              <tr> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  RENAME 
                 </td> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  FileSystem.rename 
                 </td> 
              </tr> 
              <tr> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  SETREPLICATION 
                 </td> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  FileSystem.setReplication 
                 </td> 
              </tr> 
              <tr> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  SETOWNER 
                 
                
                    
                 </td> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  FileSystem.setOwner 
                 
                
                    
                 </td> 
              </tr> 
              <tr> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  SETPERMISSION 
                 
                
                    
                 </td> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  FileSystem.setTimes 
                 </td> 
              </tr> 
              <tr> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  SETTIMES 
                 </td> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  FileSystem.getDelegationToken 
                 
                
                    
                 </td> 
              </tr> 
              <tr> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  RENEWDELEGATIONTOKEN 
                 </td> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  DistributedFileSystem.renewDelegationToken 
                 
                
                    
                 </td> 
              </tr> 
              <tr> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  CANCELDELEGATIONTOKEN 
                 </td> 
               <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
                
                  DistributedFileSystem.cancelDelegationToken 
                 </td> 
              </tr> 
             </tbody> 
            </table>   
            
           
           
           <span style=""font-weight:bold;""><span>Hadoop </span><span>RESTful </span><span>API-Post与Delete</span></span> 
           
          <table cellspacing=""0"" cellpadding=""0"" style=""padding:0px;margin:0px;font-size:12px;border:none;width:463px;height:96px;""> 
           <tbody> 
            <tr> 
             <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
               
               <strong>操作</strong> 
               </td> 
             <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
               
               <strong>参考</strong> 
               <strong></strong> 
               
              
                  
               </td> 
            </tr> 
            <tr> 
             <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
              
                APPEND 
               </td> 
             <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
              
                FileSystem.append 
               </td> 
            </tr> 
            <tr> 
             <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
              
                DELETE 
               </td> 
             <td style=""font-family:verdana, arial, helvetica, sans-serif;""> 
              
                FileSystem.delete 
               
              
                  
               </td> 
            </tr> 
           </tbody> 
          </table>   
          
           
        
       
       
        
        <span style=""font-size:20px;font-weight:bold;"">第三部分:API 示例</span> 
        
        
         
         <span style=""font-weight:bold;""><span>Hadoop </span><span>RESTful </span><span>API 示例</span></span> 
         
         
         
           •什么是curl 
          
         
                        curl是一个利用URL语法在命令行方式下工作的文件传输工具。它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER,  TELNET, DICT, FILE 以及 LDAP。 
          
         
                       curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP 上传, kerberos认证, HTTP上传, 代理服务器, cookies, 用户名/密码认证, 下载文件断点续传, 上载文件断点续传,  http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器, 通过http代理服务器上传文件到FTP服务器等等,功能十分强大。Windows操作系统下的网络蚂蚁,网际快车(FlashGet)的功能它都可以做到。准确的说,curl支  
          <br /> 持文件的上传和下载,所以是一个综合传输工具,但是按照传统,用户习惯称curl为下载工具。 
          
         
             
          
         
         
         <span style=""font-weight:bold;"">配置RESTful API 可用</span> 
         
         
         
           • 安装sudo apt-get install curl 
          
         
           • 在HDFS中设置 dfs.webhdfs.enabled = true 
          
          
           
           <span style=""font-weight:bold;"">示例</span> 
           
           
           
             1.创建并写一个文件 
            
           
             • curl -i -X PUT "http://localhost:50070/webhdfs/v1/<PATH>?op=CREATE 
            
           
             [&overwrite=<true|false>][&blocksize=<LONG>][&replication=<SHORT>] 
            
           
             [&permission=<OCTAL>][&buffersize=<INT>]“ 
            
           
             • 
            
           
             •curl -i -X PUT -T <LOCAL_FILE> "http://<DATANODE>:<PORT>/webhdfs/v1/<PATH>? 
            
           
             op=CREATE...“ 
            
           
             注意这个地方填入的是DataNode的信息 
            
            
             
             
               2.在一个文件内追加内容 
              
             
               •curl -i -X POST "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=APPEND[&buffersize=<INT>]” 
              
             
               • 
              
             
               •curl -i -X POST -T <LOCAL_FILE> "http://<DATANODE>:<PORT>/webhdfs/v1/<PATH>? 
              
             
               op=APPEND...“ 
              
             
               注意该条命令获得的是DataNode的信息。 
              
             
                 
               
               
                 3.打开并读取一个文件 
                
               
                 •curl -i -L "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=OPEN 
                
               
                 [&offset=<LONG>][&length=<LONG>][&buffersize=<INT>]“ 
                
               
                   
                
               
                 4.创建一个目录 
                
               
                 curl -i -X PUT "http://<HOST>:<PORT>/<PATH>?op=MKDIRS[&permission=<OCTAL>]“ 
                
               
                 5.重名命文件、文件夹 
                
               
                 curl -i -X PUT "<HOST>:<PORT>/webhdfs/v1/<PATH>?op=RENAME&destination=<PATH>" 
                
                
                 
                  
                  <span>6.删除文件/文件夹</span> 
                  
                  
                  <span>curl -i -X DELETE "http://<host>:<port>/webhdfs/v1/<path>?op=DELETE</span> 
                  
                  
                  <span>[&recursive=<true|false>]</span>  
                  <span>“</span> 
                  
                  
                  <span>7.文件/ 文件夹的状态信息</span> 
                  
                  
                  <span>curl -i “http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=GETFILESTATUS</span>  
                  <span>”</span> 
                  
                  
                  <span>8.目录列表</span> 
                  
                  
                  <span>curl -i "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=LISTSTATUS</span>  
                  <span>”</span> 
                  
                  
                  <span>9.获取目录的上下文环境汇总信息</span> 
                  
                  
                  <span>curl -i "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=GETCONTENTSUMMARY"</span> 
                  
                  
                   
                    
                    <span>10.获取Check Sum File</span> 
                    
                    
                    <span>curl -i "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=GETFILECHECKSUM</span>  
                    <span>”</span> 
                    
                    
                    <span>11</span>  
                    <span>.获取Home 目录</span> 
                    
                    
                    <span>curl -i "http://<HOST>:<PORT>/webhdfs/v1/?op=GETHOMEDIRECTORY</span>  
                    <span>”</span> 
                    
                    
                    <span>12.设置权限</span> 
                    
                    
                    <span>curl -i -X PUT "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=SETPERMISSION</span> 
                    
                    
                    <span>[&permission=<OCTAL>]</span>  
                    <span>“</span> 
                    
                    
                    <span>13.设置所有者</span> 
                    
                    
                    <span>curl -i -X PUT "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=SETOWNER</span> 
                    
                    
                    <span>[&owner=<USER>][&group=<GROUP>]"</span>

展开
收起
kun坤 2020-05-25 20:34:51 869 0
1 条回答
写回答
取消 提交回答
  • "

    <span style=""color:#333333;font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:13px;background-color:#FEFEFE;"">请问我在Red Hat 4.8.2-16 搭建了hdfs,在使用httpfs的时候, 日志中出现了

    <span style=""color:#333333;font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:13px;background-color:#FEFEFE;"">log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell).
    <span style=""color:#333333;font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:13px;background-color:#FEFEFE;"">log4j:WARN Please initialize the log4j system properly.

    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    我用的是hadoop自带的httpfs

    请问这是为什么, 而且我需要把hadoop-env.sh 中的JAVA_HOME改成/home/java....jdk才能用, 是不是和这个问题有关联啊??
    现在不管做什么操作json都会显示500和NullException
    [hadoop@iZ62bcwb25pZ ~]$ curl -i "HOST_NAME:14000/webhdfs/v1?op=LISTSTATUS&user.name=taojiaen"
    HTTP/1.1 500 Internal Server Error
    Server: Apache-Coyote/1.1
    Set-Cookie: hadoop.auth="u=taojiaen&p=taojiaen&t=simple&e=1447209758905&s=bvZpONUcJU1NKD5sMQOjBBtC1x4="; Path=/; Expires=Wed, 11-Nov-2015 02:42:38 GMT; HttpOnly
    Content-Type: application/json
    Transfer-Encoding: chunked
    Date: Tue, 10 Nov 2015 16:42:39 GMT
    Connection: close

    {"RemoteException":{"message":null,"exception":"NullPointerException","javaClassName":"java.lang.NullPointerException"}}

    求教求教
    "
    2020-05-26 13:12:26
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
《构建Hadoop生态批流一体的实时数仓》 立即下载
零基础实现hadoop 迁移 MaxCompute 之 数据 立即下载
CIO 指南:如何在SAP软件架构中使用Hadoop 立即下载

相关实验场景

更多