powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вывод переменных hadoop программы c помощью log4j
4 сообщений из 4, страница 1 из 1
Вывод переменных hadoop программы c помощью log4j
    #38233574
vladdv89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я написал hadoop программу с использованием log4j (привожу только шаг Map, работа которого не оправдала мои ожидания)


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
	package org.myorg;

	import java.io.*;
	import java.util.*;
	import org.apache.hadoop.fs.*;
	import org.apache.hadoop.conf.*;
	import org.apache.hadoop.io.*;
	import org.apache.hadoop.mapred.*;
	import org.apache.hadoop.util.*;
	import org.apache.log4j.Logger;
	import org.apache.log4j.LogManager;
	import org.apache.log4j.xml.DOMConfigurator;

	public class ParallelIndexation {
		//public static native long Traveser(String Path);

		//public static native void Configure(String Path);

		//static {
		//	System.loadLibrary("nativelib");
		//}
		public static class Map extends MapReduceBase implements
				Mapper<LongWritable, Text, Text, LongWritable> {
			private final static LongWritable zero = new LongWritable(0);
			private Text word = new Text();
			private static final Logger logger = LogManager.getLogger(Map.class.getName());
			//DOMConfigurator.configure("/export/hadoop-1.0.1/log4j.xml");

			public void map(LongWritable key, Text value,
					OutputCollector<Text, LongWritable> output, Reporter reporter)
					throws IOException {
				DOMConfigurator.configure("/folder/log4j.xml");
				Configuration conf = new Configuration();
				FileSystem fs = FileSystem.get(conf);
				Path localPath = new Path("/export/hadoop-1.0.1/bin/input/paths.txt");
				Path hdfsPath=new Path("hdfs://192.168.1.8:7000/user/hadoop/paths.txt");
				Path localPath1 = new Path("/usr/countcomputers.txt");	              
				Path hdfsPath1=new Path("hdfs://192.168.1.8:7000/user/hadoop/countcomputers.txt");
				if (!fs.exists(hdfsPath))
				{
					fs.copyFromLocalFile(localPath, hdfsPath);
				};
				if (!fs.exists(hdfsPath1))
				{
					fs.copyFromLocalFile(localPath1, hdfsPath1);
				};			
				FSDataInputStream in = fs.open(hdfsPath);
				BufferedReader br = new BufferedReader(new InputStreamReader(in));
				String line = br.readLine();
				// String line = value.toString();
				BufferedReader br1=new BufferedReader(new InputStreamReader(fs.open(hdfsPath1)));
				int CountComputers;
				/* FileInputStream fstream = new FileInputStream(
						"/usr/countcomputers.txt");
				DataInputStream input = new DataInputStream(fstream);
				BufferedReader br = new BufferedReader(new InputStreamReader(input)); */
				String result=br1.readLine();
				CountComputers=Integer.parseInt(result);
				// in.close();
				// fstream.close();
				ArrayList<String> paths = new ArrayList<String>();
				StringTokenizer tokenizer = new StringTokenizer(line, "|");
				while (tokenizer.hasMoreTokens()) {
					paths.add(tokenizer.nextToken());
				}
				for (int i=0; i<paths.size(); i++)
					{
						logger.debug("paths[i]=" + paths.get(i) + "\n");	
					}
				logger.debug("CountComputers=" + CountComputers + "\n");
				String[] ConcatPaths = new String[CountComputers];
				int NumberOfElementConcatPaths = 0;
				if (paths.size() % CountComputers == 0) {
					for (int i = 0; i < CountComputers; i++) {
						ConcatPaths[i] = paths.get(NumberOfElementConcatPaths);
						NumberOfElementConcatPaths += paths.size() / CountComputers;
						for (int j = 1; j < paths.size() / CountComputers; j++) {
							ConcatPaths[i] += "\n"
									+ paths.get(i * paths.size() / CountComputers
											+ j);
						}
					}
				} else {
					NumberOfElementConcatPaths = 0;
					for (int i = 0; i < paths.size() % CountComputers; i++) {
						ConcatPaths[i] = paths.get(NumberOfElementConcatPaths);
						NumberOfElementConcatPaths += paths.size() / CountComputers
								+ 1;
						for (int j = 1; j < paths.size() / CountComputers + 1; j++) {
							ConcatPaths[i] += "\n"
									+ paths.get(i
											* (paths.size() / CountComputers + 1)
											+ j);
						}
					}
					for (int k = paths.size() % CountComputers; k < CountComputers; k++) {
						ConcatPaths[k] = paths.get(NumberOfElementConcatPaths);
						NumberOfElementConcatPaths += paths.size() / CountComputers;
						for (int j = 1; j < paths.size() / CountComputers; j++) {
							ConcatPaths[k] += "\n"
									+ paths.get((k - paths.size() % CountComputers)
											* paths.size() / CountComputers
											+ paths.size() % CountComputers
											* (paths.size() / CountComputers + 1)
											+ j);
						}
					}
				}
				for (int i = 0; i < ConcatPaths.length; i++) {
					word.set(ConcatPaths[i]);
					output.collect(word, zero);
				}
				in.close();
			}
		}



Привожу файл /folder/log4j.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
	<?xml version="1.0" encoding="UTF-8" ?>
	<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

	<log4j:configuration debug="true" xmlns:log4j="http://jakarta.apache.org/log4j/">

		<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
			<param name="Encoding" value="UTF-8"/>
			<layout class="org.apache.log4j.PatternLayout">
				<param name="ConversionPattern" value="%d{ISO8601} [%-5p][%-16.16t][%32.32c] - %m%n" />
			</layout>
		</appender>

		<root>
			<priority value="ERROR"/>
			<appender-ref ref="ConsoleAppender" />
		</root>

	</log4j:configuration>


Но несмотря на строки программы
Код: java
1.
2.
3.
4.
5.
				for (int i=0; i<paths.size(); i++)
					{
						logger.debug("paths[i]=" + paths.get(i) + "\n");	
					}
				logger.debug("CountComputers=" + CountComputers + "\n");


в результате выполнения команды
./hadoop jar /export/hadoop-1.0.1/bin/ParallelIndexation.jar org.myorg.ParallelIndexation /export/hadoop-1.0.1/bin/input /export/hadoop-1.0.1/bin/output -D mapred.map.tasks=1 1> resultofexecute.txt 2>&1
в файле resultofexecute.txt не оказалось вывода соответствующих переменных (содержимое которого привожу ниже):


args[0]=/export/hadoop-1.0.1/bin/input
13/04/19 22:23:19 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
13/04/19 22:23:19 INFO mapred.FileInputFormat: Total input paths to process : 0
13/04/19 22:23:20 INFO mapred.JobClient: Running job: job_201304192207_0001
13/04/19 22:23:21 INFO mapred.JobClient: map 0% reduce 0%
13/04/19 22:23:40 INFO mapred.JobClient: map 0% reduce 100%
13/04/19 22:23:45 INFO mapred.JobClient: Job complete: job_201304192207_0001
13/04/19 22:23:45 INFO mapred.JobClient: Counters: 15
13/04/19 22:23:45 INFO mapred.JobClient: Job Counters
13/04/19 22:23:45 INFO mapred.JobClient: Launched reduce tasks=1
13/04/19 22:23:45 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=10343
13/04/19 22:23:45 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0
13/04/19 22:23:45 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0
13/04/19 22:23:45 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=7555
13/04/19 22:23:45 INFO mapred.JobClient: File Output Format Counters
13/04/19 22:23:45 INFO mapred.JobClient: Bytes Written=0
13/04/19 22:23:45 INFO mapred.JobClient: FileSystemCounters
13/04/19 22:23:45 INFO mapred.JobClient: FILE_BYTES_WRITTEN=21536
13/04/19 22:23:45 INFO mapred.JobClient: Map-Reduce Framework
13/04/19 22:23:45 INFO mapred.JobClient: Reduce input groups=0
13/04/19 22:23:45 INFO mapred.JobClient: Combine output records=0
13/04/19 22:23:45 INFO mapred.JobClient: Reduce shuffle bytes=0
13/04/19 22:23:45 INFO mapred.JobClient: Reduce output records=0
13/04/19 22:23:45 INFO mapred.JobClient: Spilled Records=0
13/04/19 22:23:45 INFO mapred.JobClient: Total committed heap usage (bytes)=16252928
13/04/19 22:23:45 INFO mapred.JobClient: Combine input records=0
13/04/19 22:23:45 INFO mapred.JobClient: Reduce input records=0
...
Рейтинг: 0 / 0
Вывод переменных hadoop программы c помощью log4j
    #38233608
vladdv89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вкралась опечатка
Код: xml
1.
2.
3.
4.
		<root>
			<priority value="DEBUG"/>
			<appender-ref ref="ConsoleAppender" />
		</root>


но несмотря на это проблема остается актуальной, я изменил уровень логгера на DEBUG во всех файлах /folder/log4j.xml на всех подчиненных узлах (а значит и на узле, на котором выполнялся mapper), но несмотря на это файл вывода остался тем же.
...
Рейтинг: 0 / 0
Вывод переменных hadoop программы c помощью log4j
    #38233628
АлексейС
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladdv89,

1) Hadoop - это распределённая система, соответственно нужно понимать, что перенаправления stderr, stdout на запускающий сервер - не будет. Кроме того нет никакой гарантии, что маппер или редьюсер будет запущен на той ноде, на которой бы вам хотелось. Только если нода одна или если запустить job'у локально. Вы можете найти ввод/вывод в логах каждого конкретного сервера отдельно.

2) у вас используется старая версия hadoop api, рекомендую использовать org.apache.hadoop.mapreduce.*.

3) Рекомендую прочитать статьи о написании job'ов в Hadoop и перечитать документацию. На лицо - неверное восприятие парадигмы map-reduce, судя по логике вашего маппера. Он не масштабируем.

4) Сложение строк в итерации вот так: ` ConcatPaths[k] += "\n" + paths.get( ` - это плохая практика в коде. Но в hadoop'e - это просто абсолютное зло из-за больших объёмов данных. Если объёмы данных небольшие, тогда зачем нужен hadoop? IO на каждом map'e - еще хуже.

5) зачем вы используете hadoop? Какой объём данных? Какую задачу вы решаете?
...
Рейтинг: 0 / 0
Вывод переменных hadoop программы c помощью log4j
    #38233634
АлексейС
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейС,

Тфу, сплю уже, под "Ввод/вывод" я имел в виду, конечно же, вывод - stderr,stdout.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Вывод переменных hadoop программы c помощью log4j
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]