Использование определяемых пользователем функций Java с Apache Hive в HDInsight
Узнайте, как создать определяемую пользователем функцию (UDF) на основе Java, которая работает с Apache Hive. Определяемая пользователем функция Java в этом примере преобразует таблицу текстовых строк в символы нижнего регистра.
Необходимые компоненты
Кластер Hadoop в HDInsight. Ознакомьтесь со статьей Краткое руководство. Использование Apache Hadoop и Apache Hive в Azure HDInsight с шаблоном Resource Manager.
Средство Apache Maven, установленное согласно инструкций Apache. Maven — система сборки проектов Java.
Схема универсального кода ресурса (URI) для основного хранилища кластеров. Это будет wasb:// для служба хранилища Azure для Azure Data Lake Storage 2-го поколения
abfs://
или adl:// для Azure Data Lake Storage 1-го поколения. Если для службы хранилища Azure включено безопасное перемещение, URI будет таким:wasbs://
. См. также сведения о безопасной передаче.Текстовый редактор или Java IDE.
Внимание
Если вы создаете файлы Python в клиенте Windows, следует использовать редактор, который использует LF в качестве символа конца строки. Если вы не уверены, используется ли в редакторе символ LF или CRLF, см. раздел Устранение неполадок, в котором описано, как удалять символы CR.
Тестовая среда
Среда, использованная в этой статье, — компьютер под управлением Windows 10. Команды были выполнены в командной строке, а различные файлы были отредактированы в блокноте. Внесите изменения в соответствии с особенностями своей среды.
В командной строке введите приведенные ниже команды, чтобы создать рабочую среду.
IF NOT EXIST C:\HDI MKDIR C:\HDI
cd C:\HDI
Создание примера определяемой пользователем функции Java
Создайте проект Maven с помощью следующей команды:
mvn archetype:generate -DgroupId=com.microsoft.examples -DartifactId=ExampleUDF -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Эта команда создает каталог
exampleudf
, который содержит проект Maven.После создания проекта удалите каталог
exampleudf/src/test
, который был создан вместе с ним, с помощью следующей команды:cd ExampleUDF rmdir /S /Q "src/test"
Откройте
pom.xml
, введя следующую команду:notepad pom.xml
Замените запись
<dependencies>
следующим XML-кодом:<dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.3</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>1.2.1</version> <scope>provided</scope> </dependency> </dependencies>
В этих записях указана версия Hadoop и Hive, используемая в кластерах HDInsight 3.6. Сведения о версиях Hadoop и Hive, включенных в HDInsight, можно найти в статье Что представляют собой различные компоненты Hadoop, доступные в HDInsight? .
В конце файла добавьте раздел
<build>
перед строкой</project>
. Этот раздел должен содержать следующий код XML:<build> <plugins> <!-- build for Java 1.8. This is required by HDInsight 3.6 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <!-- build an uber jar --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version> <configuration> <!-- Keep us from getting a can't overwrite file error --> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer"> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"> </transformer> </transformers> <!-- Keep us from getting a bad signature error --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Эти записи определяют способ построения проекта. В частности, используемую в проекте версию Java и способ построения uberjar для развертывания в кластер.
После внесения изменений сохраните файл.
Введите следующую команду, чтобы создать и открыть новый файл
ExampleUDF.java
:notepad src/main/java/com/microsoft/examples/ExampleUDF.java
Затем скопируйте и вставьте приведенный ниже код Java в новый файл. После этого закройте файл.
package com.microsoft.examples; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.*; // Description of the UDF @Description( name="ExampleUDF", value="returns a lower case version of the input string.", extended="select ExampleUDF(deviceplatform) from hivesampletable limit 10;" ) public class ExampleUDF extends UDF { // Accept a string input public String evaluate(String input) { // If the value is null, return a null if(input == null) return null; // Lowercase the input string and return it return input.toLowerCase(); } }
Этот код реализует определяемую пользователем функцию, которая принимает строковое значение и возвращает строку в нижнем регистре.
Создание и установка определяемой пользователем функции
В командах ниже вместо sshuser
укажите реальное имя пользователя, если оно отличается. Вместо mycluster
укажите реальное имя кластера.
Cкомпилируйте и упакуйте определяемую пользователем функцию с помощью следующей команды:
mvn compile package
Эта команда выполняет сборку определяемой пользователем функции и упаковывает ее в файл
exampleudf/target/ExampleUDF-1.0-SNAPSHOT.jar
.Используйте команду
scp
, чтобы скопировать файл в кластер HDInsight:scp ./target/ExampleUDF-1.0-SNAPSHOT.jar sshuser@mycluster-ssh.azurehdinsight.net:
Подключитесь к кластеру по протоколу SSH с помощью следующей команды:
ssh sshuser@mycluster-ssh.azurehdinsight.net
В открытом сеансе SSH скопируйте JAR-файл в хранилище HDInsight.
hdfs dfs -put ExampleUDF-1.0-SNAPSHOT.jar /example/jars
Использование определяемой пользователем функции из Hive
Запустите клиент Beeline из сеанса SSH с помощью следующей команды:
beeline -u 'jdbc:hive2://localhost:10001/;transportMode=http'
В этой команде предполагается, что вы использовали для кластера учетную запись входа по умолчанию — admin .
После появления командной строки
jdbc:hive2://localhost:10001/>
введите следующую команду, чтобы добавить определяемую пользователем функцию в Hive и предоставить ее как функцию.ADD JAR wasbs:///example/jars/ExampleUDF-1.0-SNAPSHOT.jar; CREATE TEMPORARY FUNCTION tolower as 'com.microsoft.examples.ExampleUDF';
Используйте определяемую пользователем функцию, чтобы преобразовать значения, полученные из таблицы, в строки нижнего регистра.
SELECT tolower(state) AS ExampleUDF, state FROM hivesampletable LIMIT 10;
Этот запрос выбирает состояние из таблицы, преобразует строку в нижний регистр, а затем отображает ее вместе с исходным именем. Выходные данные выглядят следующим образом:
+---------------+---------------+--+ | exampleudf | state | +---------------+---------------+--+ | california | California | | pennsylvania | Pennsylvania | | pennsylvania | Pennsylvania | | pennsylvania | Pennsylvania | | colorado | Colorado | | colorado | Colorado | | colorado | Colorado | | utah | Utah | | utah | Utah | | colorado | Colorado | +---------------+---------------+--+
Устранение неполадок
При выполнении задания hive может возникнуть ошибка наподобие следующей:
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: [Error 20001]: An error occurred while reading or writing to your custom script. It may have crashed with an error.
Эта проблема может быть вызвана символами окончания строк в файле Python. Многие редакторы Windows по умолчанию используют символы CRLF, но в приложениях Linux обычно ожидается использование символа LF.
Вы можете использовать следующие команды PowerShell для удаления символов CR перед передачей файла в HDInsight:
# Set $original_file to the Python file path
$text = [IO.File]::ReadAllText($original_file) -replace "`r`n", "`n"
[IO.File]::WriteAllText($original_file, $text)
Следующие шаги
Другие способы работы с Hive в HDInsight см. в этой статье.
Дополнительные сведения об определяемых пользователем функциях Hive см. в разделе Hive Operators and User-Defined Functions (Операторы Hive и определяемые пользователем функции) вики-сайта Hive на сайте apache.org.