से दिखाई देने वाले स्कैला में पैकेज-निजी दायरा मुझे स्कैला स्कॉपिंग के एक सुंदर अजीब व्यवहार के बारे में पता चला जब स्कैला कोड से उत्पन्न बाइटकोड जावा कोड से उपयोग किया जाता है। स्पार्क का उपयोग कर निम्नलिखित स्निपेट पर विचार करें (1.4 स्पार्क, Hadoop 2.6):जावा
import java.util.Arrays;
import java.util.List;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.broadcast.Broadcast;
public class Test {
public static void main(String[] args) {
JavaSparkContext sc =
new JavaSparkContext(new SparkConf()
.setMaster("local[*]")
.setAppName("test"));
Broadcast<List<Integer>> broadcast = sc.broadcast(Arrays.asList(1, 2, 3));
broadcast.destroy(true);
// fails with java.io.IOException: org.apache.spark.SparkException:
// Attempted to use Broadcast(0) after it was destroyed
sc.parallelize(Arrays.asList("task1", "task2"), 2)
.foreach(x -> System.out.println(broadcast.getValue()));
}
}
इस कोड को विफल रहता है, जो उम्मीद है के रूप में मैं स्वेच्छा से उपयोग करने से पहले एक Broadcast
को नष्ट, लेकिन बात यह है कि मेरी मानसिक मॉडल में ऐसा नहीं होना चाहिए यहां तक कि संकलित करें, अकेले चलने दें।
दरअसल, Broadcast.destroy(Boolean)
को private[spark]
के रूप में घोषित किया गया है, इसलिए यह मेरे कोड से दिखाई नहीं देनी चाहिए। मैं Broadcast
के बाइटकोड को देखने का प्रयास करूंगा लेकिन यह मेरी विशेषता नहीं है, इसलिए मैं इस प्रश्न को पोस्ट करना पसंद करता हूं। इसके अलावा, खेद है कि मैं एक उदाहरण बनाने के लिए बहुत आलसी था जो स्पार्क पर निर्भर नहीं है, लेकिन कम से कम आपको यह विचार मिलता है। ध्यान दें कि मैं स्पार्क के विभिन्न पैकेज-निजी तरीकों का उपयोग कर सकता हूं, यह केवल Broadcast
नहीं है।
क्या हो रहा है इसके बारे में कोई विचार?
उत्तर के लिए धन्यवाद। क्या आपको नहीं लगता कि यह एपीआई लेखकों के लिए थोड़ा खतरनाक है? जिन कार्यक्षमताओं को वे कभी प्रकट नहीं करना चाहते थे वे जावा से स्पष्ट रूप से दिखाई देते हैं। मुझे आश्चर्य है कि क्या वे उपयोगकर्ता पर चेतावनी उत्पन्न करने के लिए कुछ एनोटेशन चाल का उपयोग कर सकते हैं जब वे एक सदस्य का उपयोग करने का प्रयास करते हैं जिसका उद्देश्य निजी – Dici
@Dici है यदि आप जावा के साथ इंटरऑप करने की योजना बनाते हैं तो हाँ, मुझे निश्चित रूप से लगता है कि यह कुछ है जो आपको लेना है विचाराधीन, विशेष रूप से यदि यह आंतरिक रूप से खुलासा करता है तो आप नहीं चाहते कि ग्राहक आक्रमण करें। हालांकि इस विशेष मामले में, आप जनता को 'प्रसारण' भी कह सकते हैं।भाग्यशाली विधि, पैर में अपने आप को समान रूप से शूटिंग। –
यूप, मेरा मतलब यह है कि अब मुझे पता है कि जावा एपीआई के माध्यम से सामने आने वाले सभी स्पार्क इंटर्नल्स को पैकेज-प्राइवेट के रूप में घोषित किया गया है, मुझे लगता है कि संभवत: अधिक जावा रैपर होना चाहिए जो कार्यात्मकताओं को छिपाने के लिए हो जो सार्वजनिक होने का इरादा नहीं था। मेरा उदाहरण सिर्फ यह दिखाने के लिए था कि विधि वास्तव में कहलाती थी। – Dici