Bootstrap

multipleInput

MultipleInputs处理多输入源,本例子包括 windows上的MySQL数据库数据和hdfs上的文本数据。


mysql数据:



hdfs数据:

[java]  view plain  copy
 print ?
  1. [root@baolibin ~]# hadoop fs -text /input/hehe  
  2. Warning: $HADOOP_HOME is deprecated.  
  3.   
  4. hello you  
  5. hello me  
  6. hello you  
  7. hello me  



代码:

写的比较简单,这是一个没有reduce的mapreduce,仅仅强调连接多输入源,读出数据:

[java]  view plain  copy
 print ?
  1. package hadoop_2_6_0;  
  2.   
  3. import java.io.DataInput;  
  4. import java.io.DataOutput;  
  5. import java.io.IOException;  
  6. import java.sql.PreparedStatement;  
  7. import java.sql.ResultSet;  
  8. import java.sql.SQLException;  
  9. import org.apache.hadoop.conf.Configuration;  
  10. import org.apache.hadoop.fs.Path;  
  11. import org.apache.hadoop.io.LongWritable;  
  12. import org.apache.hadoop.io.Text;  
  13. import org.apache.hadoop.io.Writable;  
  14. import org.apache.hadoop.mapreduce.Job;  
  15. import org.apache.hadoop.mapreduce.Mapper;  
  16. import org.apache.hadoop.mapreduce.lib.db.DBConfiguration;  
  17. import org.apache.hadoop.mapreduce.lib.db.DBInputFormat;  
  18. import org.apache.hadoop.mapreduce.lib.db.DBWritable;  
  19. import org.apache.hadoop.mapreduce.lib.input.MultipleInputs;  
  20. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;  
  21. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
  22.   
  23. public class MultipleInputsTest {  
  24.   
  25.     public static class TextMapper extends  
  26.             Mapper<LongWritable, Text, LongWritable, Text> {  
  27.         final LongWritable k2 = new LongWritable();  
  28.         final Text v2 = new Text();  
  29.   
  30.         protected void map(LongWritable key, Text value,  
  31.                 Mapper<LongWritable, Text, LongWritable, Text>.Context context)  
  32.                 throws InterruptedException, IOException {  
  33.                 v2.set(value.toString());  
  34.                 context.write(k2, v2);  
  35.         }  
  36.     }  
  37.   
  38.     public static class DBMapper extends  
  39.             Mapper<LongWritable, MyDBWritable, LongWritable, Text> {  
  40.         final Text v2 = new Text();  
  41.   
  42.         protected void map(  
  43.                 LongWritable key,  
  44.                 MyDBWritable value,  
  45.                 Mapper<LongWritable, MyDBWritable, LongWritable, Text>.Context context)  
  46.                 throws InterruptedException, IOException {  
  47.             v2.set(value.toString());  
  48.             context.write(key, v2);  
  49.         }  
  50.     }  
  51.   
  52.     public static class MyDBWritable implements Writable, DBWritable {  
  53.         int id;  
  54.         String name;  
  55.   
  56.         public void write(PreparedStatement statement) throws SQLException {  
  57.             statement.setInt(1, id);  
  58.             statement.setString(2, name);  
  59.         }  
  60.   
  61.         public void readFields(ResultSet resultSet) throws SQLException {  
  62.             this.id = resultSet.getInt(1);  
  63.             this.name = resultSet.getString(2);  
  64.         }  
  65.   
  66.         public void write(DataOutput out) throws IOException {  
  67.             out.write(id);  
  68.             out.writeUTF(name);  
  69.         }  
  70.   
  71.         public void readFields(DataInput in) throws IOException {  
  72.             this.id = in.readInt();  
  73.             this.name = in.readUTF();  
  74.         }  
  75.   
  76.         public String toString() {  
  77.             return "MyDBWritable[id=" + id + ",\t" + "name=" + name + "]";  
  78.         }  
  79.     }  
  80.   
  81.     public static void main(String[] args) throws Exception {  
  82.         final Configuration conf = new Configuration();  
  83.         //  
  84.         DBConfiguration.configureDB(conf, "com.mysql.jdbc.Driver","jdbc:mysql://192.168.1.1:3306/oled""root""mysqladmin");  
  85.         final Job job = Job.getInstance(conf,MultipleInputsTest.class.getSimpleName());  
  86.         job.setJarByClass(MultipleInputsTest.class);  
  87.         // 1.1  
  88.         //FileInputFormat.setInputPaths(job,"hdfs://192.168.1.10:9000/input/hehe");  
  89.         job.setMapOutputKeyClass(LongWritable.class);  
  90.         job.setMapOutputValueClass(Text.class);  
  91.   
  92.         // 2.2  
  93.         job.setOutputKeyClass(LongWritable.class);  
  94.         job.setOutputValueClass(Text.class);  
  95.   
  96.         DBInputFormat.setInput(job, MyDBWritable.class,"select id,name from DB""select count(1) from DB");  
  97.           
  98.         MultipleInputs.addInputPath(job, new Path("hdfs://192.168.1.100:9000/input/hehe"), TextInputFormat.class,TextMapper.class);  
  99.         MultipleInputs.addInputPath(job, new Path("hdfs://192.168.1.100:9000/"), DBInputFormat.class, DBMapper.class);  
  100.         // 2.3  
  101.         FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.1.100:9000/DBout1"));  
  102.   
  103.         job.waitForCompletion(true);  
  104.     }  
  105. }  


