Thứ Ba, 3 tháng 9, 2013

Sử dụng Hive: Nối dữ liệu Informix và dữ liệu DB2


Có một trường hợp sử dụng thú vị cần nối dữ liệu từ Informix đến DB2. Không hứng thú lắm đối với hai bảng tầm thường, nhưng sẽ là một thắng lợi vĩ đại với nhiều terabyte hoặc petabyte dữ liệu.
Có hai cách tiếp cận cơ bản để nối các nguồn dữ liệu khác nhau. Cứ giữ nguyên dữ liệu ở đâu ở đó và sử dụng công nghệ liên hợp dữ liệu đối lập với việc di chuyển dữ liệu đến một kho lưu trữ duy nhất để thực hiện phép nối. Yếu tố kinh tế và hiệu năng của Hadoop làm cho việc di chuyển dữ liệu vào HDFS và thực hiện công việc nặng nhọc với MapReduce trở thành một sự lựa chọn dễ dàng. Các giới hạn băng thông mạng tạo ra một rào cản chính nếu cố gắng nối dữ liệu ở nguyên chỗ cũ bằng một công nghệ kiểu liên hợp. Để biết thêm thông tin về liên hợp dữ liệu, hãy xem phần Tài nguyên.
Hive cung cấp một tập hợp con của SQL để hoạt động trên một cụm. Nó không cung cấp ngữ nghĩa giao dịch. Nó không phải là một sự thay thế cho Informix hoặc DB2. Nếu bạn có một công việc nặng nề nào đó dưới dạng các phép nối bảng, ngay cả khi bạn có một số bảng nhỏ hơn nhưng cần phải thực hiện các tích Đề-các (Cartesian) khó chịu, thì Hadoop là công cụ nên dùng.
Để sử dụng ngôn ngữ truy vấn Hive, cần có một tập hợp con của SQL được gọi là siêu dữ liệu bảng Hiveql. Bạn có thể định nghĩa siêu dữ liệu này dựa vào các tệp hiện có trong HDFS. Sqoop cung cấp một lối tắt thuận tiện với tùy chọn create-hive-table (tạo bảng hive).
Những người dùng MySQL sẽ thấy thoải mái khi sửa lại các ví dụ được hiển thị trong Liệt kê 18 cho phù hợp. Một bài tập thú vị là nối MySQL hoặc bất kỳ các bảng cơ sở dữ liệu quan hệ khác nào, với các bảng tính lớn.

Liệt kê 18. Nối bảng informix.customer với bảng db2.staff
                 
# import the customer table into Hive
$ sqoop import --driver com.informix.jdbc.IfxDriver  \
--connect \
"jdbc:informix-sqli://myhost:54321/stores_demo:informixserver=ifx;user=me;password=you"  \
--table customer
                
# now tell hive where to find the informix data
                
# to get to the hive command prompt just type in hive
                
$ hive
Hive history file=/tmp/cloudera/yada_yada_log123.txt
hive> 
                
# here is the hiveql you need to create the tables
# using a file is easier than typing 
                
create external table customer (
cn int,
fname string,
lname string,
company string,
addr1 string,
addr2 string,
city string,
state string,
zip string,
phone string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/user/cloudera/customer'
;
                               
# we already imported the db2 staff table above
                
# now tell hive where to find the db2 data
create external table staff (
id int,
name string,
dept string,
job string,
years string,
salary float,
comm float) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/user/cloudera/staff'
;
                
# you can put the commands in a file 
# and execute them as follows:
                
$ hive -f hivestaff
Hive history file=/tmp/cloudera/hive_job_log_cloudera_201208101502_2140728119.txt
OK
Time taken: 3.247 seconds
OK
10 Sanders 20 Mgr   7 98357.5 NULL
20 Pernal 20 Sales 8 78171.25 612.45
30 Marenghi 38 Mgr   5 77506.75 NULL
40 O'Brien 38 Sales 6 78006.0 846.55
50 Hanes 15 Mgr   10 80
... lines deleted
                
# now for the join we've all been waiting for :-)
                
# this is a simple case, Hadoop can scale well into the petabyte range!                 
                
$ hive
Hive history file=/tmp/cloudera/hive_job_log_cloudera_201208101548_497937669.txt
hive> select customer.cn, staff.name, 
> customer.addr1, customer.city, customer.phone
> from staff join customer
> on ( staff.id = customer.cn );
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks not specified. Estimated from input data size: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=number
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=number
In order to set a constant number of reducers:
set mapred.reduce.tasks=number
Starting Job = job_201208101425_0005, 
Tracking URL = http://0.0.0.0:50030/jobdetails.jsp?jobid=job_201208101425_0005
Kill Command = /usr/lib/hadoop/bin/hadoop 
job  -Dmapred.job.tracker=0.0.0.0:8021 -kill job_201208101425_0005
2012-08-10 15:49:07,538 Stage-1 map = 0%,  reduce = 0%
2012-08-10 15:49:11,569 Stage-1 map = 50%,  reduce = 0%
2012-08-10 15:49:12,574 Stage-1 map = 100%,  reduce = 0%
2012-08-10 15:49:19,686 Stage-1 map = 100%,  reduce = 33%
2012-08-10 15:49:20,692 Stage-1 map = 100%,  reduce = 100%
Ended Job = job_201208101425_0005
OK
110 Ngan 520 Topaz Way        Redwood City    415-743-3611      
120 Naughton 6627 N. 17th Way     Phoenix         602-265-8754      
Time taken: 22.764 seconds                
                

             

Sẽ đẹp hơn nhiều khi bạn sử dụng Hue để có một giao diện đồ họa trong trình duyệt, như thể hiện trong Hình 9, 10 và 11.

Hình 9. Giao diện người dùng đồ họa (GUI) Beeswax của Hue cho Hive trong CDH4, xem truy vấn Hiveql
Hình này hiển thị Giao diện người dùng đồ họa Hue Beeswax cho Hive

Hình 10. Giao diện người dùng đồ họa (GUI) Beeswax của Hue cho Hive, xem truy vấn Hiveql
Hình này hiển thị Giao diện người dùng đồ họa Hue Beeswax cho Hive

Hình 11. Giao diện người dùng đồ họa (GUI) Beeswax của Hue, xem kết quả của phép nối Informix-DB2
Hình này hiển thị trình duyệt của Giao diện Hue Beeswax

Không có nhận xét nào:

Đăng nhận xét