|
29 | 29 | import com.google.protobuf.ByteString; |
30 | 30 |
|
31 | 31 | import com.google.protobuf.CodedInputStream; |
| 32 | +import org.apache.tez.dag.api.TezConfiguration; |
32 | 33 | import org.apache.tez.runtime.api.TaskContext; |
33 | 34 | import org.slf4j.Logger; |
34 | 35 | import org.slf4j.LoggerFactory; |
|
43 | 44 | import org.xerial.snappy.SnappyInputStream; |
44 | 45 | import org.xerial.snappy.SnappyOutputStream; |
45 | 46 |
|
| 47 | +import static org.apache.tez.dag.api.TezConfiguration.TEZ_LOGGING_PROPERTY_MASK; |
| 48 | +import static org.apache.tez.dag.api.TezConfiguration.TEZ_LOGGING_PROPERTY_MASK_DEFAULT; |
| 49 | +import static org.apache.tez.dag.api.TezConfiguration.TEZ_LOGGING_PROPERTY_SIZE_THRESHOLD; |
| 50 | +import static org.apache.tez.dag.api.TezConfiguration.TEZ_LOGGING_PROPERTY_SIZE_THRESHOLD_DEFAULT; |
| 51 | + |
46 | 52 | /** |
47 | 53 | * Utility methods for setting up a DAG. Has helpers for setting up log4j configuration, converting |
48 | 54 | * {@link org.apache.hadoop.conf.Configuration} to {@link org.apache.tez.dag.api.UserPayload} etc. |
|
51 | 57 | public final class TezUtils { |
52 | 58 |
|
53 | 59 | private static final Logger LOG = LoggerFactory.getLogger(TezUtils.class); |
| 60 | + private static final int PROPERTY_THRESHOLD; |
| 61 | + private static final boolean PROPERTY_MASK; |
| 62 | + |
| 63 | + static { |
| 64 | + TezConfiguration c = new TezConfiguration(); |
| 65 | + PROPERTY_THRESHOLD = c.getInt(TEZ_LOGGING_PROPERTY_SIZE_THRESHOLD, TEZ_LOGGING_PROPERTY_SIZE_THRESHOLD_DEFAULT); |
| 66 | + PROPERTY_MASK = c.getBoolean(TEZ_LOGGING_PROPERTY_MASK, TEZ_LOGGING_PROPERTY_MASK_DEFAULT); |
| 67 | + } |
54 | 68 |
|
55 | 69 | private TezUtils() {} |
56 | 70 |
|
@@ -211,10 +225,19 @@ public static void populateConfProtoFromEntries(Iterable<Map.Entry<String, Strin |
211 | 225 | kvp.setKey(key); |
212 | 226 | kvp.setValue(val); |
213 | 227 | confBuilder.addConfKeyValues(kvp); |
| 228 | + logEntryIfLarge(key, val); |
214 | 229 | } else { |
215 | 230 | LOG.debug("null value for key={}. Skipping.", key); |
216 | 231 | } |
217 | 232 | } |
218 | 233 | } |
219 | 234 |
|
| 235 | + private static void logEntryIfLarge(String key, String value) { |
| 236 | + if (value.length() > PROPERTY_THRESHOLD) { |
| 237 | + LOG.warn("Property '{}' is unusually big ({} bytes); large payload may lead to OOM.", key, value.length()); |
| 238 | + if (!PROPERTY_MASK) { |
| 239 | + LOG.warn("Large property '{}': {}", key, value); |
| 240 | + } |
| 241 | + } |
| 242 | + } |
220 | 243 | } |
0 commit comments