Hadoop Tutorial 2.1 - Streaming File XML

D. Thiebaut 02:52, 13 April 2010 (UTC)

HadoopCartoon.png

 

Tutorial ini adalah kelanjutan dari Tutorial 2 , dan menggunakan streaming untuk memproses file XML sebagai blok. Dalam konfigurasi ini setiap tugas Peta mendapat file xml utuh dan mengelompokkannya ke dalam tupel. 

 

Pengaturan

StreamingXMLInHadoop.png

Setup sederhana:

  • kami memiliki banyak file xml, mirip dengan yang ditunjukkan di atas. Mereka dipisahkan oleh <xml> dan </ xml> di awal dan akhir dari isi.
  • Salah satu bidang minat terjepit di antara <title> tag
  • Bidang lain yang menarik adalah terjepit di antara <text> tag.
  • Fungsi mapper ( mapper.py ) mendapatkan seluruh file sebagai input (sebagai lawan sebagai default makan hanya satu baris dari file untuk fungsi peta, seperti dalam program wordcount dari Tutorial 2 ).
  • Mapper keluaran tupel dengan judul string sebagai kunci dan versi singkat dari teks string sebagai nilai .
  • peredam adalah fungsi Identitas dan output apa yang diterimanya.

Masukan File

  • Mengatur diri dalam sebuah direktori baru
  • Buat beberapa file dengan format XML yang ditunjukkan di atas. Panggil mereka file1.xml , file2.xml dan file3.xml .
  • Buat subdirektori dalam direktori HDFS Anda (kami menggunakan DFT sini sebagai direktori pengguna. Sesuaikan dan ganti dengan nama Anda sendiri / inisial).
hadoop dfs -mkdir dft/xml
  • Salin file xml dari penyimpanan lokal untuk HDFS
hadoop dfs -copyFromLocal file*.xml dft/xml

Program Mapper

Membuat program mapper.py dalam direktori kerja Anda.

#!/usr/bin/env python
# mapper.py
# D. Thiebaut
# takes a complete xml file, extract the title and 
# text part of the file, and outputs a tuple
# <title \t text> where text is shortened to just a few 
# characters.
 
import sys
 
list = []
title = "Unknown"
inText = False
for line in sys.stdin:
    line = line.strip()
    if line.find( "<title>" )!= -1:
        title = line[ len( "<title>" ) : -len( "</title>" ) ]
    if line.find( "<text>" ) != -1:
        inText = True
        continue
    if line.find( "</text>" ) != -1:
        inText = False
        continue
    if inText:
        list.append( line )

text = ' '.join( list )
text = text[0:10] + "..." + text[-10:]
print '[[%s]]\t[[%s]]' % (title, text)
 

  • Membuatnya menjadi executable
chmod a+x mapper.py

Pengujian

  • Menguji mapper pada salah satu file xml:
cat file1.xml | ./mapper.py

Pastikan Anda mendapatkan judul yang benar dan teks singkat.

Program Reducer

#!/usr/bin/env python
import sys

for line in sys.stdin:

    line = line.strip()
    title, page = line.split('\t', 1)
    print '%s\t%s'   %   ( title, page )

  • Buat file bernama reducer.py di direktori kerja Anda dengan kode di atas.
  • Membuatnya menjadi executable
chmod a+x ./reducer.py

Pengujian

  • Mengujinya dengan memberinya makan output dari mapper:
cat file1.xml | ./mapper.py | ./reducer.py
  • Pastikan bahwa Anda mendapatkan output yang sama seperti output dari mapper di bagian uji mapper di atas.

Menjalankan Program Hadoop Streaming

Pengantar

Kunci untuk seluruh lab ini adalah cara kita memulai pekerjaan Hadoop. Informasi yang tersedia di dokumentasi / Faq Hadoop Apache halaman . Yang harus kita lakukan adalah untuk menentukan switch berikut di jar Hadoop

-inputreader "StreamXmlRecordReader,begin=xml,end=/xml" 

