hive स्वचालित रूप से हाइव अपडेट करने वाली तालिका बनाने के लिए




hdfs hiveql (2)

मैंने एचडीएफएस में लकड़ी की छत से डेटा का उपयोग करने वाले हाइव में एक बाहरी तालिका बनाई है।

जब एचडीएफएस में डेटा हटा दिया जाता है, तो टेबल में कोई डेटा नहीं होता है। जब डेटा फिर से एचडीएफएस में एक ही जगह में डाला जाता है, तो टेबल को नए डेटा को शामिल करने के लिए अद्यतन नहीं मिलता है। यदि मैं मौजूदा तालिका में नए रिकॉर्ड सम्मिलित करता है जिसमें डेटा होता है, तो मेरे नए प्रश्नों को चलाने पर कोई नया डेटा नहीं दिखाया जाता है

मैं हाइव में तालिका कैसे बनाऊं:

CREATE EXTERNAL TABLE nodes (id string) STORED AS PARQUET LOCATION "/hdfs/nodes";

संबंधित त्रुटि:

Error: java.io.FileNotFoundException: File does not exist: /hdfs/nodes/part-r-00038-2149d17d-f890-48bc-a9dd-5ea07b0ec590.gz.parquet

मैंने कई पदों को देखा है जो समझाते हैं कि बाहरी तालिकाओं में उन तारीखों को सबसे ज्यादा डेट डेटा होना चाहिए, जैसे कि यहां । हालांकि, यह मेरे लिए मामला नहीं है, और मुझे नहीं पता कि क्या हो रहा है।

मैंने एक ही डेटा को डेटाबेस में फिर से डाला, और तालिका से पूछताछ की। इसमें डेटा की समान मात्रा पहले की थी। मैंने तब एक अलग नाम के साथ एक समान तालिका बनाई। इसमें दो गुणा अधिक डेटा था, जो सही मात्रा थी

यह मुद्दा मेटास्टोर डेटाबेस के साथ हो सकता है मैं डेटाबेस के लिए डर्बी के बजाय PostgreSQL का उपयोग कर रहा हूं।

प्रासंगिक जानकारी:

  • हाइव 0.13.0
  • स्पार्क स्ट्रीमिंग 1.4.1
  • PostgreSQL 9.3
  • CentOS 7

संपादित करें: लकड़ी की छत फ़ाइलों की जांच के बाद, मुझे पता चला कि भाग फ़ाइलें प्रतीत होता है असंगत फ़ाइल नाम। -rw-r--r-- 3 hdfs hdfs 18702811 2015-08-27 08:22 /hdfs/nodes/part-r-00000-1670f7a9-9d7c-4206-84b5-e812d1d8fd9a.gz.parquet -rw-r--r-- 3 hdfs hdfs 18703029 2015-08-26 15:43 /hdfs/nodes/part-r-00000-7251c663-f76e-4903-8c5d-e0c6f61e0192.gz.parquet -rw-r--r-- 3 hdfs hdfs 18724320 2015-08-27 08:22 /hdfs/nodes/part-r-00001-1670f7a9-9d7c-4206-84b5-e812d1d8fd9a.gz.parquet -rw-r--r-- 3 hdfs hdfs 18723575 2015-08-26 15:43 /hdfs/nodes/part-r-00001-7251c663-f76e-4903-8c5d-e0c6f61e0192.gz.parquet

ये फ़ाइलें ऐसी फ़ाइलें हैं, जो हाइव को त्रुटि के कारण होती हैं, जब यह ऊपर वर्णित त्रुटि में नहीं मिल सकता है इसका मतलब यह है कि बाह्य तालिका गतिशील रूप से कार्य नहीं कर रही है, निर्देशिका में किसी भी फाइल को स्वीकार कर रही है (यदि आप इसे एचडीएफएस में कहते हैं), लेकिन इसके बजाय संभवत: यह बनायी जाने पर डायरेक्टरी के अंदर लकड़ी की छत फाइलों की सूची का ट्रैक रखता है।

नमूना स्पार्क कोड: nodes.foreachRDD(rdd => { if (!rdd.isEmpty()) sqlContext.createDataFrame(rdd.map( n => Row(n.stuff), ParquetStore.nodeSchema) .write.mode(SaveMode.Append).parquet(node_name) })

जहां nodeSchema स्कीमा स्कीमा है और node_name "/ hdfs / नोड्स" है

नई फ़ाइलों का पता लगाने के लिए छत्ता बाहरी तालिकाओं के बारे में मेरा दूसरा प्रश्न देखें


ठीक है, तो शायद आपको एक फ़ोल्डर में फ़ाइल को अवशोषित करने की आवश्यकता है। हाइव बाह्य तालिका को एक फ़ोल्डर पर मैप किया जाना चाहिए, जहां एक से अधिक फाइल हो सकती है

फाइल को / path / to / hdfs / nodes / file में लिखने का प्रयास करें और फिर बाहरी तालिका को / path / to / hdfs / नोड में मैप करें

इसलिए फ़ोल्डर नोड्स में आपके पास केवल लकड़ी की छत फ़ाइल होगी और इसे काम करना चाहिए


अपनी तालिकाओं को अद्यतन करने के लिए हाइव प्राप्त करने के लिए, मुझे हाइव की विभाजन सुविधा का उपयोग करना पड़ा। प्रत्येक स्पार्क चलाने के दौरान एक नया विभाजन बनाकर, मैं /hdfs/nodes निर्देशिका की आंतरिक निर्देशिकाओं की एक श्रृंखला /hdfs/nodes जैसे:

/hdfs/nodes/timestamp=<a-timestamp>/<parquet-files>
/hdfs/nodes/timestamp=<a-different-timestamp>/<parquet-files>

फिर, प्रत्येक स्पार्क नौकरी पूरी होने के बाद, मैं अपने स्पार्क नौकरी में एक HiveContext का उपयोग करके हाइव कमांड MSCK REPAIR TABLE nodes HiveContext हूं, जो नये विभाजन को पाता है और टेबल को अपडेट करता है

मुझे पता है यह स्वत: नहीं है, लेकिन कम से कम काम करता है।