Задълбочено въведение в архитектурата на SQOOP

Apache Sqoop е инструмент за поглъщане на данни, предназначен за ефективно прехвърляне на групови данни между Apache Hadoop и структурирани хранилища за данни, като релационни бази данни, и обратно.

Като част от този блог ще обясня как работи архитектурата при изпълнение на команда Sqoop. Ще разгледам подробности като генерирането на буркан чрез Codegen, изпълнението на заданието MapReduce и различните етапи, свързани с изпълнението на команда за импортиране / експортиране на Sqoop.

Codegen

Разбирането на Codegen е от съществено значение, тъй като това вътрешно превръща нашата работа в Sqoop в буркан, който се състои от няколко Java класа като POJO, ORM и клас, който реализира DBWritable, разширявайки SqoopRecord за четене и запис на данните от релационни бази данни в Hadoop & vice- обратно.

Можете да създадете Codegen изрично, както е показано по-долу, за да проверите класовете, присъстващи като част от бурканчето.

sqoop codegen \ -- connect jdbc:mysql://ms.jayReddy.com:3306/retail_db \ -- username retail_user \ -- password ******* \ -- table products

Изходният буркан ще бъде записан във вашата локална файлова система. Ще получите Jar файл, Java файл и java файлове, които са компилирани в .class файлове:

Нека видим фрагмент от кода, който ще бъде генериран.

ORM клас за таблица „products“ // Обектно-релационен модал, генериран за картографиране:

Setter & Getter методи за получаване на стойности:

Вътрешно той използва изготвени от JDBC изявления, за да пише в Hadoop и ResultSet за четене на данни от Hadoop.

Внос на Sqoop

Използва се за импортиране на данни от традиционни релационни бази данни в Hadoop.

Нека да видим примерен фрагмент за същото.

sqoop import \ -- connect jdbc:mysql://ms.jayReddy.com:3306/retail_db \ -- username retail_user \ -- password ******* \ -- table products \ -- warehouse-dir /user/jvanchir/sqoop_prac/import_table_dir \ -- delete-target-dir

Следните стъпки се извършват вътрешно по време на изпълнението на sqoop.

Стъпка 1 : Прочетете данни от MySQL по стрийминг. Той прави различни операции, преди да запише данните в HDFS.

Като част от този процес, той първо ще генерира код (типичен код за намаляване на Map), който не е нищо друго освен Java код. Използвайки този Java код, той ще се опита да импортира.

  • Генерирайте кода. (Hadoop MR)
  • Компилирайте кода и генерирайте Jar файла.
  • Изпратете файла Jar и изпълнете операциите по импортиране

По време на импортирането той трябва да вземе определени решения как да разделя данните на множество нишки, така че импортирането на Sqoop да може да се мащабира.

Стъпка 2 : Разберете структурата на данните и изпълнете CodeGen

Използвайки горния SQL израз, той ще извлече един запис заедно с имената на колоните. Използвайки тази информация, тя ще извлече информацията за метаданните на колоните, типа данни и т.н.

Стъпка 3 : Създайте java файла, компилирайте го и генерирайте jar файл

Като част от генерирането на код, той трябва да разбере структурата на данните и трябва да приложи този обект върху входящите данни вътрешно, за да се увери, че данните са правилно копирани в целевата база данни. Всяка уникална таблица има един Java файл, който говори за структурата на данните.

Този jar файл ще се инжектира в двоичните файлове на Sqoop, за да приложи структурата към входящите данни.

Стъпка 4 : Изтрийте целевата директория, ако тя вече съществува.

Стъпка 5 : Импортирайте данните

Тук той се свързва с мениджър на ресурси, получава ресурса и стартира главното приложение.

За да извърши равномерно разпределение на данните между задачите на картата, той по подразбиране изпълнява гранична заявка въз основа на първичния ключ

за да намерите минималния и максималния брой записи в таблицата.

Въз основа на максималния брой, той ще се раздели на броя на картографиращите и ще го раздели между всеки картограф.

Той използва 4 картографски програми по подразбиране:

Той изпълнява тези задачи на различни изпълнители, както е показано по-долу:

Броят на картографиращите по подразбиране може да бъде променен чрез задаване на следния параметър:

Така че в нашия случай той използва 4 нишки. Всяка нишка обработва взаимно изключващи се подмножества, т.е. всяка нишка обработва различни данни от останалите.

За да видите различните стойности, проверете по-долу:

Операции, които се изпълняват под всеки изпълнителен възел:

В случай, че извършите импортиране на кошер Sqooop, се извършва една допълнителна стъпка като част от изпълнението.

Стъпка 6 : Копирайте данните в таблицата с кошери

Sqoop Export

Това се използва за експортиране на данни от Hadoop в традиционни релационни бази данни.

Нека да видим примерен фрагмент за същото:

sqoop export \ -- connect jdbc:mysql://ms.jayReddy.com:3306/retail_export \ -- username retail_user \ -- password ******* \ -- table product_sqoop_exp \ -- export-dir /user/jvanchir/sqoop_prac/import_table_dir/products

On executing the above command, the execution steps (1–4) similar to Sqoop import take place, but the source data is read from the file system (which is nothing but HDFS). Here it will use boundaries upon block size to divide the data and it is internally taken care by Sqoop.

The processing splits are done as shown below:

After connecting to the respective database to which the records are to be exported, it will issue a JDBC insert command to read data from HDFS and store it into the database as shown below.

Now that we have seen how Sqoop works internally, you can determine the flow of execution from jar generation to execution of a MapReduce task on the submission of a Sqoop job.

Note: The commands that were executed related to this post are added as part of my GIT account.

Similarly, you can also read more here:

  • Hive Architecture in Depth with code.
  • HDFS Architecture in Depth with code.

If you would like too, you can connect with me on LinkedIn - Jayvardhan Reddy.

If you enjoyed reading this article, you can click the clap and let others know about it. If you would like me to add anything else, please feel free to leave a response ?