console输出:

[java]  view plain  copy
 print ?
  1. 15/04/16 16:06:03 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable  
  2. 15/04/16 16:06:03 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.  
  3. 15/04/16 16:06:03 WARN mapred.JobClient: No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String).  
  4. 15/04/16 16:06:04 INFO input.FileInputFormat: Total input paths to process : 1  
  5. 15/04/16 16:06:04 WARN snappy.LoadSnappy: Snappy native library not loaded  
  6. 15/04/16 16:06:05 INFO mapred.JobClient: Running job: job_local942775997_0001  
  7. 15/04/16 16:06:05 INFO mapred.LocalJobRunner: Waiting for map tasks  
  8. 15/04/16 16:06:05 INFO mapred.LocalJobRunner: Starting task: attempt_local942775997_0001_m_000000_0  
  9. 15/04/16 16:06:05 INFO mapred.Task:  Using ResourceCalculatorPlugin : null  
  10. 15/04/16 16:06:05 INFO mapred.MapTask: Processing split: hdfs://192.168.1.100:9000/input/hehe:0+38  
  11. 15/04/16 16:06:05 INFO mapred.MapTask: io.sort.mb = 100  
  12. 15/04/16 16:06:05 INFO mapred.MapTask: data buffer = 79691776/99614720  
  13. 15/04/16 16:06:05 INFO mapred.MapTask: record buffer = 262144/327680  
  14. 15/04/16 16:06:06 INFO mapred.MapTask: Starting flush of map output  
  15. 15/04/16 16:06:06 INFO mapred.MapTask: Finished spill 0  
  16. 15/04/16 16:06:06 INFO mapred.Task: Task:attempt_local942775997_0001_m_000000_0 is done. And is in the process of commiting  
  17. 15/04/16 16:06:06 INFO mapred.LocalJobRunner:   
  18. 15/04/16 16:06:06 INFO mapred.Task: Task 'attempt_local942775997_0001_m_000000_0' done.  
  19. 15/04/16 16:06:06 INFO mapred.LocalJobRunner: Finishing task: attempt_local942775997_0001_m_000000_0  
  20. 15/04/16 16:06:06 INFO mapred.LocalJobRunner: Starting task: attempt_local942775997_0001_m_000001_0  
  21. 15/04/16 16:06:06 INFO mapred.Task:  Using ResourceCalculatorPlugin : null  
  22. 15/04/16 16:06:06 INFO mapred.MapTask: Processing split: org.apache.hadoop.mapreduce.lib.db.DBInputFormat$DBInputSplit@3c3a1834  
  23. 15/04/16 16:06:06 INFO mapred.MapTask: io.sort.mb = 100  
  24. 15/04/16 16:06:06 INFO mapred.MapTask: data buffer = 79691776/99614720  
  25. 15/04/16 16:06:06 INFO mapred.MapTask: record buffer = 262144/327680  
  26. 15/04/16 16:06:06 INFO mapred.MapTask: Starting flush of map output  
  27. 15/04/16 16:06:06 INFO mapred.MapTask: Finished spill 0  
  28. 15/04/16 16:06:06 INFO mapred.Task: Task:attempt_local942775997_0001_m_000001_0 is done. And is in the process of commiting  
  29. 15/04/16 16:06:06 INFO mapred.LocalJobRunner:   
  30. 15/04/16 16:06:06 INFO mapred.Task: Task 'attempt_local942775997_0001_m_000001_0' done.  
  31. 15/04/16 16:06:06 INFO mapred.LocalJobRunner: Finishing task: attempt_local942775997_0001_m_000001_0  
  32. 15/04/16 16:06:06 INFO mapred.LocalJobRunner: Map task executor complete.  
  33. 15/04/16 16:06:06 INFO mapred.JobClient:  map 100% reduce 0%  
  34. 15/04/16 16:06:07 INFO mapred.Task:  Using ResourceCalculatorPlugin : null  
  35. 15/04/16 16:06:07 INFO mapred.LocalJobRunner:   
  36. 15/04/16 16:06:07 INFO mapred.Merger: Merging 2 sorted segments  
  37. 15/04/16 16:06:08 INFO mapred.Merger: Down to the last merge-pass, with 2 segments left of total size: 127 bytes  
  38. 15/04/16 16:06:08 INFO mapred.LocalJobRunner:   
  39. 15/04/16 16:06:09 INFO mapred.Task: Task:attempt_local942775997_0001_r_000000_0 is done. And is in the process of commiting  
  40. 15/04/16 16:06:09 INFO mapred.LocalJobRunner:   
  41. 15/04/16 16:06:09 INFO mapred.Task: Task attempt_local942775997_0001_r_000000_0 is allowed to commit now  
  42. 15/04/16 16:06:09 INFO output.FileOutputCommitter: Saved output of task 'attempt_local942775997_0001_r_000000_0' to hdfs://192.168.1.100:9000/DBout1  
  43. 15/04/16 16:06:09 INFO mapred.LocalJobRunner: reduce > reduce  
  44. 15/04/16 16:06:09 INFO mapred.Task: Task 'attempt_local942775997_0001_r_000000_0' done.  
  45. 15/04/16 16:06:10 INFO mapred.JobClient:  map 100% reduce 100%  
  46. 15/04/16 16:06:10 INFO mapred.JobClient: Job complete: job_local942775997_0001  
  47. 15/04/16 16:06:10 INFO mapred.JobClient: Counters: 19  
  48. 15/04/16 16:06:10 INFO mapred.JobClient:   File Output Format Counters   
  49. 15/04/16 16:06:10 INFO mapred.JobClient:     Bytes Written=83  
  50. 15/04/16 16:06:10 INFO mapred.JobClient:   FileSystemCounters  
  51. 15/04/16 16:06:10 INFO mapred.JobClient:     FILE_BYTES_READ=2727  
  52. 15/04/16 16:06:10 INFO mapred.JobClient:     HDFS_BYTES_READ=114  
  53. 15/04/16 16:06:10 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=215188  
  54. 15/04/16 16:06:10 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=83  
  55. 15/04/16 16:06:10 INFO mapred.JobClient:   File Input Format Counters   
  56. 15/04/16 16:06:10 INFO mapred.JobClient:     Bytes Read=0  
  57. 15/04/16 16:06:10 INFO mapred.JobClient:   Map-Reduce Framework  
  58. 15/04/16 16:06:10 INFO mapred.JobClient:     Map output materialized bytes=135  
  59. 15/04/16 16:06:10 INFO mapred.JobClient:     Map input records=5  
  60. 15/04/16 16:06:10 INFO mapred.JobClient:     Reduce shuffle bytes=0  
  61. 15/04/16 16:06:10 INFO mapred.JobClient:     Spilled Records=10  
  62. 15/04/16 16:06:10 INFO mapred.JobClient:     Map output bytes=113  
  63. 15/04/16 16:06:10 INFO mapred.JobClient:     Total committed heap usage (bytes)=685178880  
  64. 15/04/16 16:06:10 INFO mapred.JobClient:     SPLIT_RAW_BYTES=476  
  65. 15/04/16 16:06:10 INFO mapred.JobClient:     Combine input records=0  
  66. 15/04/16 16:06:10 INFO mapred.JobClient:     Reduce input records=5  
  67. 15/04/16 16:06:10 INFO mapred.JobClient:     Reduce input groups=1  
  68. 15/04/16 16:06:10 INFO mapred.JobClient:     Combine output records=0  
  69. 15/04/16 16:06:10 INFO mapred.JobClient:     Reduce output records=5  
  70. 15/04/16 16:06:10 INFO mapred.JobClient:     Map output records=5  



