硬皮病 系统性硬皮病 药流 无痛人流 杭州同济医院 乙肝 肝炎 肝病医院 大三阳 小三阳 谷丙转氨酶 谷丙转氨酶偏高 肝硬化 脂肪肝 肝功能异常 肝病 乙肝 杭州同济医院 无痛人流 乙肝
web钃濊崏鍗氬–LanCao’s Web Blog - 鍧氭寔鍘熷垱锝 web寮鍙戞妧鏈丼EO銆佺敓娲诲皬璁般佹梾娓哥瓑淇℃伅鐨勫崥瀹

Latest Entries »

Hadoop鍩烘湰娴佺▼

涓涓浘鐗囧お澶т簡锛屽彧濂藉垎鍓叉垚涓轰袱閮ㄥ垎銆傛牴鎹祦绋嬪浘鏉ヨ涓涓嬪叿浣撲竴涓换鍔℃墽琛岀殑鎯呭喌銆

  1. 鍦ㄥ垎甯冨紡鐜涓鎴风鍒涘缓浠诲姟骞舵彁浜ゃ
  2. InputFormat鍋歁ap鍓嶇殑棰勫鐞嗭紝涓昏璐熻矗浠ヤ笅宸ヤ綔锛
    1. 楠岃瘉杈撳叆鐨勬牸寮忔槸鍚︾鍚圝obConfig鐨勮緭鍏ュ畾涔夛紝杩欎釜鍦ㄥ疄鐜癕ap鍜屾瀯寤篊onf鐨勬椂鍊欏氨浼氱煡閬擄紝涓嶅畾涔夊彲浠ユ槸Writable鐨勪换鎰忓瓙绫汇
    2. 灏唅nput鐨勬枃浠跺垏鍒嗕负閫昏緫涓婄殑杈撳叆InputSplit锛屽叾瀹炶繖灏辨槸鍦ㄤ笂闈㈡彁鍒扮殑鍦ㄥ垎甯冨紡鏂囦欢绯荤粺涓璪locksize鏄湁澶у皬闄愬埗鐨勶紝鍥犳澶ф枃浠朵細琚垝鍒嗕负澶氫釜block銆
    3. 閫氳繃RecordReader鏉ュ啀娆″鐞唅nputsplit涓轰竴缁剅ecords锛岃緭鍑虹粰Map銆傦紙inputsplit鍙槸閫昏緫鍒囧垎鐨勭涓姝ワ紝浣嗘槸濡備綍鏍规嵁鏂囦欢涓殑淇℃伅鏉ュ垏鍒嗚繕闇瑕丷ecordReader鏉ュ疄鐜帮紝渚嬪鏈绠鍗曠殑榛樿鏂瑰紡灏辨槸鍥炶溅鎹㈣鐨勫垏鍒嗭級
  3. RecordReader澶勭悊鍚庣殑缁撴灉浣滀负Map鐨勮緭鍏ワ紝Map鎵ц瀹氫箟鐨凪ap閫昏緫锛岃緭鍑哄鐞嗗悗鐨刱ey鍜寁alue瀵瑰簲鍒颁复鏃朵腑闂存枃浠躲
  4. Combiner鍙夋嫨閰嶇疆锛屼富瑕佷綔鐢ㄦ槸鍦ㄦ瘡涓涓狹ap鎵ц瀹屽垎鏋愪互鍚庯紝鍦ㄦ湰鍦颁紭鍏堜綔Reduce鐨勫伐浣滐紝鍑忓皯鍦≧educe杩囩▼涓殑鏁版嵁浼犺緭閲忋
  5. Partitioner鍙夋嫨閰嶇疆锛屼富瑕佷綔鐢ㄦ槸鍦ㄥ涓猂educe鐨勬儏鍐典笅锛屾寚瀹歁ap鐨勭粨鏋滅敱鏌愪竴涓猂educe澶勭悊锛屾瘡涓涓猂educe閮戒細鏈夊崟鐙殑杈撳嚭鏂囦欢銆傦紙鍚庨潰鐨勪唬鐮佸疄渚嬩腑鏈変粙缁嶄娇鐢ㄥ満鏅級
  6. Reduce鎵ц鍏蜂綋鐨勪笟鍔¢昏緫锛屽苟涓斿皢澶勭悊缁撴灉杈撳嚭缁橭utputFormat銆
  7. OutputFormat鐨勮亴璐f槸锛岄獙璇佽緭鍑虹洰褰曟槸鍚﹀凡缁忓瓨鍦紝鍚屾椂楠岃瘉杈撳嚭缁撴灉绫诲瀷鏄惁濡侰onfig涓厤缃紝鏈鍚庤緭鍑篟educe姹囨诲悗鐨勭粨鏋溿

涓氬姟鍦烘櫙鍜屼唬鐮佽寖渚

涓氬姟鍦烘櫙鎻忚堪锛鍙瀹氳緭鍏ュ拰杈撳嚭璺緞锛堟搷浣滅郴缁熺殑璺緞闈濰DFS璺緞锛夛紝鏍规嵁璁块棶鏃ュ織鍒嗘瀽鏌愪竴涓簲鐢ㄨ闂煇涓涓狝PI鐨勬绘鏁板拰鎬绘祦閲忥紝缁熻鍚庡垎鍒緭鍑哄埌涓や釜鏂囦欢涓傝繖閲屼粎浠呬负浜嗘祴璇曪紝娌℃湁鍘荤粏鍒嗗緢澶氱被锛屽皢鎵鏈夌殑绫婚兘褰掑苟浜庝竴涓被渚夸簬璇存槑闂銆


娴嬭瘯浠g爜绫诲浘

LogAnalysiser灏辨槸涓荤被锛屼富瑕佽礋璐e垱寤恒佹彁浜や换鍔★紝骞朵笖杈撳嚭閮ㄥ垎淇℃伅銆傚唴閮ㄧ殑鍑犱釜瀛愮被鐢ㄩ斿彲浠ュ弬鐪嬫祦绋嬩腑鎻愬埌鐨勮鑹茶亴璐c傚叿浣撳湴鐪嬬湅鍑犱釜绫诲拰鏂规硶鐨勪唬鐮佺墖鏂細

LogAnalysiser::MapClass

聽聽聽 public static class MapClass extends MapReduceBase
聽聽聽 聽聽聽 implements Mapper<LongWritable, Text, Text, LongWritable>
聽聽聽 {
聽聽聽 聽聽聽 public void map(LongWritable key, Text value, OutputCollector<Text, LongWritable> output, Reporter reporter)
聽聽聽 聽聽聽 聽聽聽 聽聽聽 throws IOException
聽聽聽 聽聽聽 {聽聽聽
聽聽聽 聽聽聽 聽聽聽 String line = value.toString();//娌℃湁閰嶇疆RecordReader锛屾墍浠ラ粯璁ら噰鐢╨ine鐨勫疄鐜帮紝key灏辨槸琛屽彿锛寁alue灏辨槸琛屽唴瀹
聽聽聽 聽聽聽 聽聽聽 if (line == null || line.equals(""))
聽聽聽 聽聽聽 聽聽聽 聽聽聽 return;
聽聽聽 聽聽聽 聽聽聽 String[] words = line.split(",");
聽聽聽 聽聽聽 聽聽聽 if (words == null || words.length < 8)
聽聽聽 聽聽聽 聽聽聽 聽聽聽 return;
聽聽聽 聽聽聽 聽聽聽 String appid = words[1];
聽聽聽 聽聽聽 聽聽聽 String apiName = words[2];
聽聽聽 聽聽聽 聽聽聽 LongWritable recbytes = new LongWritable(Long.parseLong(words[7]));
聽聽聽 聽聽聽 聽聽聽 Text record = new Text();
聽聽聽 聽聽聽 聽聽聽 record.set(new StringBuffer("flow::").append(appid)
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 .append("::").append(apiName).toString());
聽聽聽 聽聽聽 聽聽聽 reporter.progress();
聽聽聽 聽聽聽 聽聽聽 output.collect(record, recbytes);//杈撳嚭娴侀噺鐨勭粺璁$粨鏋滐紝閫氳繃flow::浣滀负鍓嶇紑鏉ユ爣绀恒
聽聽聽 聽聽聽 聽聽聽 record.clear();
聽聽聽 聽聽聽 聽聽聽 record.set(new StringBuffer("count::").append(appid).append("::").append(apiName).toString());
聽聽聽 聽聽聽 聽聽聽 output.collect(record, new LongWritable(1));//杈撳嚭娆℃暟鐨勭粺璁$粨鏋滐紝閫氳繃count::浣滀负鍓嶇紑鏉ユ爣绀
聽聽聽 聽聽聽 }聽聽聽
聽聽聽 }

LogAnalysiser:: PartitionerClass

