Win7中使用Eclipse連線虛擬機器中的Ubuntu中的Hadoop2.4
- 經過前幾天的學習,基本上可以小試牛刀編寫一些小程式玩一玩了,在此之前做幾項準備工作
- 明確我要用hadoop幹什麼
- 大體學習一下mapreduce
- ubuntu重啟後,再啟動hadoop會報連線異常的問題
- 答:
- 資料提煉、探索資料、挖掘資料
- map=切碎,reduce=合併
- 重啟後會清空tmp資料夾,預設namenode會存在這裡,需要在core-site.xml檔案中增加(別忘了建立資料夾,沒許可權的話,需要用root建立並把許可權改成777):
<property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> </property>
- 大資料,我的第一反應是現有關係型資料庫中的資料怎麼跟hadoop結合使用,網上搜了一些資料,使用的是DBInputFormat,那就簡單編寫一個從資料庫讀取資料,然後經過處理後,生成檔案的小例子吧
- 資料庫弄的簡單一點吧,id是數值整型、test是字串型,需求很簡單,統計TEST欄位出現的數量
- 資料讀取類:
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.Writable;
import org.apache.hadoop.mapreduce.lib.db.DBWritable;
public class DBRecoder implements Writable, DBWritable{
String test;
int id;
@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(test);
out.writeInt(id);
}
@Override
public void readFields(DataInput in) throws IOException {
test = in.readUTF();
id = in.readInt();
}
@Override
public void readFields(ResultSet arg0) throws SQLException {
test = arg0.getString("test");
id = arg0.getInt("id");
}
@Override
public void write(PreparedStatement arg0) throws SQLException {
arg0.setString(1, test);
arg0.setInt(2, id);
}
}
- mapreduce操作類
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.db.DBConfiguration;
import org.apache.hadoop.mapreduce.lib.db.DBInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class DataCountTest {
public static class TokenizerMapper extends Mapper<LongWritable, DBRecoder, Text, IntWritable> {
public void map(LongWritable key, DBRecoder value, Context context) throws IOException, InterruptedException {
context.write(new Text(value.test), new IntWritable(1));
}
}
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
args = new String[1];
args[0] = "hdfs://192.168.203.137:9000/user/chenph/output1111221";
Configuration conf = new Configuration();
DBConfiguration.configureDB(conf, "oracle.jdbc.driver.OracleDriver",
"jdbc:oracle:thin:@192.168.101.179:1521:orcl", "chenph", "chenph");
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
Job job = new Job(conf, "DB count");
job.setJarByClass(DataCountTest.class);
job.setMapperClass(TokenizerMapper.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
String[] fields1 = { "id", "test"};
DBInputFormat.setInput(job, DBRecoder.class, "t1", null, "id", fields1);
FileOutputFormat.setOutputPath(job, new Path(otherArgs[0]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
--------------------------------------------------------------------------------------------------開發過程中遇到的問題:
- Job被標記為已作廢,那應該用什麼我還沒有查到
- 亂碼問題,hadoop預設是utf8格式的,如果讀取的是gbk的需要進行處理
- 這類例子網上挺少的,有也是老版的,新版的資料沒有,我完全是拼湊出來的,很多地方還不甚瞭解,需要進一步學習官方資料
- 搜尋資料時,有資料說不建議採用這種方式處理實際的大資料問題,原因就是併發過高,會瞬間秒殺掉資料庫,一般都會採用導成文字檔案的形式
相關文章
- Mac 終端使用連線 本地虛擬機器中的 LinuxMac虛擬機Linux
- vmware中ubuntu虛擬機器擴容Ubuntu虛擬機
- Windows10中安裝了ubuntu虛擬機器後xshell無法連線到ubuntuWindowsUbuntu虛擬機
- 虛擬機器Ubuntu設定ssh連線虛擬機Ubuntu
- 將VMware workstation中的Ubuntu虛擬機器遷移到ESXI7.0伺服器中Ubuntu虛擬機伺服器
- PD虛擬機器教程:如何在PD虛擬機器中設定連線隨身碟時直接連線到mac?虛擬機Mac
- VMWARE虛擬機器的Ubuntu通過橋接方式連線主機虛擬機Ubuntu橋接
- 環境維護(二):虛擬機器中安裝win7虛擬機Win7
- xftp連線虛擬機器中的linux(centos7)ifconfig命令找不到ip地址FTP虛擬機LinuxCentOS
- eclipse遠端連線虛擬機器Linux上hadoop2.7.7報錯Eclipse虛擬機LinuxHadoop
- xshell能ping通虛擬機器,不能連線虛擬機器虛擬機
- 虛擬機器與宿主機的網路連線虛擬機
- Finalshell 連線本地虛擬機器上的 ManjaroLinux虛擬機JARLinux
- Ubuntu虛擬機器進入虛擬環境的流程Ubuntu虛擬機
- Eclipse中Git的使用EclipseGit
- Vmware虛擬機器連線外網虛擬機
- 虛擬機器連線xshell失敗虛擬機
- 在虛擬機器中安裝ftp虛擬機FTP
- 如何在 Cockpit 中管理虛擬機器KPI虛擬機
- 在vmare中建立centos虛擬機器CentOS虛擬機
- xshell怎麼連線linux虛擬機器 xshell連結linux虛擬機器ssh命令Linux虛擬機
- 虛擬主機使用中可能出現的問題
- VMware - 虛擬機器系統中無法使用鍵盤虛擬機
- VirtualBox 中增加現有虛擬機器的磁碟大小的方法虛擬機
- ubuntu虛擬機器安裝Ubuntu虛擬機
- CentOS 7 虛擬機器連線網路CentOS虛擬機
- VMware虛擬機器---Ubuntu無法連線網路該怎麼解決?虛擬機Ubuntu
- 在虛擬機器CentOS中安裝docker虛擬機CentOSDocker
- 解決本地連線不上虛擬機器和虛擬機器ping不同外網的問題虛擬機
- 在Ubuntu 19.10中使用mongoose來連線mongoDBUbuntuMongoDB
- 技術界中的虛擬機器、容器和沙箱的關係虛擬機
- VMware虛擬機器下網路連線的三種模式虛擬機模式
- vmware解除安裝不乾淨,重灌不了問題;裝了虛擬機器上不了網問題;裝了虛擬機器發現windows在cmd中ping不了虛擬機器,虛擬機器能ping的了windows;secureCRT或者filezilla連線虛擬機WindowsSecurecrt
- ubuntu虛擬機器設定靜態ip(windows能夠ping通ubuntu虛擬機器)Ubuntu虛擬機Windows
- ubuntu 2204 虛擬機器的新安裝之後Ubuntu虛擬機
- Linux系統中5款好用的虛擬機器軟體!Linux虛擬機
- Java 虛擬機器中的執行時資料區分析Java虛擬機
- 【虛擬機器】Windows(x86)上部署ARM虛擬機器(Ubuntu)虛擬機WindowsUbuntu
- 【Linux】遠端連線Linux虛擬機器(MobaXterm)Linux虛擬機