Ini menentukan bahwa InputReader harus StreamXmlRecordReader , dan bahwa itu harus memberi makan kelas mapper semua informasi terjepit di antara <xml> dan </ xml> .

Menjalankan pekerjaan

  • Menjalankan Hadoop Streaming pasangan mapper / peredam Anda, dan menggunakan -inputreader switch:
hadoop jar /home/hadoop/hadoop/contrib/streaming/hadoop-0.19.2-streaming.jar \
-inputreader "StreamXmlRecordReader,begin=xml,end=/xml" \
-file ./mapper.py -mapper ./mapper.py \
-file ./reducer.py -reducer ./reducer.py \
-input dft/xml -output dft-out

Jangan lupa untuk mengganti DFT pada command di atas dengan inisial Anda sendiri / nama!

  • Pastikan bahwa program Anda berlangsung melalui file data Anda:
hadoop jar /home/hadoop/hadoop/contrib/streaming/hadoop-0.19.2-streaming.jar -inputreader \
"StreamXmlRecordReader,begin=xml,end=/xml" -file ./mapper.py -mapper ./mapper.py \
-file ./reducer.py -reducer ./reducer.py -input dft/xml -output dft-out
packageJobJar: [./mapper.py, ./reducer.py, /tmp/hadoop/hadoop-unjar3287253995728872117/] [] \ 
/tmp/streamjob1960257454356309241.jar tmpDir=null
10/04/12 21:49:20 INFO mapred.FileInputFormat: Total input paths to process : 4
10/04/12 21:49:20 INFO streaming.StreamJob: getLocalDirs(): [/tmp/hadoop/mapred/local]
10/04/12 21:49:20 INFO streaming.StreamJob: Running job: job_201004011119_0108
10/04/12 21:49:20 INFO streaming.StreamJob: To kill this job, run:
10/04/12 21:49:20 INFO streaming.StreamJob: /home/hadoop/hadoop/bin/../bin/hadoop job \
-Dmapred.job.tracker=hadoop1:9001 -kill job_201004011119_0108
10/04/12 21:49:20 INFO streaming.StreamJob: Tracking URL: http://hadoop1:50030/jobdetails.jsp? \
jobid=job_201004011119_0108
10/04/12 21:49:21 INFO streaming.StreamJob: map 0% reduce 0%
10/04/12 21:49:25 INFO streaming.StreamJob: map 75% reduce 0%
10/04/12 21:49:26 INFO streaming.StreamJob: map 100% reduce 0%
10/04/12 21:49:35 INFO streaming.StreamJob: map 100% reduce 100%
10/04/12 21:49:36 INFO streaming.StreamJob: Job complete: job_201004011119_0108
10/04/12 21:49:36 INFO streaming.StreamJob: Output: dft-out

hadoop@hadoop6:~/352/dft/readXml$ hadoop dfs -ls dft-out/
Found 2 items
drwxr-xr-x - hadoop supergroup 0 2010-04-12 21:49 /user/hadoop/dft-out/_logs
-rw-r--r-- 2 hadoop supergroup 233 2010-04-12 21:49 /user/hadoop/dft-out/part-00000

hadoop@hadoop6:~/352/dft/readXml$ hadoop dfs -text dft-out/part-00000

 

  • Pastikan bahwa Anda mendapatkan output yang benar.

 

Laboratorium Percobaan # 1

Fungsi Mapper, seperti yang disajikan di sini, mengasumsikan bahwa file yang diberikan hanya berisi satu set <xml> ... </ xml> tag. Memodifikasinya sehingga dapat memperlakukan file yang berisi beberapa halaman wiki yang terdapat masing-masing menetapkan sendiri <xml> ... </ xml> tag.

Menghasilkan beberapa file xml yang berisi beberapa <xml> ... </ xml> tag, dan uji / verifikasi bahwa mapper baru, yang lebih umum dan karenanya lebih diinginkan, bekerja dengan baik.