聽聽聽 public static class PartitionerClass implements Partitioner<Text, LongWritable>
聽聽聽 {
聽聽聽 聽聽聽 public int getPartition(Text key, LongWritable value, int numPartitions)
聽聽聽 聽聽聽 {
聽聽聽 聽聽聽 聽聽聽 if (numPartitions >= 2)//Reduce 涓暟锛屽垽鏂祦閲忚繕鏄鏁扮殑缁熻鍒嗛厤鍒颁笉鍚岀殑Reduce
聽聽聽 聽聽聽 聽聽聽 聽聽聽 if (key.toString().startsWith("flow::"))
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 return 0;
聽聽聽 聽聽聽 聽聽聽 聽聽聽 else
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 return 1;
聽聽聽 聽聽聽 聽聽聽 else
聽聽聽 聽聽聽 聽聽聽 聽聽聽 return 0;
聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 public void configure(JobConf job){}聽聽聽
}

LogAnalysiser:: CombinerClass

鍙傜湅ReduceClass锛岄氬父涓よ呭彲浠ヤ娇鐢ㄤ竴涓紝涓嶈繃杩欓噷鏈変簺涓嶅悓鐨勫鐞嗗氨鍒嗘垚浜嗕袱涓傚湪ReduceClass涓摑鑹茬殑琛岃〃绀哄湪CombinerClass涓笉瀛樺湪銆

LogAnalysiser:: ReduceClass

聽聽聽 public static class ReduceClass extends MapReduceBase
聽聽聽 聽聽聽 implements Reducer<Text, LongWritable,Text, LongWritable>
聽聽聽 {
聽聽聽 聽聽聽 public void reduce(Text key, Iterator<LongWritable> values,
聽聽聽 聽聽聽 聽聽聽 聽聽聽 OutputCollector<Text, LongWritable> output, Reporter reporter)throws IOException
聽聽聽 聽聽聽 {
聽聽聽 聽聽聽 聽聽聽 Text newkey = new Text();
聽聽聽 聽聽聽 聽聽聽 newkey.set(key.toString().substring(key.toString().indexOf("::")+2));
聽聽聽 聽聽聽 聽聽聽 LongWritable result = new LongWritable();
聽聽聽 聽聽聽 聽聽聽 long tmp = 0;
聽聽聽 聽聽聽 聽聽聽 int counter = 0;
聽聽聽 聽聽聽 聽聽聽 while(values.hasNext())//绱姞鍚屼竴涓猭ey鐨勭粺璁$粨鏋
聽聽聽 聽聽聽 聽聽聽 {
聽聽聽 聽聽聽 聽聽聽 聽聽聽 tmp = tmp + values.next().get();
聽聽聽 聽聽聽 聽聽聽 聽聽聽
聽聽聽 聽聽聽 聽聽聽 聽聽聽 counter = counter +1;//鎷呭績澶勭悊澶箙锛孞obTracker闀挎椂闂存病鏈夋敹鍒版姤鍛婁細璁や负TaskTracker宸茬粡澶辨晥锛屽洜姝ゅ畾鏃舵姤鍛婁竴涓
聽聽聽 聽聽聽 聽聽聽 聽聽聽 if (counter == 1000)
聽聽聽 聽聽聽 聽聽聽 聽聽聽 {
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 counter = 0;
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 reporter.progress();
聽聽聽 聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽 result.set(tmp);
聽聽聽 聽聽聽 聽聽聽 output.collect(newkey, result);//杈撳嚭鏈鍚庣殑姹囨荤粨鏋
聽聽聽 聽聽聽 }聽聽聽
聽聽聽 }

LogAnalysiser

	public static void main(String[] args)
	{
		try
		{
			run(args);
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}
	public static void run(String[] args) throws Exception
	{
		if (args == null || args.length <2)
		{
			System.out.println("need inputpath and outputpath");
			return;
		}
		String inputpath = args[0];
		String outputpath = args[1];
		String shortin = args[0];
		String shortout = args[1];
		if (shortin.indexOf(File.separator) >= 0)
			shortin = shortin.substring(shortin.lastIndexOf(File.separator));
		if (shortout.indexOf(File.separator) >= 0)
			shortout = shortout.substring(shortout.lastIndexOf(File.separator));
		SimpleDateFormat formater = new SimpleDateFormat("yyyy.MM.dd");
		shortout = new StringBuffer(shortout).append("-")
			.append(formater.format(new Date())).toString();

		if (!shortin.startsWith("/"))
			shortin = "/" + shortin;
		if (!shortout.startsWith("/"))
			shortout = "/" + shortout;
		shortin = "/user/root" + shortin;
		shortout = "/user/root" + shortout;
		File inputdir = new File(inputpath);
		File outputdir = new File(outputpath);
		if (!inputdir.exists() || !inputdir.isDirectory())
		{
			System.out.println("inputpath not exist or isn't dir!");
			return;
		}
		if (!outputdir.exists())
		{
			new File(outputpath).mkdirs();
		}

		JobConf conf = new JobConf(new Configuration(),LogAnalysiser.class);//鏋勫缓Config
		FileSystem fileSys = FileSystem.get(conf);
		fileSys.copyFromLocalFile(new Path(inputpath), new Path(shortin));//灏嗘湰鍦版枃浠剁郴缁熺殑鏂囦欢鎷疯礉鍒癏DFS涓

		conf.setJobName("analysisjob");
		conf.setOutputKeyClass(Text.class);//杈撳嚭鐨刱ey绫诲瀷锛屽湪OutputFormat浼氭鏌
		conf.setOutputValueClass(LongWritable.class); //杈撳嚭鐨剉alue绫诲瀷锛屽湪OutputFormat浼氭鏌
		conf.setMapperClass(MapClass.class);
		conf.setCombinerClass(CombinerClass.class);
		conf.setReducerClass(ReduceClass.class);
		conf.setPartitionerClass(PartitionerClass.class);
		conf.set("mapred.reduce.tasks", "2");//寮哄埗闇瑕佹湁涓や釜Reduce鏉ュ垎鍒鐞嗘祦閲忓拰娆℃暟鐨勭粺璁
		FileInputFormat.setInputPaths(conf, shortin);//hdfs涓殑杈撳叆璺緞
		FileOutputFormat.setOutputPath(conf, new Path(shortout));//hdfs涓緭鍑鸿矾寰

		Date startTime = new Date();
	    	System.out.println("Job started: " + startTime);
	    	JobClient.runJob(conf);
	    	Date end_time = new Date();
	    	System.out.println("Job ended: " + end_time);
	    	System.out.println("The job took " + (end_time.getTime() - startTime.getTime()) /1000 + " seconds.");
	    	//鍒犻櫎杈撳叆鍜岃緭鍑虹殑涓存椂鏂囦欢
		fileSys.copyToLocalFile(new Path(shortout),new Path(outputpath));
		fileSys.delete(new Path(shortin),true);
		fileSys.delete(new Path(shortout),true);
	}

浠ヤ笂鐨勪唬鐮佸氨瀹屾垚浜嗘墍鏈夌殑閫昏緫鎬т唬鐮侊紝鐒跺悗杩橀渶瑕佷竴涓敞鍐岄┍鍔ㄧ被鏉ユ敞鍐屼笟鍔lass涓轰竴涓彲鏍囩ず鐨勫懡浠わ紝璁﹉adoop jar鍙互鎵ц銆

public class ExampleDriver {
聽 public static void main(String argv[]){
聽聽聽 ProgramDriver pgd = new ProgramDriver();
聽聽聽 try {
聽聽聽聽聽 pgd.addClass("analysislog", LogAnalysiser.class, "A map/reduce program that analysis log .");
聽聽聽聽聽 pgd.driver(argv);
聽聽聽 }
聽聽聽 catch(Throwable e){
聽聽聽聽聽 e.printStackTrace();
聽聽聽 }
聽 }
}

灏嗕唬鐮佹墦鎴恓ar锛屽苟涓旇缃甹ar鐨刴ainClass涓篍xampleDriver杩欎釜绫汇傚湪鍒嗗竷寮忕幆澧冨惎鍔ㄤ互鍚庢墽琛屽涓嬭鍙ワ細

hadoop jar analysiser.jar analysislog /home/wenchu/test-in /home/wenchu/test-out

鍦/home/wenchu/test-in涓槸闇瑕佸垎鏋愮殑鏃ュ織鏂囦欢锛屾墽琛屽悗灏变細鐪嬭鏁翠釜鎵ц杩囩▼锛屽寘鎷簡Map鍜孯educe鐨勮繘搴︺傛墽琛屽畬姣曚細鍦/home/wenchu/test-out涓嬬湅鍒拌緭鍑虹殑鍐呭銆傛湁涓や釜鏂囦欢锛歱art-00000鍜宲art-00001鍒嗗埆璁板綍浜嗙粺璁″悗鐨勭粨鏋溿 濡傛灉闇瑕佺湅鎵ц鐨勫叿浣撴儏鍐碉紝鍙互鐪嬪湪杈撳嚭鐩綍涓嬬殑_logs/history/xxxx_analysisjob锛岄噷闈㈢綏鍒椾簡鎵鏈夌殑Map锛孯educe鐨勫垱寤烘儏鍐典互鍙婃墽琛屾儏鍐点傚湪杩愯鏈熶篃鍙互閫氳繃娴忚鍣ㄦ潵鏌ョ湅Map,Reduce鐨勬儏鍐碉細http://MasterIP:50030/jobtracker.jsp

Hadoop闆嗙兢娴嬭瘯

棣栧厛杩欓噷浣跨敤涓婇潰鐨勮寖渚嬩綔涓烘祴璇曪紝涔熸病鏈夊仛澶鐨勪紭鍖栭厤缃紝杩欎釜娴嬭瘯缁撴灉鍙槸涓轰簡鐪嬬湅闆嗙兢鐨勬晥鏋滐紝浠ュ強涓浜涘弬鏁伴厤缃殑褰卞搷銆

鏂囦欢澶嶅埗鏁颁负1锛宐locksize 5M

Slave鏁 澶勭悊璁板綍鏁(涓囨潯) 鎵ц鏃堕棿锛堢锛
2 95 38
2 950 337
4 95 24
4 950 178
6 95 21
6 950 114

Blocksize 5M

Slave鏁 澶勭悊璁板綍鏁(涓囨潯) 鎵ц鏃堕棿锛堢锛
2锛堟枃浠跺鍒舵暟涓1锛 950 337
2锛堟枃浠跺鍒舵暟涓3锛 950 339
6锛堟枃浠跺鍒舵暟涓1锛 950 114
6锛堟枃浠跺鍒舵暟涓3锛 950 117

鏂囦欢澶嶅埗鏁颁负1

Slave鏁 澶勭悊璁板綍鏁(涓囨潯) 鎵ц鏃堕棿锛堢锛
6(blocksize 5M) 95 21
6(blocksize 77M) 95 26
4(blocksize 5M) 950 178
4(blocksize 50M) 950 54
6(blocksize 5M) 950 114
6(blocksize 50M) 950 44
6(blocksize 77M) 950 74

娴嬭瘯鐨勬暟鎹粨鏋滃緢绋冲畾锛屽熀鏈祴鍑犳鍚屾牱鏉′欢涓嬮兘鏄竴鏍枫傞氳繃娴嬭瘯缁撴灉鍙互鐪嬪嚭浠ヤ笅鍑犵偣锛

  1. 鏈哄櫒鏁板浜庢ц兘杩樻槸鏈夊府鍔╃殑锛堢瓑浜庢病璇碸_^锛夈
  2. 鏂囦欢澶嶅埗鏁扮殑澧炲姞鍙瀹夊叏鎬ф湁甯姪锛屼絾鏄浜庢ц兘娌℃湁澶甯姪銆傝屼笖鐜板湪閲囧彇鐨勬槸灏嗘搷浣滅郴缁熸枃浠舵嫹璐濆埌HDFS涓紝鎵浠ュ浠藉浜嗭紝鍑嗗鐨勬椂闂村緢闀裤
  3. blocksize瀵逛簬鎬ц兘褰卞搷寰堝ぇ锛岄鍏堝鏋滃皢block鍒掑垎鐨勫お灏忥紝閭d箞灏嗕細澧炲姞job鐨勬暟閲忥紝鍚屾椂涔熷鍔犱簡鍗忎綔鐨勪唬浠凤紝闄嶄綆浜嗘ц兘锛屼絾鏄厤缃殑澶ぇ涔熶細璁﹋ob涓嶈兘鏈澶у寲骞惰澶勭悊銆傛墍浠ヨ繖涓肩殑閰嶇疆闇瑕佹牴鎹暟鎹鐞嗙殑閲忔潵鑰冭檻銆
  4. 鏈鍚庡氨鏄櫎浜嗚繖涓〃閲岄潰鍒楀嚭鏉ョ殑缁撴灉锛屽簲璇ュ幓浠旂粏鐪嬭緭鍑虹洰褰曚腑鐨刜logs/history涓殑xxx_analysisjob杩欎釜鏂囦欢锛岄噷闈㈣褰曚簡鍏ㄩ儴鐨勬墽琛岃繃绋嬩互鍙婅鍐欐儏鍐点傝繖涓彲浠ユ洿鍔犳竻妤氬湴浜嗚В鍝噷鍙兘浼氭洿鍔犺楁椂銆

闅忔兂

鈥滀簯璁$畻鈥濈儹鐨勭儷鎵嬶紝灏卞拰SAAS銆乄eb2鍙奡NS绛変竴鏍凤紝寰寰閮芥槸鍦ㄦ悶姒傚康锛屽彧鏈夌湡姝h笍韪忓疄瀹炵殑澶у瀷浜掕仈缃戝叕鍙革紝鎵嶄細鎶曞叆浜哄姏鐗╁姏鍘荤爺绌剁鍚堣嚜宸辩殑鍒嗗竷寮忚绠椼傚叾瀹炲綋浣犵殑鏁版嵁閲忔病鏈夐偅涔堝ぇ鐨勬椂鍊欙紝杩欑鍒嗗竷寮忚绠椾篃灏变粎浠呭彧鏄竴涓帺鍏疯屽凡锛屽彧鏈夊湪鐪熸瑙e喅闂鐨勮繃绋嬩腑锛屽畠娣卞眰娆$殑闂鎵嶄細琚寲鎺樺嚭鏉ャ

杩欎笁绡囨枃绔狅紙鍒嗗竷寮忚绠楀紑婧愭鏋禜adoop浠嬬粛锛孒adoop涓殑闆嗙兢閰嶇疆鍜屼娇鐢ㄦ妧宸э級浠呬粎鏄负浜嗙粰瀵瑰垎甯冨紡璁$畻鏈夊叴瓒g殑鏈嬪弸鎶涗釜鐮栵紝瑕佹兂鐪熺殑鎺樺埌閲戝瓙锛岄偅涔堝氨韪忚笍瀹炲疄鐨勫幓鐢ㄣ佸幓鎯炽佸幓鍒嗘瀽銆傛垨鑰呰嚜宸变篃浼氭洿杩涗竴姝ュ湴鍘荤爺绌舵鏋朵腑鐨勫疄鐜版満鍒讹紝鍦ㄨВ鍐宠嚜宸遍棶棰樼殑鍚屾椂锛屼篃鑳藉璐$尞涓浜涗粈涔堛

鍓嶅嚑鏃ョ湅鍒版湁浜鸿藩姹傛垚涓烘灦鏋勫笀鐨勬柟寮忥紝鐪嬩簡鏈変簺鍙偛锛屾湁浜涘彲绗戯紝鍏跺疄鏈夊灏戞灦鏋勫笀鐭ラ亾浠涔堝彨鍋氭灦鏋勶紵鏋舵瀯甯堢殑鑱岃矗鏄粈涔堬紵涓庡叾杩芥眰杩欎箞涓涓悕鍙凤紝杩樹笉濡傝笍韪忓疄瀹炲湴鍋氬潡鐭冲ご娌夊埌姘村簳銆傝鐭ラ亾锛岀Н绱拰娌夋穩鐨勮繃绋嬪氨鏄竴绉嶆垚闀裤

鍏跺疄鍙傜湅Hadoop瀹樻柟鏂囨。宸茬粡鑳藉寰堝鏄撻厤缃垎甯冨紡妗嗘灦杩愯鐜浜嗭紝涓嶈繃杩欓噷鏃㈢劧鍐欎簡灏卞啀澶氬啓涓鐐癸紝鍚屾椂鏈変竴浜涚粏鑺傞渶瑕佹敞鎰忕殑涔熻鏄庝竴涓嬶紝鍏跺疄涔熷氨鏄繖浜涚粏鑺備細璁╀汉鎽哥储鍗婂ぉ銆侶adoop鍙互鍗曟満璺戯紝涔熷彲浠ラ厤缃泦缇よ窇锛屽崟鏈鸿窇灏变笉闇瑕佸璇翠簡锛屽彧闇瑕佹寜鐓emo鐨勮繍琛岃鏄庣洿鎺ユ墽琛屽懡浠ゅ嵆鍙傝繖閲屼富瑕侀噸鐐硅涓涓嬮泦缇ら厤缃繍琛岀殑杩囩▼銆

鐜

7鍙版櫘閫氱殑鏈哄櫒锛屾搷浣滅郴缁熼兘鏄疞inux銆傚唴瀛樺拰CPU灏变笉璇翠簡锛屽弽姝adoop涓澶х壒鐐瑰氨鏄満鍣ㄥ湪澶氫笉鍦ㄧ簿銆侸DK蹇呴』鏄1.5浠ヤ笂鐨勶紝杩欎釜鍒囪銆7鍙版満鍣ㄧ殑鏈哄櫒鍚嶅姟蹇呬笉鍚岋紝鍚庣画浼氳皥鍒版満鍣ㄥ悕瀵逛簬MapReduce鏈夊緢澶х殑褰卞搷銆

閮ㄧ讲鑰冭檻

姝e涓婇潰鎴戞弿杩扮殑锛屽浜嶩adoop鐨勯泦缇ゆ潵璇达紝鍙互鍒嗘垚涓ゅぇ绫昏鑹诧細Master鍜孲lave锛屽墠鑰呬富瑕侀厤缃甆ameNode鍜孞obTracker鐨勮鑹诧紝璐熻矗鎬荤鍒嗗竷寮忔暟鎹拰鍒嗚В浠诲姟鐨勬墽琛岋紝鍚庤呴厤缃瓺ataNode鍜孴askTracker鐨勮鑹诧紝璐熻矗鍒嗗竷寮忔暟鎹瓨鍌ㄤ互鍙婁换鍔$殑鎵ц銆傛湰鏉ユ垜鎵撶畻鐪嬬湅涓鍙版満鍣ㄦ槸鍚﹀彲浠ラ厤缃垚Master锛屽悓鏃朵篃浣滀负Slave浣跨敤锛屼笉杩囧彂鐜板湪NameNode鍒濆鍖栫殑杩囩▼涓互鍙奣askTracker鎵ц杩囩▼涓満鍣ㄥ悕閰嶇疆濂藉儚鏈夊啿绐侊紙NameNode鍜孴askTracker瀵逛簬Hosts鐨勯厤缃湁浜涘啿绐侊紝绌剁珶鏄妸鏈哄櫒鍚嶅搴擨P鏀惧湪閰嶇疆鍓嶉潰杩樻槸鎶奓ocalhost瀵瑰簲IP鏀惧湪鍓嶉潰鏈夌偣闂锛屼笉杩囧彲鑳戒篃鏄垜鑷繁鐨勯棶棰樺惂锛岃繖涓ぇ瀹跺彲浠ユ牴鎹疄鏂芥儏鍐电粰鎴戝弽棣堬級銆傛渶鍚庡弽姝e喅瀹氫竴鍙癕aster锛屽叚鍙癝lave锛屽悗缁鏉傜殑搴旂敤寮鍙戝拰娴嬭瘯缁撴灉鐨勬瘮瀵逛細澧炲姞鏈哄櫒閰嶇疆銆

瀹炴柦姝ラ

  1. 鍦ㄦ墍鏈夌殑鏈哄櫒涓婇兘寤虹珛鐩稿悓鐨勭洰褰曪紝涔熷彲浠ュ氨寤虹珛鐩稿悓鐨勭敤鎴凤紝浠ヨ鐢ㄦ埛鐨刪ome璺緞鏉ュ仛hadoop鐨勫畨瑁呰矾寰勩備緥濡傛垜鍦ㄦ墍鏈夌殑鏈哄櫒涓婇兘寤虹珛浜/home/wenchu
  2. 涓嬭浇Hadoop锛屽厛瑙e帇鍒癕aster涓娿傝繖閲屾垜鏄笅杞界殑0.17.1鐨勭増鏈傛鏃禜adoop鐨勫畨瑁呰矾寰勫氨鏄/home/wenchu/hadoop-0.17.1
  3. 瑙e帇鍚庤繘鍏onf鐩綍锛屼富瑕侀渶瑕佷慨鏀逛互涓嬫枃浠讹細hadoop-env.shhadoop-site.xmlmastersslaves銆侶adoop鐨勫熀纭閰嶇疆鏂囦欢鏄hadoop-default.xml锛岀湅Hadoop鐨勪唬鐮佸彲浠ョ煡閬擄紝榛樿寤虹珛涓涓狫ob鐨勬椂鍊欎細寤虹珛Job鐨凜onfig锛孋onfig棣栧厛璇诲叆hadoop-default.xml鐨勯厤缃紝鐒跺悗鍐嶈鍏hadoop-site.xml鐨勯厤缃紙杩欎釜鏂囦欢鍒濆鐨勬椂鍊欓厤缃负绌猴級锛hadoop-site.xml涓富瑕侀厤缃綘闇瑕佽鐩栫殑hadoop-default.xml鐨勭郴缁熺骇閰嶇疆锛屼互鍙婁綘闇瑕佸湪浣犵殑MapReduce杩囩▼涓娇鐢ㄧ殑鑷畾涔夐厤缃紙鍏蜂綋鐨勪竴浜涗娇鐢ㄤ緥濡俧inal绛夊弬鑰冩枃妗o級銆

    浠ヤ笅鏄竴涓畝鍗曠殑hadoop-site.xml鐨勯厤缃細

    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <!-- Put site-specific property overrides in this file. -->
    <configuration>
    <property>
    聽聽 <name>fs.default.name</name>//浣犵殑namenode鐨勯厤缃紝鏈哄櫒鍚嶅姞绔彛
    聽聽 <value>hdfs://10.2.224.46:54310/</value>
    </property>
    <property>
    聽聽 <name>mapred.job.tracker</name>//浣犵殑JobTracker鐨勯厤缃紝鏈哄櫒鍚嶅姞绔彛
    聽聽 <value>hdfs://10.2.224.46:54311/</value>
    </property>
    <property>
    聽聽 <name>dfs.replication</name>//鏁版嵁闇瑕佸浠界殑鏁伴噺锛岄粯璁ゆ槸涓
    聽聽 <value>1</value>
    </property>
    <property>
    聽聽聽 <name>hadoop.tmp.dir</name>//Hadoop鐨勯粯璁や复鏃惰矾寰勶紝杩欎釜鏈濂介厤缃紝濡傛灉鍦ㄦ柊澧炶妭鐐规垨鑰呭叾浠栨儏鍐典笅鑾悕鍏跺鐨凞ataNode鍚姩涓嶄簡锛屽氨鍒犻櫎姝ゆ枃浠朵腑鐨則mp鐩綍鍗冲彲銆備笉杩囧鏋滃垹闄や簡NameNode鏈哄櫒鐨勬鐩綍锛岄偅涔堝氨闇瑕侀噸鏂版墽琛孨ameNode鏍煎紡鍖栫殑鍛戒护銆
    聽聽聽 <value>/home/wenchu/hadoop/tmp/</value>
    </property>
    <property>
    聽聽 <name>mapred.child.java.opts</name>//java铏氭嫙鏈虹殑涓浜涘弬鏁板彲浠ュ弬鐓ч厤缃
    聽聽 <value>-Xmx512m</value>
    </property>
    <property>
    聽 <name>dfs.block.size</name>//block鐨勫ぇ灏忥紝鍗曚綅瀛楄妭锛屽悗闈細鎻愬埌鐢ㄥ锛屽繀椤绘槸512鐨勫嶆暟锛屽洜涓洪噰鐢╟rc浣滄枃浠跺畬鏁存ф牎楠岋紝榛樿閰嶇疆512鏄痗hecksum鐨勬渶灏忓崟鍏冦
    聽 <value>5120000</value>
    聽 <description>The default block size for new files.</description>
    </property>
    </configuration>

    hadoop-env.sh鏂囦欢鍙渶瑕佷慨鏀逛竴涓弬鏁帮細

    # The java implementation to use.  Required.
     export JAVA_HOME=/usr/ali/jdk1.5.0_10 

    閰嶇疆浣犵殑Java璺緞锛岃浣忎竴瀹氳1.5鐗堟湰浠ヤ笂锛屽厤寰楄帿鍚嶅叾濡欏嚭鐜伴棶棰樸

    Masters涓厤缃甅asters鐨処P鎴栬呮満鍣ㄥ悕锛屽鏋滄槸鏈哄櫒鍚嶉偅涔堥渶瑕佸湪/etc/hosts涓湁鎵璁剧疆銆係laves涓厤缃殑鏄疭laves鐨処P鎴栬呮満鍣ㄥ悕锛屽悓鏍峰鏋滄槸鏈哄櫒鍚嶉渶瑕佸湪/etc/hosts涓湁鎵璁剧疆銆傝寖渚嬪涓嬶紝鎴戣繖閲岄厤缃殑閮芥槸IP锛

    Masters:
     10.2.224.46
    
      Slaves:
     10.2.226.40
     10.2.226.39
     10.2.226.38
     10.2.226.37
     10.2.226.41
     10.2.224.36
  4. 寤虹珛Master鍒版瘡涓鍙癝lave鐨凷SH鍙椾俊璇佷功銆傜敱浜嶮aster灏嗕細閫氳繃SSH鍚姩鎵鏈塖lave鐨凥adoop锛屾墍浠ラ渶瑕佸缓绔嬪崟鍚戞垨鑰呭弻鍚戣瘉涔︿繚璇佸懡浠ゆ墽琛屾椂涓嶉渶瑕佸啀杈撳叆瀵嗙爜銆傚湪Master鍜屾墍鏈夌殑Slave鏈哄櫒涓婃墽琛岋細ssh-keygen -t rsa銆傛墽琛屾鍛戒护鐨勬椂鍊欙紝鐪嬪埌鎻愮ず鍙渶瑕佸洖杞︺傜劧鍚庡氨浼氬湪/root/.ssh/涓嬮潰浜х敓id_rsa.pub鐨勮瘉涔︽枃浠讹紝閫氳繃scp灏哅aster鏈哄櫒涓婄殑杩欎釜鏂囦欢鎷疯礉鍒癝lave涓婏紙璁板緱淇敼鍚嶇О锛夛紝渚嬪锛scp root@masterIP:/root/.ssh/id_rsa.pub /root/.ssh/46_rsa.pub锛岀劧鍚庢墽琛cat /root/.ssh/46_rsa.pub >>/root/.ssh/authorized_keys锛屽缓绔authorized_keys鏂囦欢鍗冲彲锛屽彲浠ユ墦寮杩欎釜鏂囦欢鐪嬬湅锛屼篃灏辨槸rsa鐨勫叕閽ヤ綔涓簁ey锛寀ser@IP浣滀负value銆傛鏃跺彲浠ヨ瘯楠屼竴涓嬶紝浠巑aster ssh鍒皊lave宸茬粡涓嶉渶瑕佸瘑鐮佷簡銆傜敱slave鍙嶅悜寤虹珛涔熸槸鍚屾牱銆備负浠涔堣鍙嶅悜鍛紵鍏跺疄濡傛灉涓鐩撮兘鏄疢aster鍚姩鍜屽叧闂殑璇濋偅涔堟病鏈夊繀瑕佸缓绔嬪弽鍚戯紝鍙槸濡傛灉鎯冲湪Slave涔熷彲浠ュ叧闂璈adoop灏遍渶瑕佸缓绔嬪弽鍚戙
  5. 灏哅aster涓婄殑Hadoop閫氳繃scp鎷疯礉鍒版瘡涓涓猄lave鐩稿悓鐨勭洰褰曚笅锛屾牴鎹瘡涓涓猄lave鐨Java_HOME鐨勪笉鍚屼慨鏀瑰叾hadoop-env.sh
  6. 淇敼Master涓/etc/profile锛
    鏂板浠ヤ笅鍐呭锛氾紙鍏蜂綋鐨勫唴瀹规牴鎹綘鐨勫畨瑁呰矾寰勪慨鏀癸紝杩欐鍙槸涓轰簡鏂逛究浣跨敤锛

    export HADOOP_HOME=/home/wenchu/hadoop-0.17.1
     export PATH=$PATH:$HADOOP_HOME/bin

    淇敼瀹屾瘯鍚庯紝鎵цsource /etc/profile鏉ヤ娇鍏剁敓鏁堛

  7. 鍦∕aster涓婃墽琛Hadoop namenode 鈥揻ormat锛岃繖鏄涓闇瑕佸仛鐨勫垵濮嬪寲锛屽彲浠ョ湅浣滄牸寮忓寲鍚э紝浠ュ悗闄や簡鍦ㄤ笂闈㈡垜鎻愬埌杩囧垹闄や簡Master涓婄殑hadoop.tmp.dir鐩綍锛屽惁鍒欐槸涓嶉渶瑕佸啀娆℃墽琛岀殑銆
  8. 鐒跺悗鎵цMaster涓婄殑start-all.sh锛岃繖涓懡浠ゅ彲浠ョ洿鎺ユ墽琛岋紝鍥犱负鍦6涓凡缁忔坊鍔犲埌浜唒ath璺緞锛岃繖涓懡浠ゆ槸鍚姩hdfs鍜宮apreduce涓ら儴鍒嗭紝褰撶劧浣犱篃鍙互鍒嗗紑鍗曠嫭鍚姩hdfs鍜宮apreduce锛屽垎鍒槸bin鐩綍涓嬬殑start-dfs.shstart-mapred.sh
  9. 妫鏌aster鐨刲ogs鐩綍锛岀湅鐪婲amenode鏃ュ織浠ュ強JobTracker鏃ュ織鏄惁姝e父鍚姩銆
  10. 妫鏌lave鐨刲ogs鐩綍鐪嬬湅Datanode鏃ュ織浠ュ強TaskTracker鏃ュ織鏄惁姝e父銆
  11. 濡傛灉闇瑕佸叧闂紝閭d箞灏辩洿鎺ユ墽琛stop-all.sh鍗冲彲銆

浠ヤ笂姝ラ灏卞彲浠ュ惎鍔℉adoop鐨勫垎甯冨紡鐜锛岀劧鍚庡湪Master鐨勬満鍣ㄨ繘鍏aster鐨勫畨瑁呯洰褰曪紝鎵цhadoop jar hadoop-0.17.1-examples.jar wordcount杈撳叆璺緞鍜岃緭鍑鸿矾寰勶紝灏卞彲浠ョ湅鍒板瓧鏁扮粺璁$殑鏁堟灉浜嗐傛澶勭殑杈撳叆璺緞鍜岃緭鍑鸿矾寰勯兘鎸囩殑鏄疕DFS涓殑璺緞锛屽洜姝や綘鍙互棣栧厛閫氳繃鎷疯礉鏈湴鏂囦欢绯荤粺涓殑鐩綍鍒癏DFS涓殑鏂瑰紡鏉ュ缓绔婬DFS涓殑杈撳叆璺緞锛

hadoop dfs -copyFromLocal /home/wenchu/test-in test-in銆鍏朵腑/home/wenchu/test-in鏄湰鍦拌矾寰勶紝test-in鏄皢浼氬缓绔嬪湪HDFS涓殑璺緞锛屾墽琛屽畬姣曚互鍚庡彲浠ラ氳繃hadoop dfs 鈥搇s鐪嬪埌test-in鐩綍宸茬粡瀛樺湪锛屽悓鏃跺彲浠ラ氳繃hadoop dfs 鈥搇s test-in鏌ョ湅閲岄潰鐨勫唴瀹广傝緭鍑鸿矾寰勮姹傛槸鍦℉DFS涓笉瀛樺湪鐨勶紝褰撴墽琛屽畬閭d釜demo浠ュ悗锛屽氨鍙互閫氳繃hadoop dfs 鈥搇s聽杈撳嚭璺緞鐪嬪埌鍏朵腑鐨勫唴瀹癸紝鍏蜂綋鏂囦欢鐨勫唴瀹瑰彲浠ラ氳繃hadoop dfs 鈥揷at鏂囦欢鍚嶇О鏉ユ煡鐪嬨

缁忛獙鎬荤粨鍜屾敞鎰忎簨椤癸紙杩欓儴鍒嗘槸鎴戝湪浣跨敤杩囩▼涓姳浜嗕竴浜涙椂闂磋蛋鐨勫集璺級锛

  1. Master鍜孲lave涓婄殑鍑犱釜conf閰嶇疆鏂囦欢涓嶉渶瑕佸叏閮ㄥ悓姝ワ紝濡傛灉纭畾閮芥槸閫氳繃Master鍘诲惎鍔ㄥ拰鍏抽棴锛岄偅涔圫lave鏈哄櫒涓婄殑閰嶇疆涓嶉渶瑕佸幓缁存姢銆備絾濡傛灉甯屾湜鍦ㄤ换鎰忎竴鍙版満鍣ㄩ兘鍙互鍚姩鍜屽叧闂璈adoop锛岄偅涔堝氨闇瑕佸叏閮ㄤ繚鎸佷竴鑷翠簡銆
  2. Master鍜孲lave鏈哄櫒涓婄殑/etc/hosts涓繀椤绘妸闆嗙兢涓満鍣ㄩ兘閰嶇疆涓婂幓锛屽氨绠楀湪鍚勪釜閰嶇疆鏂囦欢涓娇鐢ㄧ殑鏄疘P銆傝繖涓悆杩囦笉灏戣嫤澶达紝鍘熸潵浠ヤ负濡傛灉閰嶆垚IP灏变笉闇瑕佸幓閰嶇疆Host锛岀粨鏋滃彂鐜板湪鎵цReduce鐨勬椂鍊欐绘槸鍗′綇锛屽湪鎷疯礉鐨勬椂鍊欏氨鏃犳硶缁х画涓嬪幓锛屼笉鏂噸璇曘傚彟澶栧鏋滈泦缇や腑濡傛灉鏈変袱鍙版満鍣ㄧ殑鏈哄櫒鍚嶅鏋滈噸澶嶄篃浼氬嚭鐜伴棶棰樸
  3. 濡傛灉鍦ㄦ柊澧炰簡鑺傜偣鎴栬呭垹闄よ妭鐐圭殑鏃跺欏嚭鐜颁簡闂锛岄鍏堝氨鍘诲垹闄lave鐨hadoop.tmp.dir锛岀劧鍚庨噸鏂板惎鍔ㄨ瘯璇曠湅锛屽鏋滆繕鏄笉琛岄偅灏卞共鑴嗘妸Master鐨hadoop.tmp.dir鍒犻櫎锛堟剰鍛崇潃dfs涓婄殑鏁版嵁涔熶細涓㈠け锛夛紝濡傛灉鍒犻櫎浜哅aster鐨hadoop.tmp.dir锛岄偅涔堝氨闇瑕侀噸鏂namenode 鈥揻ormat
  4. Map浠诲姟涓暟浠ュ強Reduce浠诲姟涓暟閰嶇疆銆傚墠闈㈠垎甯冨紡鏂囦欢绯荤粺璁捐鎻愬埌涓涓枃浠惰鏀惧叆鍒板垎甯冨紡鏂囦欢绯荤粺涓紝浼氳鍒嗗壊鎴愬涓猙lock鏀剧疆鍒版瘡涓涓殑DataNode涓婏紝榛樿dfs.block.size搴旇鏄64M锛屼篃灏辨槸璇村鏋滀綘鏀剧疆鍒癏DFS涓婄殑鏁版嵁灏忎簬64锛岄偅涔堝皢鍙湁涓涓狟lock锛屾鏃朵細琚斁缃埌鏌愪竴涓狣ataNode涓紝杩欎釜鍙互閫氳繃浣跨敤鍛戒护锛hadoop dfsadmin 鈥搑eport灏卞彲浠ョ湅鍒板悇涓妭鐐瑰瓨鍌ㄧ殑鎯呭喌銆備篃鍙互鐩存帴鍘绘煇涓涓狣ataNode鏌ョ湅鐩綍锛hadoop.tmp.dir/dfs/data/current灏卞彲浠ョ湅鍒伴偅浜沚lock浜嗐侭lock鐨勬暟閲忓皢浼氱洿鎺ュ奖鍝嶅埌Map鐨勪釜鏁般傚綋鐒跺彲浠ラ氳繃閰嶇疆鏉ヨ瀹歁ap鍜孯educe鐨勪换鍔′釜鏁般侻ap鐨勪釜鏁伴氬父榛樿鍜孒DFS闇瑕佸鐞嗙殑blocks鐩稿悓銆備篃鍙互閫氳繃閰嶇疆Map鐨勬暟閲忔垨鑰呴厤缃甿inimum split size鏉ヨ瀹氾紝瀹為檯鐨勪釜鏁颁负锛max(min(block_size,data/#maps),min_split_size)銆俁educe鍙互閫氳繃杩欎釜鍏紡璁$畻锛0.95*num_nodes*mapred.tasktracker.tasks.maximum

鎬荤殑鏉ヨ鍑轰簡闂鎴栬呭惎鍔ㄧ殑鏃跺欐渶濂藉幓鐪嬬湅鏃ュ織锛岃繖鏍峰績閲屾湁搴曘

Hadoop涓殑鍛戒护锛圕ommand锛夋荤粨

杩欓儴鍒嗗唴瀹瑰叾瀹炲彲浠ラ氳繃鍛戒护鐨凥elp浠ュ強浠嬬粛浜嗚В锛屾垜涓昏渚ч噸浜庝粙缁嶄竴涓嬫垜鐢ㄧ殑姣旇緝澶氱殑鍑犱釜鍛戒护銆侶adoop dfs 杩欎釜鍛戒护鍚庨潰鍔犲弬鏁板氨鏄浜嶩DFS鐨勬搷浣滐紝鍜孡inux鎿嶄綔绯荤粺鐨勫懡浠ゅ緢绫讳技锛屼緥濡傦細

  • Hadoop dfs 鈥搇s灏辨槸鏌ョ湅/usr/root鐩綍涓嬬殑鍐呭锛岄粯璁ゅ鏋滀笉濉矾寰勮繖灏辨槸褰撳墠鐢ㄦ埛璺緞锛
  • Hadoop dfs 鈥搑mr xxx灏辨槸鍒犻櫎鐩綍锛岃繕鏈夊緢澶氬懡浠ょ湅鐪嬪氨寰堝鏄撲笂鎵嬶紱
  • Hadoop dfsadmin 鈥搑eport杩欎釜鍛戒护鍙互鍏ㄥ眬鐨勬煡鐪婦ataNode鐨勬儏鍐碉紱
  • Hadoop job鍚庨潰澧炲姞鍙傛暟鏄浜庡綋鍓嶈繍琛岀殑Job鐨勬搷浣滐紝渚嬪list,kill绛夛紱
  • Hadoop balancer灏辨槸鍓嶉潰鎻愬埌鐨勫潎琛$鐩樿礋杞界殑鍛戒护銆

鍏朵粬灏变笉璇︾粏浠嬬粛浜嗐

鍦⊿IP椤圭洰璁捐鐨勮繃绋嬩腑锛屽浜庡畠搴炲ぇ鐨勬棩蹇楀湪寮濮嬫椂灏辫冭檻浣跨敤浠诲姟鍒嗚В鐨勫绾跨▼澶勭悊妯″紡鏉ュ垎鏋愮粺璁★紝鍦ㄦ垜浠庡墠鍐欑殑鏂囩珷銆奣iger Concurrent Practice –鏃ュ織鍒嗘瀽骞惰鍒嗚В璁捐涓庡疄鐜般嬩腑鏈夋墍鎻愬埌銆備絾鏄敱浜庣粺璁$殑鍐呭鏆傛椂杩樻槸鍗佸垎绠鍗曪紝鎵浠ュ氨閲囩敤Memcache浣滀负璁℃暟鍣紝缁撳悎MySQL灏卞畬鎴愪簡璁块棶鎺у埗浠ュ強缁熻鐨勫伐浣溿傜劧鑰屾湭鏉ワ紝瀵逛簬娴烽噺鏃ュ織鍒嗘瀽鐨勫伐浣滐紝杩樻槸闇瑕佹湁鎵鍑嗗銆傜幇鍦ㄦ渶鐏殑鎶鏈瘝姹囪帿杩囦簬鈥滀簯璁$畻鈥濓紝鍦∣pen API鏃ョ泭鐩涜鐨勪粖澶╋紝浜掕仈缃戝簲鐢ㄧ殑鏁版嵁灏嗕細瓒婃潵瓒婃湁浠峰硷紝濡備綍鍘诲垎鏋愯繖浜涙暟鎹紝鎸栨帢鍏跺唴鍦ㄤ环鍊硷紝灏遍渶瑕佸垎甯冨紡璁$畻鏉ユ敮鎾戞捣閲忔暟鎹殑鍒嗘瀽宸ヤ綔銆

鍥炶繃澶存潵鐪嬶紝鏃╁厛閭g澶氱嚎绋嬶紝澶氫换鍔″垎瑙g殑鏃ュ織鍒嗘瀽璁捐锛屽叾瀹炴槸鍒嗗竷寮忚绠楃殑涓涓崟鏈虹増缂╃暐锛屽浣曞皢杩欑鍗曟満鐨勫伐浣滆繘琛屽垎鎷嗭紝鍙樻垚鍗忓悓宸ヤ綔鐨勯泦缇わ紝鍏跺疄灏辨槸鍒嗗竷寮忚绠楁鏋惰璁℃墍娑夊強鐨勩傚湪鍘诲勾鍙傚姞BEA澶т細鐨勬椂鍊欙紝BEA鍜孷MWare鍚堜綔閲囩敤铏氭嫙鏈烘潵鏋勫缓闆嗙兢锛屾棤闈炲氨鏄笇鏈涗娇寰楄绠楁満纭欢鑳藉绫讳技浜庡簲鐢ㄧ▼搴忎腑璧勬簮姹犵殑璧勬簮锛屼娇鐢ㄨ呮棤闇鍏冲績璧勬簮鐨勫垎閰嶆儏鍐碉紝浠庤屾渶澶у寲浜嗙‖浠惰祫婧愮殑浣跨敤浠峰笺傚垎甯冨紡璁$畻涔熸槸濡傛锛屽叿浣撶殑璁$畻浠诲姟浜ょ敱鍝竴鍙版満鍣ㄦ墽琛岋紝鎵ц鍚庣敱璋佹潵姹囨伙紝杩欓兘鐢卞垎甯冨紡妗嗘灦鐨凪aster鏉ユ妷鎷╋紝鑰屼娇鐢ㄨ呭彧闇绠鍗曞湴灏嗗緟鍒嗘瀽鍐呭鎻愪緵缁欏垎甯冨紡璁$畻绯荤粺浣滀负杈撳叆锛屽氨鍙互寰楀埌鍒嗗竷寮忚绠楀悗鐨勭粨鏋溿

Hadoop鏄疉pache寮婧愮粍缁囩殑涓涓垎甯冨紡璁$畻寮婧愭鏋讹紝鍦ㄥ緢澶氬ぇ鍨嬬綉绔欎笂閮藉凡缁忓緱鍒颁簡搴旂敤锛屽浜氶┈閫娿丗acebook鍜孻ahoo绛夌瓑銆傚浜庢垜鏉ヨ锛屾渶杩戠殑涓涓娇鐢ㄧ偣灏辨槸鏈嶅姟闆嗘垚骞冲彴鐨勬棩蹇楀垎鏋愩傛湇鍔¢泦鎴愬钩鍙扮殑鏃ュ織閲忓皢浼氬緢澶э紝鑰岃繖涔熸濂界鍚堜簡鍒嗗竷寮忚绠楃殑閫傜敤鍦烘櫙锛堟棩蹇楀垎鏋愬拰绱㈠紩寤虹珛灏辨槸涓ゅぇ搴旂敤鍦烘櫙锛夈

褰撳墠娌℃湁姝e紡纭畾浣跨敤锛屾墍浠ヤ篃鏄嚜宸变笟浣欐懜绱紝鍚庣画鎵鍐欑殑鐩稿叧鍐呭锛岄兘鏄竴涓柊鎵嬬殑瀛︿範杩囩▼锛岄毦鍏嶄細鏈変竴浜涢敊璇紝鍙槸甯屾湜璁板綍涓嬫潵鍙互鍒嗕韩缁欐洿澶氬織鍚岄亾鍚堢殑鏈嬪弸銆

浠涔堟槸Hadoop锛

鎼炰粈涔堜笢瑗夸箣鍓嶏紝绗竴姝ユ槸瑕佺煡閬揥hat锛堟槸浠涔堬級锛岀劧鍚庢槸Why锛堜负浠涔堬級锛屾渶鍚庢墠鏄疕ow锛堟庝箞鍋氾級銆備絾寰堝寮鍙戠殑鏈嬪弸鍦ㄥ仛浜嗗骞撮」鐩互鍚庯紝閮戒範鎯槸鍏圚ow锛岀劧鍚嶹hat锛屾渶鍚庢墠鏄疻hy锛岃繖鏍峰彧浼氳鑷繁鍙樺緱娴簛锛屽悓鏃跺線寰浼氬皢鎶鏈鐢ㄤ簬涓嶉傚悎鐨勫満鏅

Hadoop妗嗘灦涓渶鏍稿績鐨勮璁″氨鏄細MapReduce鍜孒DFS銆侻apReduce鐨勬濇兂鏄敱Google鐨勪竴绡囪鏂囨墍鎻愬強鑰岃骞夸负娴佷紶鐨勶紝绠鍗曠殑涓鍙ヨ瘽瑙i噴MapReduce灏辨槸鈥滀换鍔$殑鍒嗚В涓庣粨鏋滅殑姹囨烩濄侶DFS鏄疕adoop鍒嗗竷寮忔枃浠剁郴缁燂紙Hadoop Distributed File System锛夌殑缂╁啓锛屼负鍒嗗竷寮忚绠楀瓨鍌ㄦ彁渚涗簡搴曞眰鏀寔銆

MapReduce浠庡畠鍚嶅瓧涓婃潵鐪嬪氨澶ц嚧鍙互鐪嬪嚭涓紭鐢憋紝涓や釜鍔ㄨ瘝Map鍜孯educe锛屸淢ap锛堝睍寮锛夆濆氨鏄皢涓涓换鍔″垎瑙f垚涓哄涓换鍔★紝鈥淩educe鈥濆氨鏄皢鍒嗚В鍚庡浠诲姟澶勭悊鐨勭粨鏋滄眹鎬昏捣鏉ワ紝寰楀嚭鏈鍚庣殑鍒嗘瀽缁撴灉銆傝繖涓嶆槸浠涔堟柊鎬濇兂锛屽叾瀹炲湪鍓嶉潰鎻愬埌鐨勫绾跨▼锛屽浠诲姟鐨勮璁″氨鍙互鎵惧埌杩欑鎬濇兂鐨勫奖瀛愩備笉璁烘槸鐜板疄绀句細锛岃繕鏄湪绋嬪簭璁捐涓紝涓椤瑰伐浣滃線寰鍙互琚媶鍒嗘垚涓哄涓换鍔★紝浠诲姟涔嬮棿鐨勫叧绯诲彲浠ュ垎涓轰袱绉嶏細涓绉嶆槸涓嶇浉鍏崇殑浠诲姟锛屽彲浠ュ苟琛屾墽琛岋紱鍙︿竴绉嶆槸浠诲姟涔嬮棿鏈夌浉浜掔殑渚濊禆锛屽厛鍚庨『搴忎笉鑳藉棰犲掞紝杩欑被浠诲姟鏄棤娉曞苟琛屽鐞嗙殑銆傚洖鍒板ぇ瀛︽椂鏈燂紝鏁欐巿涓婅鏃惰澶у鍘诲垎鏋愬叧閿矾寰勶紝鏃犻潪灏辨槸鎵炬渶鐪佹椂鐨勪换鍔″垎瑙f墽琛屾柟寮忋傚湪鍒嗗竷寮忕郴缁熶腑锛屾満鍣ㄩ泦缇ゅ氨鍙互鐪嬩綔纭欢璧勬簮姹狅紝灏嗗苟琛岀殑浠诲姟鎷嗗垎锛岀劧鍚庝氦鐢辨瘡涓涓┖闂叉満鍣ㄨ祫婧愬幓澶勭悊锛岃兘澶熸瀬澶у湴鎻愰珮璁$畻鏁堢巼锛屽悓鏃惰繖绉嶈祫婧愭棤鍏虫э紝瀵逛簬璁$畻闆嗙兢鐨勬墿灞曟棤鐤戞彁渚涗簡鏈濂界殑璁捐淇濊瘉銆傦紙鍏跺疄鎴戜竴鐩磋涓篐adoop鐨勫崱閫氬浘鏍囦笉搴旇鏄竴涓皬璞★紝搴旇鏄殏铓侊紝鍒嗗竷寮忚绠楀氨濂芥瘮铓傝殎鍚冨ぇ璞★紝寤変环鐨勬満鍣ㄧ兢鍙互鍖规晫浠讳綍楂樻ц兘鐨勮绠楁満锛岀旱鍚戞墿灞曠殑鏇茬嚎濮嬬粓鏁屼笉杩囨í鍚戞墿灞曠殑鏂滅嚎锛夈備换鍔″垎瑙e鐞嗕互鍚庯紝閭e氨闇瑕佸皢澶勭悊浠ュ悗鐨勭粨鏋滃啀姹囨昏捣鏉ワ紝杩欏氨鏄疪educe瑕佸仛鐨勫伐浣溿


鍥1锛歁apReduce缁撴瀯绀烘剰鍥

涓婂浘灏辨槸MapReduce澶ц嚧鐨勭粨鏋勫浘锛屽湪Map鍓嶈繕鍙兘浼氬杈撳叆鐨勬暟鎹湁Split锛堝垎鍓诧級鐨勮繃绋嬶紝淇濊瘉浠诲姟骞惰鏁堢巼锛屽湪Map涔嬪悗杩樹細鏈塖huffle锛堟贩鍚堬級鐨勮繃绋嬶紝瀵逛簬鎻愰珮Reduce鐨勬晥鐜囦互鍙婂噺灏忔暟鎹紶杈撶殑鍘嬪姏鏈夊緢澶х殑甯姪銆傚悗闈細鍏蜂綋鎻愬強杩欎簺閮ㄥ垎鐨勭粏鑺傘

HDFS鏄垎甯冨紡璁$畻鐨勫瓨鍌ㄥ熀鐭筹紝Hadoop鐨勫垎甯冨紡鏂囦欢绯荤粺鍜屽叾浠栧垎甯冨紡鏂囦欢绯荤粺鏈夊緢澶氱被浼肩殑鐗硅川銆傚垎甯冨紡鏂囦欢绯荤粺鍩烘湰鐨勫嚑涓壒鐐癸細

  1. 瀵逛簬鏁翠釜闆嗙兢鏈夊崟涓鐨勫懡鍚嶇┖闂淬
  2. 鏁版嵁涓鑷存с傞傚悎涓娆″啓鍏ュ娆¤鍙栫殑妯″瀷锛屽鎴风鍦ㄦ枃浠舵病鏈夎鎴愬姛鍒涘缓涔嬪墠鏃犳硶鐪嬪埌鏂囦欢瀛樺湪銆
  3. 鏂囦欢浼氳鍒嗗壊鎴愬涓枃浠跺潡锛屾瘡涓枃浠跺潡琚垎閰嶅瓨鍌ㄥ埌鏁版嵁鑺傜偣涓婏紝鑰屼笖鏍规嵁閰嶇疆浼氱敱澶嶅埗鏂囦欢鍧楁潵淇濊瘉鏁版嵁鐨勫畨鍏ㄦс


鍥2锛欻DFS缁撴瀯绀烘剰鍥

涓婂浘涓睍鐜颁簡鏁翠釜HDFS涓変釜閲嶈瑙掕壊锛歂ameNode銆丏ataNode鍜孋lient銆侼ameNode鍙互鐪嬩綔鏄垎甯冨紡鏂囦欢绯荤粺涓殑绠$悊鑰咃紝涓昏璐熻矗绠$悊鏂囦欢绯荤粺鐨勫懡鍚嶇┖闂淬侀泦缇ら厤缃俊鎭拰瀛樺偍鍧楃殑澶嶅埗绛夈侼ameNode浼氬皢鏂囦欢绯荤粺鐨凪eta-data瀛樺偍鍦ㄥ唴瀛樹腑锛岃繖浜涗俊鎭富瑕佸寘鎷簡鏂囦欢淇℃伅銆佹瘡涓涓枃浠跺搴旂殑鏂囦欢鍧楃殑淇℃伅鍜屾瘡涓涓枃浠跺潡鍦―ataNode鐨勪俊鎭瓑銆侱ataNode鏄枃浠跺瓨鍌ㄧ殑鍩烘湰鍗曞厓锛屽畠灏咮lock瀛樺偍鍦ㄦ湰鍦版枃浠剁郴缁熶腑锛屼繚瀛樹簡Block鐨凪eta-data锛屽悓鏃跺懆鏈熸у湴灏嗘墍鏈夊瓨鍦ㄧ殑Block淇℃伅鍙戦佺粰NameNode銆侰lient灏辨槸闇瑕佽幏鍙栧垎甯冨紡鏂囦欢绯荤粺鏂囦欢鐨勫簲鐢ㄧ▼搴忋傝繖閲岄氳繃涓変釜鎿嶄綔鏉ヨ鏄庝粬浠箣闂寸殑浜や簰鍏崇郴銆

鏂囦欢鍐欏叆锛

  1. Client鍚慛ameNode鍙戣捣鏂囦欢鍐欏叆鐨勮姹傘
  2. NameNode鏍规嵁鏂囦欢澶у皬鍜屾枃浠跺潡閰嶇疆鎯呭喌锛岃繑鍥炵粰Client瀹冩墍绠$悊閮ㄥ垎DataNode鐨勪俊鎭
  3. Client灏嗘枃浠跺垝鍒嗕负澶氫釜Block锛屾牴鎹瓺ataNode鐨勫湴鍧淇℃伅锛屾寜椤哄簭鍐欏叆鍒版瘡涓涓狣ataNode鍧椾腑銆

鏂囦欢璇诲彇锛

  1. Client鍚慛ameNode鍙戣捣鏂囦欢璇诲彇鐨勮姹傘
  2. NameNode杩斿洖鏂囦欢瀛樺偍鐨凞ataNode鐨勪俊鎭
  3. Client璇诲彇鏂囦欢淇℃伅銆

鏂囦欢Block澶嶅埗锛

  1. NameNode鍙戠幇閮ㄥ垎鏂囦欢鐨凚lock涓嶇鍚堟渶灏忓鍒舵暟鎴栬呴儴鍒咲ataNode澶辨晥銆
  2. 閫氱煡DataNode鐩镐簰澶嶅埗Block銆
  3. DataNode寮濮嬬洿鎺ョ浉浜掑鍒躲

鏈鍚庡啀璇翠竴涓婬DFS鐨勫嚑涓璁$壒鐐癸紙瀵逛簬妗嗘灦璁捐鍊煎緱鍊熼壌锛夛細

  1. Block鐨勬斁缃細榛樿涓嶉厤缃備竴涓狟lock浼氭湁涓変唤澶囦唤锛屼竴浠芥斁鍦∟ameNode鎸囧畾鐨凞ataNode锛屽彟涓浠芥斁鍦ㄤ笌鎸囧畾DataNode闈炲悓涓Rack涓婄殑DataNode锛屾渶鍚庝竴浠芥斁鍦ㄤ笌鎸囧畾DataNode鍚屼竴Rack涓婄殑DataNode涓娿傚浠芥棤闈炲氨鏄负浜嗘暟鎹畨鍏紝鑰冭檻鍚屼竴Rack鐨勫け璐ユ儏鍐典互鍙婁笉鍚孯ack涔嬮棿鏁版嵁鎷疯礉鎬ц兘闂灏遍噰鐢ㄨ繖绉嶉厤缃柟寮忋
  2. 蹇冭烦妫娴婦ataNode鐨勫仴搴风姸鍐碉紝濡傛灉鍙戠幇闂灏遍噰鍙栨暟鎹浠界殑鏂瑰紡鏉ヤ繚璇佹暟鎹殑瀹夊叏鎬с
  3. 鏁版嵁澶嶅埗锛堝満鏅负DataNode澶辫触銆侀渶瑕佸钩琛ataNode鐨勫瓨鍌ㄥ埄鐢ㄧ巼鍜岄渶瑕佸钩琛ataNode鏁版嵁浜や簰鍘嬪姏绛夋儏鍐碉級锛氳繖閲屽厛璇翠竴涓嬶紝浣跨敤HDFS鐨刡alancer鍛戒护锛屽彲浠ラ厤缃竴涓猅hreshold鏉ュ钩琛℃瘡涓涓狣ataNode纾佺洏鍒╃敤鐜囥備緥濡傝缃簡Threshold涓10%锛岄偅涔堟墽琛宐alancer鍛戒护鐨勬椂鍊欙紝棣栧厛缁熻鎵鏈塂ataNode鐨勭鐩樺埄鐢ㄧ巼鐨勫潎鍊硷紝鐒跺悗鍒ゆ柇濡傛灉鏌愪竴涓狣ataNode鐨勭鐩樺埄鐢ㄧ巼瓒呰繃杩欎釜鍧囧糡hreshold浠ヤ笂锛岄偅涔堝皢浼氭妸杩欎釜DataNode鐨刡lock杞Щ鍒扮鐩樺埄鐢ㄧ巼浣庣殑DataNode锛岃繖瀵逛簬鏂拌妭鐐圭殑鍔犲叆鏉ヨ鍗佸垎鏈夌敤銆
  4. 鏁版嵁浜ら獙锛氶噰鐢–RC32浣滄暟鎹氦楠屻傚湪鏂囦欢Block鍐欏叆鐨勬椂鍊欓櫎浜嗗啓鍏ユ暟鎹繕浼氬啓鍏ヤ氦楠屼俊鎭紝鍦ㄨ鍙栫殑鏃跺欓渶瑕佷氦楠屽悗鍐嶈鍏ャ
  5. NameNode鏄崟鐐癸細濡傛灉澶辫触鐨勮瘽锛屼换鍔″鐞嗕俊鎭皢浼氱邯褰曞湪鏈湴鏂囦欢绯荤粺鍜岃繙绔殑鏂囦欢绯荤粺涓
  6. 鏁版嵁绠¢亾鎬х殑鍐欏叆锛氬綋瀹㈡埛绔鍐欏叆鏂囦欢鍒癉ataNode涓婏紝棣栧厛瀹㈡埛绔鍙栦竴涓狟lock鐒跺悗鍐欏埌绗竴涓狣ataNode涓婏紝鐒跺悗鐢辩涓涓狣ataNode浼犻掑埌澶囦唤鐨凞ataNode涓婏紝涓鐩村埌鎵鏈夐渶瑕佸啓鍏ヨ繖涓狟lock鐨凬ataNode閮芥垚鍔熷啓鍏ワ紝瀹㈡埛绔墠浼氱户缁紑濮嬪啓涓嬩竴涓狟lock銆
  7. 瀹夊叏妯″紡锛氬湪鍒嗗竷寮忔枃浠剁郴缁熷惎鍔ㄧ殑鏃跺欙紝寮濮嬬殑鏃跺欎細鏈夊畨鍏ㄦā寮忥紝褰撳垎甯冨紡鏂囦欢绯荤粺澶勪簬瀹夊叏妯″紡鐨勬儏鍐典笅锛屾枃浠剁郴缁熶腑鐨勫唴瀹逛笉鍏佽淇敼涔熶笉鍏佽鍒犻櫎锛岀洿鍒板畨鍏ㄦā寮忕粨鏉熴傚畨鍏ㄦā寮忎富瑕佹槸涓轰簡绯荤粺鍚姩鐨勬椂鍊欐鏌ュ悇涓狣ataNode涓婃暟鎹潡鐨勬湁鏁堟э紝鍚屾椂鏍规嵁绛栫暐蹇呰鐨勫鍒舵垨鑰呭垹闄ら儴鍒嗘暟鎹潡銆傝繍琛屾湡閫氳繃鍛戒护涔熷彲浠ヨ繘鍏ュ畨鍏ㄦā寮忋傚湪瀹炶返杩囩▼涓紝绯荤粺鍚姩鐨勬椂鍊欏幓淇敼鍜屽垹闄ゆ枃浠朵篃浼氭湁瀹夊叏妯″紡涓嶅厑璁镐慨鏀圭殑鍑洪敊鎻愮ず锛屽彧闇瑕佺瓑寰呬竴浼氬効鍗冲彲銆

涓嬮潰缁煎悎MapReduce鍜孒DFS鏉ョ湅Hadoop鐨勭粨鏋勶細


鍥3锛欻adoop缁撴瀯绀烘剰鍥

鍦℉adoop鐨勭郴缁熶腑锛屼細鏈変竴鍙癕aster锛屼富瑕佽礋璐ameNode鐨勫伐浣滀互鍙奐obTracker鐨勫伐浣溿侸obTracker鐨勪富瑕佽亴璐e氨鏄惎鍔ㄣ佽窡韪拰璋冨害鍚勪釜Slave鐨勪换鍔℃墽琛屻傝繕浼氭湁澶氬彴Slave锛屾瘡涓鍙癝lave閫氬父鍏锋湁DataNode鐨勫姛鑳藉苟璐熻矗TaskTracker鐨勫伐浣溿俆askTracker鏍规嵁搴旂敤瑕佹眰鏉ョ粨鍚堟湰鍦版暟鎹墽琛孧ap浠诲姟浠ュ強Reduce浠诲姟銆

璇村埌杩欓噷锛屽氨瑕佹彁鍒板垎甯冨紡璁$畻鏈閲嶈鐨勪竴涓璁$偣锛歁oving Computation is Cheaper than Moving Data銆傚氨鏄湪鍒嗗竷寮忓鐞嗕腑锛岀Щ鍔ㄦ暟鎹殑浠d环鎬绘槸楂樹簬杞Щ璁$畻鐨勪唬浠枫傜畝鍗曟潵璇村氨鏄垎鑰屾不涔嬬殑宸ヤ綔锛岄渶瑕佸皢鏁版嵁涔熷垎鑰屽瓨鍌紝鏈湴浠诲姟澶勭悊鏈湴鏁版嵁鐒跺悗褰掓伙紝杩欐牱鎵嶄細淇濊瘉鍒嗗竷寮忚绠楃殑楂樻晥鎬с

涓轰粈涔堣閫夋嫨Hadoop锛

璇村畬浜哤hat锛岀畝鍗曞湴璇翠竴涓媁hy銆傚畼鏂圭綉绔欏凡缁忕粰浜嗗緢澶氱殑璇存槑锛岃繖閲屽氨澶ц嚧璇翠竴涓嬪叾浼樼偣鍙婁娇鐢ㄧ殑鍦烘櫙锛堟病鏈変笉濂界殑宸ュ叿锛屽彧鐢ㄤ笉閫傜敤鐨勫伐鍏凤紝鍥犳閫夋嫨濂藉満鏅墠鑳藉鐪熸鍙戞尌鍒嗗竷寮忚绠楃殑浣滅敤锛夛細

  1. 鍙墿灞曪細涓嶈鏄瓨鍌ㄧ殑鍙墿灞曡繕鏄绠楃殑鍙墿灞曢兘鏄疕adoop鐨勮璁℃牴鏈
  2. 缁忔祹锛氭鏋跺彲浠ヨ繍琛屽湪浠讳綍鏅氱殑PC涓娿
  3. 鍙潬锛氬垎甯冨紡鏂囦欢绯荤粺鐨勫浠芥仮澶嶆満鍒朵互鍙奙apReduce鐨勪换鍔$洃鎺т繚璇佷簡鍒嗗竷寮忓鐞嗙殑鍙潬鎬с
  4. 楂樻晥锛氬垎甯冨紡鏂囦欢绯荤粺鐨勯珮鏁堟暟鎹氦浜掑疄鐜颁互鍙奙apReduce缁撳悎Local Data澶勭悊鐨勬ā寮忥紝涓洪珮鏁堝鐞嗘捣閲忕殑淇℃伅浣滀簡鍩虹鍑嗗銆

浣跨敤鍦烘櫙锛涓汉瑙夊緱鏈閫傚悎鐨勫氨鏄捣閲忔暟鎹殑鍒嗘瀽锛屽叾瀹濭oogle鏈鏃╂彁鍑篗apReduce涔熷氨鏄负浜嗘捣閲忔暟鎹垎鏋愩傚悓鏃禜DFS鏈鏃╂槸涓轰簡鎼滅储寮曟搸瀹炵幇鑰屽紑鍙戠殑锛屽悗鏉ユ墠琚敤浜庡垎甯冨紡璁$畻妗嗘灦涓傛捣閲忔暟鎹鍒嗗壊浜庡涓妭鐐癸紝鐒跺悗鐢辨瘡涓涓妭鐐瑰苟琛岃绠楋紝灏嗗緱鍑虹殑缁撴灉褰掑苟鍒拌緭鍑恒傚悓鏃剁涓闃舵鐨勮緭鍑哄張鍙互浣滀负涓嬩竴闃舵璁$畻鐨勮緭鍏ワ紝鍥犳鍙互鎯宠薄鍒颁竴涓爲鐘剁粨鏋勭殑鍒嗗竷寮忚绠楀浘锛屽湪涓嶅悓闃舵閮芥湁涓嶅悓浜у嚭锛屽悓鏃跺苟琛屽拰涓茶缁撳悎鐨勮绠椾篃鍙互寰堝ソ鍦板湪鍒嗗竷寮忛泦缇ょ殑璧勬簮涓嬪緱浠ラ珮鏁堢殑澶勭悊銆

SAYWO.NET鎷涜仒PHP宸ョ▼甯

PHP宸ョ▼甯/涓婃捣甯
鎵灞炶亴绫伙細浜掕仈缃戣蒋浠跺紑鍙戝伐绋嬪笀
闇姹備汉鏁帮細3浜
鍙戝竷鏃堕棿锛2010-03-19

鑱屼綅鎻忚堪

宀椾綅鑱岃矗锛
1.缃戠珯鎼缓銆佷唬鐮佺紪鍐欏強娴嬭瘯锛
2. Web绋嬪簭绯荤粺鐨勭瓥鍒掋佸紑鍙戝強娴嬭瘯锛
3. 鏀硅繘銆佸寮虹幇鏈変骇鍝佺殑鎬ц兘涓庡姛鑳斤紱
4. 缃戠珯鍚庡彴瀹炴椂缁存姢銆

浠昏亴瑕佹眰锛
1.绮鹃歅HP璇█銆丮ySQL鏁版嵁搴擄紝鐔熸倝Linux缃戠珯寮鍙戠幆澧
2.鐔熸倝Linux鎿嶄綔绯荤粺锛岀啛鎮堿pache锛岀啛鎮塎ySQL鏁版嵁搴撶殑璁捐銆佺鐞嗐佸紑鍙戝拰浼樺寲锛
3.绮鹃欳SS/HTML/XML绛夌綉椤垫妧鏈鑼冿紝鐔熸倝JavaScript/AJAX绛夊鎴风鑴氭湰璇█锛
4.鐔熸倝寮鍙戞枃妗g殑缂栧啓锛屾湁鑹ソ鏂囨。缂栧啓鑳藉姏鍜岀紪绋嬮鏍硷紝鐔熸倝鐗堟湰鎺у埗SVN鎴朇VS鐨勪娇鐢紱
5.鏈塉AVA寮鍙戠粡楠岃呬紭鍏堬紱
6.鍏锋湁Web2.0搴旂敤瀹炰緥寮鍙戠粡楠岃呬紭鍏堬紱
7.鏈1骞存垨浠ヤ笂鐩稿叧宸ヤ綔缁忛獙锛
8.鏈夊緢寮虹殑瀛︿範鑳藉姏鍜屾暚涓氱簿绁烇紝杈冨ソ鐨勬矡閫氳兘鍔涳紝鏈夎壇濂界殑鍥㈤槦鍚堜綔绮剧銆

鏈夋剰鑰咃紝璇峰彂閫佺畝鍘嗚嚦william@fantha.com

鐢变簬榛樿鐨劼爏mtp_line_length_limit鍊间负990锛屾墍浠ヤ細鑷姩鎹㈣锛屽苟瀵艰嚧涓枃閭欢鍙兘鍑虹幇閮ㄥ垎姹夊瓧鐨勪贡鐮併

澶勭悊鏂规硶锛毬犱慨鏀硅灞炴у硷紝鎴栬呴偖浠跺唴瀹逛笉瑕佹斁涓琛屻

淇敼灞炴у兼柟娉曪細聽postconf -e smtp_line_length_limit=10240

Powered by WordPress. Theme: Motion by 85ideas.