① 如何使用Hadoop進入大資料庫時代
Hadoop中有很多方法可以加入多個數據集。MapRece提供了Map端和Rece端的數據連接。這些連接是非平凡的連接,並且可能會是非常昂貴的操作。Pig和Hive也具有同等的能力來申請連接到多個數據集。Pig提供了復制連接,合並連接和傾斜連接(skewed join),並且Hive提供了map端的連接和完整外部連接來分析數據。
一個重要的事實是,通過使用各種工具,比如MapRece、Pig和Hive等,數據可以基於它們的內置功能和實際需求來使用它們。至於在Hadoop分析大量數據,Anoop指出,通常,在大數據/Hadoop的世界,一些問題可能並不復雜,並且解決方案也是直截了當的,但面臨的挑戰是數據量。在這種情況下需要不同的解決辦法來解決問題。
一些分析任務是從日誌文件中統計明確的ID的數目、在特定的日期范圍內改造存儲的數據、以及網友排名等。所有這些任務都可以通過Hadoop中的多種工具和技術如MapRece、Hive、Pig、Giraph和Mahout等來解決。這些工具在自定義常式的幫助下可以靈活地擴展它們的能力。
② 如何使用Hadoop讀寫資料庫
代碼:
package com.qin.operadb;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.maprece.lib.db.DBWritable;
/***
* 封裝資料庫實體信息
* 的記錄
*
* 搜索大數據技術交流群:376932160
*
* **/
public class PersonRecoder implements Writable,DBWritable {
public int id;//對應資料庫中id欄位
public String name;//對應資料庫中的name欄位
public int age;//對應資料庫中的age欄位
@Override
public void readFields(ResultSet result) throws SQLException {
this.id=result.getInt(1);
this.name=result.getString(2);
this.age=result.getInt(3);
}
@Override
public void write(PreparedStatement stmt) throws SQLException {
stmt.setInt(1, id);
stmt.setString(2, name);
stmt.setInt(3, age);
}
@Override
public void readFields(DataInput arg0) throws IOException {
// TODO Auto-generated method stub
this.id=arg0.readInt();
this.name=Text.readString(arg0);
this.age=arg0.readInt();
}
@Override
public void write(DataOutput out) throws IOException {
// TODO Auto-generated method stub
out.writeInt(id);
Text.writeString(out, this.name);
out.writeInt(this.age);
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "id: "+id+" 年齡: "+age+" 名字:"+name;
}
}
</pre>
MR類的定義代碼,注意是一個Map Only作業:
<pre name="code" class="java">package com.qin.operadb;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.lib.IdentityRecer;
import org.apache.hadoop.maprece.Job;
import org.apache.hadoop.maprece.Mapper;
import org.apache.hadoop.maprece.lib.db.DBConfiguration;
import org.apache.hadoop.maprece.lib.db.DBInputFormat;
import org.apache.hadoop.maprece.lib.output.FileOutputFormat;
public class ReadMapDB {
/**
* Map作業讀取數據記錄數
*
* **/
private static class DBMap extends Mapper<LongWritable, PersonRecoder , LongWritable, Text>{
@Override
protected void map(LongWritable key, PersonRecoder value,Context context)
throws IOException, InterruptedException {
context.write(new LongWritable(value.id), new Text(value.toString()));
}
}
public static void main(String[] args)throws Exception {
JobConf conf=new JobConf(ReadMapDB.class);
//Configuration conf=new Configuration();
// conf.set("mapred.job.tracker","192.168.75.130:9001");
//讀取person中的數據欄位
// conf.setJar("tt.jar");
//注意這行代碼放在最前面,進行初始化,否則會報
DBConfiguration.configureDB(conf, "com.mysql.jdbc.Driver", "jdbc:mysql://192.168.211.36:3306/test", "root", "qin");
/**要讀取的欄位信息**/
String fileds[]=new String[]{"id","name","age"};
/**Job任務**/
Job job=new Job(conf, "readDB");
System.out.println("模式: "+conf.get("mapred.job.tracker"));
/**設置資料庫輸入格式的一些信息**/
DBInputFormat.setInput(job, PersonRecoder.class, "person", null, "id", fileds);
/***設置輸入格式*/
job.setInputFormatClass(DBInputFormat.class);
job.setOutputKeyClass(LongWritable.class);
job.setOutputValueClass(Text.class);
job.setMapperClass(DBMap.class);
String path="hdfs://192.168.75.130:9000/root/outputdb";
FileSystem fs=FileSystem.get(conf);
Path p=new Path(path);
if(fs.exists(p)){
fs.delete(p, true);
System.out.println("輸出路徑存在,已刪除!");
}
FileOutputFormat.setOutputPath(job,p );
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
③ 現有 java web程序,如何去連接hadoop
看你用什麼版本的hadoop,推薦使用cdh版的
jar包導入web工程
調用HBase介面
如:
hbaseConfig = new Configuration();
conf = HBaseConfiguration.create(hbaseConfig);
admin = new HBaseAdmin(conf);
this.setTableName(tableName);
④ 如何用Hive訪問Hadoop上數據
步驟
Hive提供了jdbc驅動,使得我們可以連接Hive並進行一些類關系型資料庫的sql語句查詢等操作,首先我們需要將這些驅動拷貝到報表工程下面,然後再建立連接,最後通過連接進行數據查詢。
拷貝jar包到FR工程
將hadoop里的hadoop-common.jar拷貝至報表工程appname/WEB-INF/lib下;
將hive里的hive-exec.jar、hive-jdbc.jar、hive-metastore.jar、hive-service.jar、libfb303.jar、log4j.jar、slf4j-api.jar、slf4j-log4j12.jar拷貝至報表工程appname/WEB-INF/lib下。
配置數據連接
啟動設計器,打開伺服器>定義數據連接,新建JDBC連接。
在Hive 0.11.0版本之前,只有HiveServer服務可用,在程序操作Hive之前,必須在Hive安裝的伺服器上打開HiveServer服務。而HiveServer本身存在很多問題(比如:安全性、並發性等);針對這些問題,Hive0.11.0版本提供了一個全新的服務:HiveServer2,這個很好的解決HiveServer存在的安全性、並發性等問題,所以下面我們分別介紹HiveServer和HiveServer2配置數據連接的方式。
HiveServer
資料庫驅動:org.apache.hadoop.hive.jdbc.HiveDriver;
URL:jdbc:hive://localhost:10000/default
註:hive服務默認埠為10000,根據實際情況修改埠;另外目前只支持默認資料庫名default,所有的Hive都支持。
測試連接,提示連接成功即可。
4
資料庫驅動:org.apache.hive.jdbc.HiveDriver;
URL:jdbc:hive2://localhost:10000/default
註:該連接方式只支持Hive0.11.0及之後版本。
⑤ 如何使用Hadoop讀寫資料庫
我們的一些應用程序中,常常避免不了要與資料庫進行交互,而在我們的hadoop中,有時候也需要和資料庫進行交互,比如說,數據分析的結果存入資料庫,
或者是,讀取資料庫的信息寫入HDFS上,不過直接使用MapRece操作資料庫,這種情況在現實開發還是比較少,一般我們會採用Sqoop來進行數
據的遷入,遷出,使用Hive分析數據集,大多數情況下,直接使用Hadoop訪問關系型資料庫,可能產生比較大的數據訪問壓力,尤其是在資料庫還是單機
的情況下,情況可能更加糟糕,在集群的模式下壓力會相對少一些。
那麼,今天散仙就來看下,如何直接使用Hadoop1.2.0的MR來讀寫操作資料庫,hadoop的API提供了DBOutputFormat和
DBInputFormat這兩個類,來進行與資料庫交互,除此之外,我們還需要定義一個類似JAVA
Bean的實體類,來與資料庫的每行記錄進行對應,通常這個類要實現Writable和DBWritable介面,來重寫裡面的4個方法以對應獲取每行記