Hadoop - Truyền trực tuyến
Phát trực tuyến Hadoop là một tiện ích đi kèm với bản phân phối Hadoop. Tiện ích này cho phép bạn tạo và chạy các công việc Bản đồ / Rút gọn với bất kỳ tệp thực thi hoặc tập lệnh nào dưới dạng trình ánh xạ và / hoặc trình giảm thiểu.
Ví dụ sử dụng Python
Đối với truyền trực tuyến Hadoop, chúng tôi đang xem xét vấn đề đếm từ. Bất kỳ công việc nào trong Hadoop đều phải có hai giai đoạn: lập bản đồ và giảm tốc. Chúng tôi đã viết mã cho trình liên kết và trình rút gọn trong tập lệnh python để chạy nó trong Hadoop. Người ta cũng có thể viết như vậy trong Perl và Ruby.
Mã giai đoạn lập bản đồ
!/usr/bin/python
import sys
# Input takes from standard input for myline in sys.stdin:
# Remove whitespace either side
myline = myline.strip()
# Break the line into words
words = myline.split()
# Iterate the words list
for myword in words:
# Write the results to standard output
print '%s\t%s' % (myword, 1)
Đảm bảo rằng tệp này có quyền thực thi (chmod + x / home / Expert / hadoop-1.2.1 / mapper.py).
Mã pha giảm tốc
#!/usr/bin/python
from operator import itemgetter
import sys
current_word = ""
current_count = 0
word = ""
# Input takes from standard input for myline in sys.stdin:
# Remove whitespace either side
myline = myline.strip()
# Split the input we got from mapper.py word,
count = myline.split('\t', 1)
# Convert count variable to integer
try:
count = int(count)
except ValueError:
# Count was not a number, so silently ignore this line continue
if current_word == word:
current_count += count
else:
if current_word:
# Write result to standard output print '%s\t%s' % (current_word, current_count)
current_count = count
current_word = word
# Do not forget to output the last word if needed!
if current_word == word:
print '%s\t%s' % (current_word, current_count)
Lưu mã ánh xạ và mã giảm thiểu trong mapper.py và Reduceer.py trong thư mục chính Hadoop. Đảm bảo các tệp này có quyền thực thi (chmod + x mapper.py và chmod + x Reduceer.py). Vì python nhạy cảm với thụt đầu dòng nên bạn có thể tải xuống mã tương tự từ liên kết bên dưới.
Thực thi chương trình WordCount
$ $HADOOP_HOME/bin/hadoop jar contrib/streaming/hadoop-streaming-1.
2.1.jar \
-input input_dirs \
-output output_dir \
-mapper <path/mapper.py \
-reducer <path/reducer.py
Trong đó "\" được sử dụng để tiếp tục dòng để dễ đọc.
Ví dụ,
./bin/hadoop jar contrib/streaming/hadoop-streaming-1.2.1.jar -input myinput -output myoutput -mapper /home/expert/hadoop-1.2.1/mapper.py -reducer /home/expert/hadoop-1.2.1/reducer.py
Cách phát trực tuyến hoạt động
Trong ví dụ trên, cả trình ánh xạ và trình giảm thiểu đều là tập lệnh python đọc đầu vào từ đầu vào tiêu chuẩn và phát ra đầu ra thành đầu ra tiêu chuẩn. Tiện ích sẽ tạo Bản đồ / Rút gọn công việc, gửi công việc đến một cụm thích hợp và theo dõi tiến trình của công việc cho đến khi hoàn thành.
Khi một tập lệnh được chỉ định cho người lập bản đồ, mỗi tác vụ ánh xạ sẽ khởi chạy tập lệnh như một quá trình riêng biệt khi trình ánh xạ được khởi tạo. Khi tác vụ lập bản đồ chạy, nó chuyển đổi đầu vào của nó thành các dòng và đưa các dòng tới đầu vào chuẩn (STDIN) của quy trình. Trong khi chờ đợi, trình ánh xạ thu thập các đầu ra hướng dòng từ đầu ra chuẩn (STDOUT) của quá trình và chuyển đổi mỗi dòng thành một cặp khóa / giá trị, được thu thập dưới dạng đầu ra của trình ánh xạ. Theo mặc định, tiền tố của một dòng tính đến ký tự tab đầu tiên là khóa và phần còn lại của dòng (không bao gồm ký tự tab) sẽ là giá trị. Nếu không có ký tự tab nào trong dòng, thì toàn bộ dòng được coi là khóa và giá trị là null. Tuy nhiên, điều này có thể được tùy chỉnh, theo nhu cầu.
Khi một tập lệnh được chỉ định cho bộ giảm, mỗi tác vụ bộ giảm sẽ khởi chạy tập lệnh như một quá trình riêng biệt, sau đó bộ giảm được khởi tạo. Khi tác vụ giảm tốc chạy, nó chuyển đổi các cặp khóa / giá trị đầu vào của nó thành các dòng và chuyển các dòng tới đầu vào tiêu chuẩn (STDIN) của quy trình. Trong khi đó, bộ giảm tốc thu thập các đầu ra hướng dòng từ đầu ra chuẩn (STDOUT) của quy trình, chuyển đổi mỗi dòng thành một cặp khóa / giá trị, được thu thập như đầu ra của bộ giảm tốc. Theo mặc định, tiền tố của một dòng tính đến ký tự tab đầu tiên là khóa và phần còn lại của dòng (không bao gồm ký tự tab) là giá trị. Tuy nhiên, điều này có thể được tùy chỉnh theo yêu cầu cụ thể.
Các lệnh quan trọng
Thông số | Tùy chọn | Sự miêu tả |
---|---|---|
-input thư mục / tệp-tên | Cần thiết | Nhập vị trí cho người lập bản đồ. |
-output thư mục-tên | Cần thiết | Vị trí đầu ra cho bộ giảm tốc. |
-mapper thực thi hoặc tập lệnh hoặc JavaClassName | Cần thiết | Bản đồ có thể thực thi. |
-reducer thực thi hoặc script hoặc JavaClassName | Cần thiết | Bộ giảm tốc có thể thực thi. |
-tệp-tên tệp | Không bắt buộc | Làm cho trình ánh xạ, trình giảm thiểu hoặc trình kết hợp có thể thực thi được cục bộ trên các nút tính toán. |
-inputformat JavaClassName | Không bắt buộc | Lớp bạn cung cấp phải trả về các cặp khóa / giá trị của lớp Văn bản. Nếu không được chỉ định, TextInputFormat được sử dụng làm mặc định. |
-outputformat JavaClassName | Không bắt buộc | Lớp bạn cung cấp nên lấy các cặp khóa / giá trị của lớp Văn bản. Nếu không được chỉ định, TextOutputformat được sử dụng làm mặc định. |
-partitioner JavaClassName | Không bắt buộc | Lớp xác định khóa giảm được gửi đến. |
-combiner streamingCommand hoặc JavaClassName | Không bắt buộc | Combiner có thể thực thi cho đầu ra bản đồ. |
-cmdenv name = giá trị | Không bắt buộc | Truyền biến môi trường cho các lệnh truyền trực tuyến. |
-inputreader | Không bắt buộc | Để tương thích ngược: chỉ định lớp trình đọc bản ghi (thay vì lớp định dạng đầu vào). |
-bếp | Không bắt buộc | Báo cáo dài dòng. |
-lazyOutput | Không bắt buộc | Tạo đầu ra một cách lười biếng. Ví dụ: nếu định dạng đầu ra dựa trên FileOutputFormat, thì tệp đầu ra chỉ được tạo trong lần gọi đầu tiên tới output.collect (hoặc Context.write). |
-numReduceTasks | Không bắt buộc | Chỉ định số lượng bộ giảm. |
-mapdebug | Không bắt buộc | Tập lệnh gọi khi tác vụ bản đồ không thành công. |
-reducedebug | Không bắt buộc | Tập lệnh gọi khi tác vụ giảm không thành công. |