У меня есть следующий код, который запускает hiveContext.sql()
большую часть времени. Моя задача: я хочу создать несколько таблиц и вставить значения после обработки для всего раздела таблицы hive.
Поэтому я сначала запускаю show partitions
и используя его вывод в цикле for, я вызываю несколько методов, которые создают таблицу (если она не существует) и вставляются в них с помощью hiveContext.sql
.
Теперь мы не можем выполнить hiveContext
в исполнителе, поэтому я должен выполнить это в цикле for-loop в программе драйвера и выполнять поочередно поочередно. Когда я отправляю эту работу Spark в кластер YARN, почти все время мой исполнитель теряется из-за того, что shuffle не найден исключение.
Теперь это происходит, потому что YARN убивает моего исполнителя из-за перегрузки памяти. Я не понимаю, почему, поскольку у меня очень маленький набор данных для каждого раздела куста, но все же он заставляет YARN убивать моего исполнителя.
Будет ли следующий код делать все параллельно и попытаться одновременно разместить все данные раздела кустов в памяти?
public static void main(String[] args) throws IOException {
SparkConf conf = new SparkConf();
SparkContext sc = new SparkContext(conf);
HiveContext hc = new HiveContext(sc);
DataFrame partitionFrame = hiveContext.sql(" show partitions dbdata partition(date="2015-08-05")");
Row[] rowArr = partitionFrame.collect();
for(Row row : rowArr) {
String[] splitArr = row.getString(0).split("/");
String server = splitArr[0].split("=")[1];
String date = splitArr[1].split("=")[1];
String csvPath = "hdfs:///user/db/ext/"+server+".csv";
if(fs.exists(new Path(csvPath))) {
hiveContext.sql("ADD FILE " + csvPath);
}
createInsertIntoTableABC(hc,entity, date);
createInsertIntoTableDEF(hc,entity, date);
createInsertIntoTableGHI(hc,entity,date);
createInsertIntoTableJKL(hc,entity, date);
createInsertIntoTableMNO(hc,entity,date);
}
}