2013-04-11 6 views
10

मुझे जावा एपीआई के माध्यम से दूरस्थ डेस्कटॉप से ​​एचडीएफएस क्लस्टर का उपयोग करने की आवश्यकता है। जब तक पहुंच लिखने की बात आती है तब तक सबकुछ ठीक काम करता है। अगर मैं कोई फाइल बनाने की कोशिश कर रहा हूं तो मुझे एक्सेस अनुमति अपवाद प्राप्त होता है। पथ अच्छा दिखता है लेकिन अपवाद मेरे रिमोट डेस्कटॉप उपयोगकर्ता नाम को इंगित करता है जो निश्चित रूप से आवश्यक एचडीएफएस निर्देशिका तक पहुंचने की आवश्यकता नहीं है।जावा एपीआई के माध्यम से रिमोट होस्ट से एचडीएफएस एक्सेस, उपयोगकर्ता प्रमाणीकरण

प्रश्न यह है: - क्या जावा एपीआई में 'सरल' प्रमाणीकरण का उपयोग करके अलग-अलग उपयोगकर्ता नाम का प्रतिनिधित्व करने का कोई तरीका है? - क्या आप कृपया जावा एपीआई उदाहरणों के साथ हडूप/एचडीएफएस में प्रमाणीकरण/प्राधिकरण योजनाओं के कुछ अच्छे स्पष्टीकरण को इंगित कर सकते हैं?

हां, मुझे पहले से ही पता है कि इस मामले में शेल उर्फ ​​का उपयोग करके 'व्हामी' को अधिभारित किया जा सकता है, लेकिन मैं इस तरह के समाधान से बचना पसंद करता हूं। यह भी यहां निर्दिष्ट है कि मैं एसएसएच और स्क्रिप्ट के माध्यम से पाइप जैसे कुछ चालों का उपयोग नापसंद करता हूं। मैं सिर्फ जावा एपीआई का उपयोग कर सबकुछ करना चाहता हूं। अग्रिम धन्यवाद।

उत्तर

14

का अध्ययन मैं निम्नलिखित समाधान के लिए आया था कुछ करने के बाद:

  • मैं वास्तव में, पूर्ण करबरोस समाधान की जरूरत नहीं है कि यह पर्याप्त वर्तमान में है कि ग्राहकों को किसी भी उपयोगकर्ता से HDFS अनुरोध चला सकते है। पर्यावरण को सुरक्षित माना जाता है।
  • यह मुझे हडूप उपयोगकर्ता समूह समूह वर्ग के आधार पर समाधान देता है। भविष्य में मैं इसे केर्बेरोस का समर्थन करने के लिए बढ़ा सकता हूं।

    package org.myorg; 
    
    import java.security.PrivilegedExceptionAction; 
    
    import org.apache.hadoop.conf.*; 
    import org.apache.hadoop.security.UserGroupInformation; 
    import org.apache.hadoop.fs.Path; 
    import org.apache.hadoop.fs.FileSystem; 
    import org.apache.hadoop.fs.FileStatus; 
    
    public class HdfsTest { 
    
        public static void main(String args[]) { 
    
         try { 
          UserGroupInformation ugi 
           = UserGroupInformation.createRemoteUser("hbase"); 
    
          ugi.doAs(new PrivilegedExceptionAction<Void>() { 
    
           public Void run() throws Exception { 
    
            Configuration conf = new Configuration(); 
            conf.set("fs.defaultFS", "hdfs://1.2.3.4:8020/user/hbase"); 
            conf.set("hadoop.job.ugi", "hbase"); 
    
            FileSystem fs = FileSystem.get(conf); 
    
            fs.createNewFile(new Path("/user/hbase/test")); 
    
            FileStatus[] status = fs.listStatus(new Path("/user/hbase")); 
            for(int i=0;i<status.length;i++){ 
             System.out.println(status[i].getPath()); 
            } 
            return null; 
           } 
          }); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
    } 
    

    उपयोगी संदर्भ जो एक समान समस्या है के लिए:

    • क्लाउडेरा ब्लॉग पोस्ट "

    नमूना कोड शायद दोनों के लिए 'नकली प्रमाणीकरण' और दूरदराज के HDFS पहुँच लोगों के लिए उपयोगी Authorization and Authentication In Hadoop "। शॉर्ट, हडूप सुरक्षा दृष्टिकोण के सरल स्पष्टीकरण पर केंद्रित है। जावा एपीआई समाधान के लिए विशिष्ट जानकारी नहीं है लेकिन समस्या की बुनियादी समझ के लिए अच्छा है।

अद्यतन: उन लोगों के लिए
वैकल्पिक जरूरत स्थानीय उपयोगकर्ता बिना आदेश पंक्ति hdfs या hadoop उपयोगिता का उपयोग करता है जो:

HADOOP_USER_NAME=hdfs hdfs fs -put /root/MyHadoop/file1.txt/

क्या आप वास्तव में कर आप अपने स्थानीय अनुमतियों के अनुसार स्थानीय फ़ाइल को पढ़ने है, लेकिन जब एचडीएफएस पर फाइल डालने पर आपको उपयोगकर्ता hdfs जैसे प्रमाणीकृत किया गया है।

सुंदर एपीआई कोड के समान गुण सचित्र यह है:

  1. आप sudo जरूरत नहीं है।
  2. आपको वास्तव में उपयुक्त स्थानीय उपयोगकर्ता 'hdfs' की आवश्यकता नहीं है।
  3. आपको पिछले अंक की वजह से कुछ भी कॉपी करने या अनुमतियों को बदलने की आवश्यकता नहीं है।
+0

मैंने आपके जैसी ही समस्या पर ठोकर खाई है। मैं एक दूरस्थ क्लाइंट से क्लस्टर में हडोप नौकरी भेजने की कोशिश कर रहा हूं जो इसे निष्पादित करेगा। मेरे मामले में समस्या यह है कि ** क्लौडेरा का हैडोप 2.0.0 (हैडोप 2.0.0-सीडीएच 4.3.1) उपयोगकर्ता समूह समूह श्रेणी ** प्रदान नहीं करता है जिसका आपने उपयोग किया है।ऐसा लगता है कि संबंधित अपाचे हैडोप संस्करण इसे न तो प्रदान नहीं करता है। UserGroupInformation नामक एक enum है - [link] (http://archive.cloudera.com/cdh4/cdh/4/hadoop/api/org/apache/hadoop/security/UserGroupInformation.AuthenticationMethod.html)। इस तरह के मामले में, आपकी राय में यह कैसे किया जा सकता है? – falconepl

+0

यह वहां है, बस यह क्लौडेरा नहीं है। मैं अभी 2.0.0-cdh4.3.1 हैडऑप क्लाइंट का उपयोग कर रहा हूं। –

+0

यह कहकर आपका क्या मतलब है? मैंने अपाचे हैडोप 2.0.6 एपीआई [[लिंक] (http://hadoop.apache.org/docs/r2.0.6-alpha/api/index.html)] के साथ-साथ 2.1.0 एपीआई [[लिंक) की जांच की है ] (http://hadoop.apache.org/docs/r2.1.0-beta/api/index.html)] (उन जावाडॉक्स जो अपाचे अपनी वेबसाइट पर प्रदान करते हैं) और दुर्भाग्य से कोई 'उपयोगकर्ता समूह जानकारी' श्रेणी नहीं है, केवल enum इससे ज्यादा मदद नहीं मिलती है। और वैसे, '2.0.0-cdh4.3.1' हैडोप नहीं है कि आपने क्लौडेरा के हैडोप वितरण का उल्लेख किया है? – falconepl

संबंधित मुद्दे