При использовании let
ключевое слово let
присоединяет объявление переменной к какому-либо блоку (обычно пару { .. }
), в котором оно содержится. Другими словами, let
неявно захватывает область любого блока для его объявления переменной.
let
переменные не могут быть доступны в объекте window
, потому что они не могут быть глобально доступны.
function a(){
{ // this is the Max Scope for let variable
let x = 12;
}
console.log(x);
}
a(); // Uncaught ReferenceError: x is not defined
При использовании var
var
, а переменные в ES5 имеют области действия, означающие, что переменные действительны внутри функции, а не вне самой функции.
var
переменные могут быть доступны в window
, потому что они не могут быть доступны по всему миру.
function a(){ // this is the Max Scope for var variable
{
var x = 12;
}
console.log(x);
}
a(); // 12
Если вы хотите узнать больше продолжить чтение ниже
, один из самых известных вопросов собеседования по сфере охвата также может быть достаточным точное использование let
и var
, как показано ниже:
При использовании let
for (let i = 0; i < 10 ; i++) {
setTimeout(
function a() {
console.log(i); //print 0 to 9, that is literally AWW!!!
},
100 * i);
}
Это связано с тем, что при использовании let
для каждой итерации цикла переменная
При использовании var
for (var i = 0; i < 10 ; i++) {
setTimeout(
function a() {
console.log(i); //print 10 times 10
},
100 * i);
}
Th заключается в том, что при использовании var
для каждой итерации цикла переменная имеет область действия и имеет общую копию.
Я бы рекомендовал вам напрямую использовать интерфейс, который обеспечивает искру. Он предоставляет много информации и показателей по времени, шагам, использованию сети и т. Д. ...
Вы можете узнать подробнее об этом здесь: https://spark.apache.org/docs/ last / monitoring.html
Кроме того, в новой версии Spark (1.4.0) есть хороший визуализатор, чтобы понять шаги и этапы ваших искровых заданий.
Как вы сказали, профилирование распределенного процесса сложнее, чем профилирование одного процесса JVM, но есть способы его достижения.
Вы можете использовать выборку в качестве метода профилирования потоков. Добавьте агента java к исполнителям, которые будут захватывать трассировки стека, а затем агрегируют по этим трассировкам стека, чтобы узнать, какие методы использует ваше приложение в большинстве случаев.
Например, вы можете использовать statsd- jvm-profiler java agent и настроить его для отправки трассировки стека в InfluxDB , а затем скомпилировать их с помощью пламенных графов .
информацию, проверить мое сообщение о профилировании приложений Spark: https://www.paypal-engineering.com/2016/09/08/spark-in-flames-profiling-spark-applications-using-flame-graphs/
Посмотрите на JVM Profiler , выпущенный UBER.
JVM Profiler - это инструмент, разработанный UBER для анализа приложений JVM в распределенной среде. Он может подключать Java-агент к исполнителям приложения Spark / Hadoop распределенным способом и собирать различные показатели во время выполнения. Это позволяет отслеживать произвольные java-методы / аргументы без изменения исходного кода (аналогично Dtrace).
Вот сообщение в блоге .
Недавно я написал статью и скрипт, который обертывает spark-submit
и генерирует график пламени после выполнения приложения Spark.
Вот статья: https: // www .linkedin.com / pulse / profiling-spark-applications-one-click-michael-spector
Вот сценарий: https://raw.githubusercontent.com/spektom/ spark-flamegraph / master / spark-submit-flamegraph
Просто используйте его вместо обычного spark-submit
.