结果:

[java]  view plain  copy
 print ?
  1. [root@baolibin ~]# hadoop fs -ls /DBout1  
  2. Warning: $HADOOP_HOME is deprecated.  
  3.   
  4. Found 2 items  
  5. -rw-r--r--   3 Administrator supergroup          0 2015-04-16 16:06 /DBout1/_SUCCESS  
  6. -rw-r--r--   3 Administrator supergroup         83 2015-04-16 16:06 /DBout1/part-r-00000  
  7. [root@baolibin ~]# hadoop fs -text /DBout1/part-*  
  8. Warning: $HADOOP_HOME is deprecated.  
  9.   
  10. 0       MyDBWritable[id=1,      name=鲍礼彬]  
  11. 0       hello you  
  12. 0       hello me  
  13. 0       hello you  
  14. 0       hello me  




关键点:

自定义一个数据类型,并实现Writable和DBWritable接口:

[java]  view plain  copy
 print ?
  1. public static class MyDBWritable implements Writable, DBWritable  

用的是JDBC,指明驱动、要访问数据库、用户名、登陆密码:

[java]  view plain  copy
 print ?
  1. DBConfiguration.configureDB(conf, "com.mysql.jdbc.Driver","jdbc:mysql://192.168.1.1:3306/oled""root""mysqladmin");  

指明mapper类及查询条件:

[java]  view plain  copy
 print ?
  1. DBInputFormat.setInput(job, MyDBWritable.class,"select id,name from DB""select count(1) from DB");  
添加多输入源:

[java]  view plain  copy
 print ?
  1. MultipleInputs.addInputPath(job, new Path("hdfs://192.168.1.100:9000/input/hehe"), TextInputFormat.class,TextMapper.class);  
  2. MultipleInputs.addInputPath(job, new Path("hdfs://192.168.1.100:9000/"), DBInputFormat.class, DBMapper.class);  
;