Banyak pemula Hadoop mungkin sama. Karena tidak ada sumber daya mesin yang cukup, saya hanya dapat membuat distribusi semu Hadoop yang diinstal di mesin virtual. Kemudian saya menggunakan ide Eclipse atau IntelliJ di Win7 untuk menulis tes kode. Jadi pertanyaannya adalah, bagaimana cara mengirimkan peta/mengurangi tugas dari jarak jauh ke hadoop jarak jauh dan debugging breakpoint di Win7?
1. Persiapan
1.1 di Win7, temukan direktori dan decompress Hadoop-2.6.0. Dalam artikel ini, d: /yangjm/code/study/hadoop/hadoop-2.6.0 (berikut ini diwakili oleh $ hadoop_home)
1.2 Tambahkan beberapa variabel lingkungan di Win7
Hadoop_home = d: /yangjm/code/study/hadoop/hadoop-2.6.0
HADOOP_BIN_PATH =%HADOOP_HOME%/bin
Hadoop_prefix = d: /yangjm/code/study/hadoop/hadoop-2.6.0
Selain itu, variabel jalur ditambahkan pada akhirnya; %Hadoop_home%/bin
2. Eclipse Remote Debugging
1.1 Unduh Plugin Hadoop-Eclipse-Plugin
Hadoop-Eclipse-Plugin adalah plugin Hadoop yang digunakan khusus untuk Eclipse, yang dapat melihat direktori dan konten file HDF secara langsung di lingkungan IDE. Kode sumbernya di-host di GitHub, dan alamat situs web resmi adalah https://github.com/winghc/hadoop2x-eclipse-plugin
Jika Anda tertarik, Anda dapat mengunduh kode sumber dan mengkompilasinya sendiri. Baidu akan mengambil banyak artikel, tetapi jika Anda hanya menggunakan https://github.com/winghc/hadoop2x-eclipse-plugin/tree/master/release%20, berbagai versi yang dikompilasi disediakan di sini. Gunakan saja secara langsung. Salin Hadoop-Eclipse-Plugin-2.6.0.jar yang diunduh ke direktori Eclipse/Plugins, dan kemudian restart Eclipse. Semuanya selesai.
1.2 Unduh paket plug-in Hadoop2.6 untuk platform Windows64-bit (Hadoop.dll, winutils.exe)
Di bawah Hadoop-Common-Project/Hadoop-Common/SRC/Main/Winutils dalam kode sumber Hadoop2.6.0, ada proyek Vs.net. Menyusun proyek ini bisa mendapatkan banyak file dan file output ini.
Hadoop.dll dan winutils.exe adalah yang paling berguna. Salin winutils.exe ke direktori $ hadoop_home/bin, dan copy hadoop.dll ke direktori %windir %/system32 (terutama untuk mencegah plug-in melaporkan berbagai kesalahan yang tidak dapat dijelaskan, seperti referensi objek kosong).
Catatan: Jika Anda tidak ingin dikompilasi, Anda dapat langsung mengunduh file compiled hadoop2.6 (x64) v0.2.rar
1.3 Mengkonfigurasi Plugin Hadoop-Eclipse-Plugin
Mulai Eclipse, Windows-> Tampilkan tampilan-> Lainnya
Window-> Preferences-> Hadoop Map/Reduksi Tentukan direktori root Hadoop on Win7 (yaitu: $ hadoop_home)
Kemudian di panel peta/kurangi lokasi, klik ikon bayi gajah
Tambahkan lokasi
Antarmuka ini sangat penting. Saya akan menjelaskan beberapa parameter:
Nama lokasi hanyalah sebuah nama, sebut saja
Host Master Peta/Reduce (V2) di sini adalah alamat IP yang sesuai dengan master Hadoop di mesin virtual. Port di bawah ini sesuai dengan port yang ditentukan oleh atribut dfs.datanode.ipc.address di hdfs-site.xml
Port Master DFS: Port di sini sesuai dengan port yang ditentukan oleh fs.defaultfs di core-site.xml
Nama pengguna terakhir harus sama dengan nama pengguna yang menjalankan Hadoop di mesin virtual. Saya menginstal dan menjalankan Hadoop 2.6.0 dengan Hadoop, jadi isi Hadoop di sini. Jika Anda menginstalnya dengan root, ubah menjadi root sesuai.
Setelah parameter ini ditentukan, klik Finish dan Eclipse untuk mengetahui cara terhubung ke Hadoop. Jika semuanya berjalan dengan baik, Anda dapat melihat direktori dan file di HDF di panel Project Explorer.
Anda dapat mengklik kanan pada file dan memilih Hapus untuk dicoba. Biasanya, pertama kali tidak berhasil, dan akan ada banyak hal. Gagasan umum adalah bahwa ada izin yang tidak memadai. Alasannya adalah bahwa pengguna login Win7 saat ini bukan pengguna Hadoop yang sedang berjalan di mesin virtual. Ada banyak solusi. Misalnya, Anda dapat membuat pengguna Administrator Hadoop baru di Win7, kemudian beralih ke Hadoop untuk masuk ke Win7, dan kemudian menggunakan Eclipse untuk dikembangkan. Namun, ini terlalu menjengkelkan, cara termudah:
Ditambahkan dalam hdfs-site.xml
<property> <name> dfs.permissions </name> <value> false </ value> </propert>
Kemudian di mesin virtual, jalankan hadoop dfsadmin -safemode cuti
Untuk aman, Hadoop FS -Chmod 777 / lain
Singkatnya, itu benar -benar mematikan deteksi keamanan Hadoop (tidak perlu untuk ini dalam tahap pembelajaran, jangan lakukan ini ketika diproduksi secara resmi), akhirnya restart Hadoop, lalu pergi ke gerhana, dan ulangi operasi file hapus sekarang, dan seharusnya baik -baik saja.
1.4 Membuat Proyek Sampel Woldcount
Buat proyek baru dan pilih Proyek Peta/Kurangi
Cukup letakkan berikutnya di wodcount.java, kodenya adalah sebagai berikut:
Paket yjmyzz; import java.io.ioException; import java.util.stringtokenizer; import org.apache.hadoop.conf.configuration; import org.apache.hadoop.fs.path; import org.apache.hadoop.iTwritable; impor org.apache.hadoop.hadoop.apache.hadoop.intwritable; impor org.apache.hadoop.hadoop. org.apache.hadoop.mapreduce.job; impor org.apache.hadoop.mapreduce.mapper; impor org.apache.hadoop.mapreduce.reducer; import org.apache.apapat.hadoop.haduCput.lib.input.fileInputformat; import org.apache.hadoop.hadum.hadum.hadmapput.lib.input. org.apache.hadoop.util.genericoptionsParser; kelas publik wordcount {public static class TokenizerMapper memperluas mapper <objek, teks, teks, tidak dapat diterapkan> {private final static intrantsitable one = new IntWritable (1); kata teks pribadi = teks baru (); peta public void (kunci objek, nilai teks, konteks konteks) melempar IoException, InterruptedException {StringTokenizer ITR = New StringTokenizer (value.toString ()); while (itr.hasmoretokens ()) {word.set (itr.nextToken ()); context.write (word, satu); }}} public static class intsumreducer memperluas reducer <teks, tidak dapat diterapkan, teks, tidak dapat diterjemahkan> {private tidak dapat berkaitan = new IntWritable (); void public reduksi (kunci teks, nilai -nilai <intwritable>, konteks konteks) melempar ioException, interruptedException {int sum = 0; untuk (val yang tidak dapat dituntun: values) {sum += val.get (); } result.set (sum); context.write (kunci, hasil); }} public static void main (string [] args) melempar Exception {configuration conf = new configuration (); String [] OtherArgs = GenericOptionsParser baru (conf, args) .getRemainingArgs (); if (OtherArgs.length <2) {System.err.println ("Penggunaan: WordCount <in> [<in> ...] <Unt>"); System.exit (2); } Job job = job.getInstance (conf, "word count"); job.setjarbyclass (wordcount.class); job.setmapperclass (tokenizermapper.class); job.setCombinerClass (intsumreducer.class); job.setreducerclass (intsumreducer.class); job.setoutputKeyClass (text.class); job.setoutputValueClass (intrwritable.class); untuk (int i = 0; i <OtherArgs.length - 1; ++ i) {FileInputFormat.AddInputPath (Job, Path baru (OtherArgs [i])); } FileOutPutFormat.SetOutputPath (Job, Path baru (OtherArgs [OtherArgs.Length - 1])); System.exit (job.waitforcompletion (true)? 0: 1); }}Kemudian letakkan log4j.properties, kontennya adalah sebagai berikut: (Untuk kenyamanan berjalan, periksa berbagai output)
log4j.rootlogger = info, stdout#log4j.logger.org.springframework = info#log4j.logger.org.apache.activemq = info#log4j.logger.org.apache. activeMq.spring = warn#log4j.logger.org.apache.activemq.store.journal = info#log4j.logger.org.apache.activemq.or G.Stdout = org.apache.log4j.consoleAppenderLog4j.Appender.stdout.layout = org.apache.log4j.patternlayoutlog4j.Appender.stdout.layout.conversionpattern =%do.appender {stdout.layout.conversionpattern =%do %-5.5p | %-16.16t | %-32.32c {1} | %-32.32c %4L | %M NStruktur Direktori Akhir adalah sebagai berikut:
Maka Anda dapat menjalankannya, tentu saja itu tidak akan berhasil, karena tidak ada parameter yang dimasukkan untuk WordCount, lihat gambar berikut:
1.5 Atur parameter operasi
Karena WordCount adalah memasukkan file untuk menghitung kata dan kemudian output ke folder lain, jadi berikan dua parameter, lihat gambar di atas, masukkan dalam argumen program
hdfs: //172.28.20.xxx: 9000/jimmy/input/readme.txt
hdfs: //172.28.20.xxx: 9000/jimmy/output/
Silakan merujuk ini untuk mengubahnya (terutama ganti IP dengan IP di mesin virtual Anda). Perhatikan bahwa jika file input/readm.txt tidak memilikinya, silakan unggah secara manual terlebih dahulu, dan kemudian/output/tidak boleh ada. Kalau tidak, jika program berjalan ke akhir dan menemukan bahwa direktori target ada, kesalahan akan dilaporkan. Setelah ini, Anda dapat mengatur breakpoint di posisi yang sesuai dan Anda akhirnya dapat men -debug:
3. Intellij Ide Remote Debugging Hadoop
3.1 Buat Proyek Maven WordCount
File POM adalah sebagai berikut:
<? Xml Version = "1.0" encoding = "UTF-8"?> <Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema XSI: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <ModelVersion> </ARTUCED> </ModelVersion> <groupid> yjmyzz </groupcon> </ARCREUCE> </ModelVersion> <groupid> yjmyzz </groups <version> 1.0-snapshot </version> <dependencies> <dependency> <groupid> org.apache.hadoop </proupid> <RtifactId> Hadoop-common </artifactid> <version> 2.6.0 </version> </dependency> <dependency> <groupid> org.apache.hadoop </versie <ArTifactId> Hadoop-Mapreduce-client-JobClient </RiTtifacTID> <Version> 2.6.0 </version> </gandendency> <dependency> <GroupId> Commons-cli </proupid> <ArTifactId> Commons-cli </artifactid> <version> 1.2 </Versi> </Dependency> </Depiencies> <FinalName> $ {Project.ARTIFACTID} </finalname> </build> </poject>Struktur proyek adalah sebagai berikut:
Klik kanan pada Proyek -> Buka Pengaturan Modul atau Tekan F12 untuk Membuka Properti Modul
Menambahkan Referensi Libary Ketergantungan
Kemudian impor semua paket yang sesuai di bawah $ hadoop_home
Libary yang diimpor dapat dinamai, seperti Hadoop2.6
3.2 Atur parameter operasi
Catatan dua tempat :
1 adalah rezim program, yang mirip dengan gerhana, menentukan file input dan folder output
2 adalah direktori kerja, yaitu direktori kerja, ditentukan sebagai direktori di mana $ hadoop_home berada
Maka Anda bisa men -debug
Satu -satunya hal yang tidak bahagia di bawah IntelliJ adalah bahwa tidak ada plugin Hadoop yang mirip dengan Eclipse. Setiap kali Anda menjalankan WordCount, Anda hanya dapat secara manual menghapus direktori output pada baris perintah dan kemudian debug. Untuk mengatasi masalah ini, Anda dapat meningkatkan kode WordCount dan menghapus direktori output sebelum berjalan, lihat kode berikut:
Paket yjmyzz; import java.io.ioException; import java.util.stringtokenizer; impor org.apache.hadoop.conf.configuration; import org.apache.hadoop.fs.filesystem; import org.apache.hadoop.aps.path; import org.apache.apache.apache.apacle.apache.hadoop.fs.path; org.apache.apache.apache.apached.apache.apo; org.apache.hadoop.io.text; import org.apache.hadoop.mapreduce.job; impor org.apache.hadoop.mapreduce.mapper; import org.apache.hadoop.mapreduce.reducer; import org.apache.hadoop.apache.mapreduce.input.input; org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import org.apache.hadoop.util.GenericOptionsParser;public class WordCount { public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); kata teks pribadi = teks baru (); peta public void (kunci objek, nilai teks, konteks konteks) melempar IoException, InterruptedException {StringTokenizer ITR = New StringTokenizer (value.toString ()); while (itr.hasmoretokens ()) {word.set (itr.nextToken ()); context.write (word, satu); }}} public static class intsumreducer memperluas reducer <teks, tidak dapat diterapkan, teks, tidak dapat diterjemahkan> {private tidak dapat berkaitan = new IntWritable (); void public reduksi (kunci teks, nilai -nilai <intwritable>, konteks konteks) melempar ioException, interruptedException {int sum = 0; untuk (val yang tidak dapat dituntun: values) {sum += val.get (); } result.set (sum); context.write (kunci, hasil); }} / ** * Hapus direktori yang ditentukan * * @param conf * @param dirpath * @throws ioException * / private static void deletedir (konfigurasi conf, string dirpath) melempar ioException {filesystem fs = filesystem.get (conf); Jalur targetPath = jalur baru (dirpath); if (fs.exists (targetPath)) {boolean delresult = fs.delete (targetPath, true); if (delResult) {System.out.println (TargetPath + "telah dihapus dengan sukses."); } else {System.out.println (TargetPath + "Penghapusan Gagal."); }}} public static void main (string [] args) melempar Exception {configuration conf = new configuration (); String [] OtherArgs = GenericOptionsParser baru (conf, args) .getRemainingArgs (); if (OtherArgs.length <2) {System.err.println ("Penggunaan: WordCount <in> [<in> ...] <Unt>"); System.exit (2); } // hapus direktori output pertama deletedir (conf, OtherArgs [OtherArgs.length - 1]); Pekerjaan pekerjaan = job.getInstance (conf, "word count"); job.setjarbyclass (wordcount.class); job.setmapperclass (tokenizermapper.class); job.setCombinerClass (intsumreducer.class); job.setreducerclass (intsumreducer.class); job.setoutputKeyClass (text.class); job.setoutputValueClass (intrwritable.class); untuk (int i = 0; i <OtherArgs.length - 1; ++ i) {FileInputFormat.AddInputPath (Job, Path baru (OtherArgs [i])); } FileOutPutFormat.SetOutputPath (Job, Path baru (OtherArgs [OtherArgs.Length - 1])); System.exit (job.waitforcompletion (true)? 0: 1); }} Tapi ini tidak cukup. Saat berjalan di lingkungan IDE, IDE perlu mengetahui instance HDFS mana yang terhubung ke (seperti dalam pengembangan DB, Anda perlu menentukan sumber data dalam konfigurasi XML), salin site core.xml di bawah $ hadoop_home/etc/hadoop ke direktori sumber daya, mirip dengan yang berikut:
Isinya adalah sebagai berikut:
<? Xml Version = "1.0" encoding = "UTF-8"?> <? Xml-stylesheet type = "text/xsl" href = "configuration.xsl"?> <configuration> <propert> <name> fs.defaultfs </name> <nilai> hdfs: //172.28.20.20.20.20
Cukup ganti IP di atas dengan IP di mesin virtual.