在 HDInsight 中的 Apache Hadoop 上将 C# 用户定义函数与 Apache Hive 和 Apache Pig 配合使用Use C# user-defined functions with Apache Hive and Apache Pig on Apache Hadoop in HDInsight

了解如何在 HDInsight 中将 C# 用户定义函数 (UDF) 与 Apache Hive 和 Apache Pig 配合使用。Learn how to use C# user-defined functions (UDF) with Apache Hive and Apache Pig on HDInsight.

重要

本文档中的步骤使用基于 Linux 的 HDInsight 群集。The steps in this document work with Linux-based HDInsight clusters. Linux 是 HDInsight 3.4 或更高版本上使用的唯一操作系统。Linux is the only operating system used on HDInsight version 3.4 or greater. 有关详细信息,请参阅 HDInsight 组件版本控制For more information, see HDInsight component versioning.

Hive 和 Pig 都可以将数据传递到外部应用程序以进行处理。Both Hive and Pig can pass data to external applications for processing. 此过程称为_流式处理_。This process is known as streaming. 使用 .NET 应用程序时,数据将传递到 STDIN 上的应用程序,该应用程序也会在 STDOUT 上返回结果。When using a .NET application, the data is passed to the application on STDIN, and the application returns the results on STDOUT. 若要从 STDIN 和 STDOUT 读取和写入数据,可以使用控制台应用程序中的 Console.ReadLine()Console.WriteLine()To read and write from STDIN and STDOUT, you can use Console.ReadLine() and Console.WriteLine() from a console application.

先决条件Prerequisites

  • 熟悉编写和生成面向 .NET Framework 4.5 的 C# 代码。A familiarity with writing and building C# code that targets .NET Framework 4.5.

    使用任何需要的 IDE。Use whatever IDE you want. 我们建议使用 Visual StudioVisual Studio CodeWe recommend Visual Studio or Visual Studio Code. 本文档中的步骤使用 Visual Studio 2019。The steps in this document use Visual Studio 2019.

  • 将 .exe 文件上传到群集以及运行 Pig 和 Hive 作业的方法。A way to upload .exe files to the cluster and run Pig and Hive jobs. 建议使用针对 Visual Studio 的 Data Lake 工具、Azure PowerShell 和 Azure 经典 CLI。We recommend the Data Lake Tools for Visual Studio, Azure PowerShell, and Azure Classic CLI. 本文档中的各个步骤都使用针对 Visual Studio 的 Data Lake 工具上传文件和运行 Hive 查询示例。The steps in this document use the Data Lake Tools for Visual Studio to upload the files and run the example Hive query.

    有关运行 Hive 查询的其他方法的信息,请参阅 Azure HDInsight 中的 Apache Hive 和 HiveQL 是什么?For information on other ways to run Hive queries, see What is Apache Hive and HiveQL on Azure HDInsight?.

  • HDInsight 群集上的 Hadoop。A Hadoop on HDInsight cluster. 有关创建群集的详细信息,请参阅创建 HDInsight 群集For more information on creating a cluster, see Create HDInsight clusters.

HDInsight 上的 .NET.NET on HDInsight

基于 Linux 的 HDInsight 群集使用 Mono (https://mono-project.com) 运行 .NET 应用程序。Linux-based HDInsight clusters use Mono (https://mono-project.com) to run .NET applications. HDInsight 版本 3.6 附带了 Mono 版本 4.2.1。Mono version 4.2.1 is included with HDInsight version 3.6.

For more information on Mono compatibility with .NET Framework versions, see [Mono compatibility](https://www.mono-project.com/docs/about-mono/compatibility/).

有关包含在 HDInsight 版本中的 .NET Framework 和 Mono 版本的详细信息,请参阅 HDInsight 组件版本For more information on the version of the .NET Framework and Mono included with HDInsight versions, see HDInsight component versions.

创建 C# 项目Create the C# projects

以下部分介绍如何在 Visual Studio 中为 Apache Hive UDF 和 Apache Pig UDF 创建 C# 项目。The following sections describe how to create a C# project in Visual Studio for an Apache Hive UDF and an Apache Pig UDF.

Apache Hive UDFApache Hive UDF

若要为 Apache Hive UDF 创建 C# 项目:To create a C# project for an Apache Hive UDF:

  1. 启动 Visual Studio。Launch Visual Studio.

  2. 选择“创建新项目”。 Select Create a new project.

  3. 在“创建新项目”窗口中,选择“控制台应用(.NET Framework)”模板(C# 版本)。 In the Create a new project window, choose the Console App (.NET Framework) template (the C# version). 然后,选择“下一步” 。Then select Next.

  4. 在“配置新项目”窗口输入 HiveCSharp 作为项目名称,然后导航到或创建一个位置用于保存新项目。 In the Configure your new project window, enter a Project name of HiveCSharp, and navigate to or create a Location to save the new project in. 然后选择“创建” 。Then select Create.

  5. 在 Visual Studio IDE 中,将 Program.cs 的内容替换为以下代码:In the Visual Studio IDE, replace the contents of Program.cs with the following code:

    using System;
    using System.Security.Cryptography;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace HiveCSharp
    {
        class Program
        {
            static void Main(string[] args)
            {
                string line;
                // Read stdin in a loop
                while ((line = Console.ReadLine()) != null)
                {
                    // Parse the string, trimming line feeds
                    // and splitting fields at tabs
                    line = line.TrimEnd('\n');
                    string[] field = line.Split('\t');
                    string phoneLabel = field[1] + ' ' + field[2];
                    // Emit new data to stdout, delimited by tabs
                    Console.WriteLine("{0}\t{1}\t{2}", field[0], phoneLabel, GetMD5Hash(phoneLabel));
                }
            }
            /// <summary>
            /// Returns an MD5 hash for the given string
            /// </summary>
            /// <param name="input">string value</param>
            /// <returns>an MD5 hash</returns>
            static string GetMD5Hash(string input)
            {
                // Step 1, calculate MD5 hash from input
                MD5 md5 = System.Security.Cryptography.MD5.Create();
                byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
                byte[] hash = md5.ComputeHash(inputBytes);
    
                // Step 2, convert byte array to hex string
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < hash.Length; i++)
                {
                    sb.Append(hash[i].ToString("x2"));
                }
                return sb.ToString();
            }
        }
    }
    
  6. 从菜单栏中,选择“生成” > “生成解决方案”以生成项目。 From the menu bar, select Build > Build Solution to build the project.

  7. 关闭解决方案。Close the solution.

Apache Pig UDFApache Pig UDF

若要为 Apache Hive UDF 创建 C# 项目:To create a C# project for an Apache Hive UDF:

  1. 打开 Visual Studio。Open Visual Studio.

  2. 在“开始”窗口中,选择“创建新项目”。 In the Start window, select Create a new project.

  3. 在“创建新项目”窗口中,选择“控制台应用(.NET Framework)”模板(C# 版本)。 In the Create a new project window, choose the Console App (.NET Framework) template (the C# version). 然后,选择“下一步” 。Then select Next.

  4. 在“配置新项目”窗口输入 PigUDF 作为项目名称,然后转到或创建一个位置用于保存新项目。 In the Configure your new project window, enter a Project name of PigUDF, and go to or create a Location to save the new project in. 然后选择“创建” 。Then select Create.

  5. 在 Visual Studio IDE 中,将 Program.cs 的内容替换为以下代码:In the Visual Studio IDE, replace the contents of Program.cs with the following code:

    using System;
    
    namespace PigUDF
    {
        class Program
        {
            static void Main(string[] args)
            {
                string line;
                // Read stdin in a loop
                while ((line = Console.ReadLine()) != null)
                {
                    // Fix formatting on lines that begin with an exception
                    if(line.StartsWith("java.lang.Exception"))
                    {
                        // Trim the error info off the beginning and add a note to the end of the line
                        line = line.Remove(0, 21) + " - java.lang.Exception";
                    }
                    // Split the fields apart at tab characters
                    string[] field = line.Split('\t');
                    // Put fields back together for writing
                    Console.WriteLine(String.Join("\t",field));
                }
            }
        }
    }
    

    此代码分析发送自 Pig 的行,并对以 java.lang.Exception 开头的行重新设置格式。This code parses the lines sent from Pig and reformats lines that begin with java.lang.Exception.

  6. 在菜单栏中,选择“生成” > “生成解决方案”以生成项目。 From the menu bar, choose Build > Build Solution to build the project.

  7. 使解决方案保持打开状态。Leave the solution open.

上传到存储Upload to storage

接下来,将 Hive 和 Pig UDF 应用程序上传到 HDInsight 群集中的存储。Next, upload the Hive and Pig UDF applications to storage on a HDInsight cluster.

  1. 在 Visual Studio 中,导航到“视图” > “服务器资源管理器”。 In Visual Studio, navigate to View > Server Explorer.

  2. 在服务器资源管理器中右键单击“Azure”并选择“连接到 Microsoft Azure 订阅”,然后完成登录过程。 From Server Explorer, right-click Azure, select Connect to Microsoft Azure Subscription, and complete the sign-in process.

  3. 展开要将此应用程序部署到的 HDInsight 群集。Expand the HDInsight cluster that you wish to deploy this application to. 列出带有文本“(默认存储帐户)” 的条目。An entry with the text (Default Storage Account) is listed.

    默认存储帐户,HDInsight 群集,服务器资源管理器

    • 如果可以展开此项,则表示你正在使用 Azure 存储帐户作为群集的默认存储。If this entry can be expanded, you're using an Azure Storage Account as default storage for the cluster. 如果要查看该群集的默认存储上的文件,请展开该条目,并双击“(默认容器)” 。To view the files on the default storage for the cluster, expand the entry and then double-click the (Default Container).

    • 如果无法展开此项,则表示你正在使用 Azure Data Lake Storage 作为群集的默认存储。If this entry can't be expanded, you're using Azure Data Lake Storage as the default storage for the cluster. 若要查看该群集的默认存储上的文件,请双击“(默认存储帐户)” 条目。To view the files on the default storage for the cluster, double-click the (Default Storage Account) entry.

  4. 若要上传 .exe 文件,请使用以下方法之一:To upload the .exe files, use one of the following methods:

    • 如果使用的是 Azure 存储帐户,请选择“上传 Blob”图标。 If you're using an Azure Storage Account, select the Upload Blob icon.

      新项目的 HDInsight 上传图标

      在“上传新文件”对话框中的“文件名”下,选择“浏览”。 In the Upload New File dialog box, under File name, select Browse. 在“上传 Blob”对话框中,转到“HiveCSharp”项目的“bin\debug”文件夹,然后选择“HiveCSharp.exe”文件。 In the Upload Blob dialog box, go to the bin\debug folder for the HiveCSharp project, and then choose the HiveCSharp.exe file. 最后,依次选择“打开”、“确定”完成上传。 Finally, select Open and then OK to complete the upload.

    • 如果使用的是 Azure Data Lake Storage,请右键单击文件列表中的空白区域,然后选择“上传”。 If you're using Azure Data Lake Storage, right-click an empty area in the file listing, and then select Upload. 最后,依次选择“HiveCSharp.exe”文件、“打开”。 Finally, choose the HiveCSharp.exe file and select Open.

    上传“HiveCSharp.exe” 完成后,请为“PigUDF.exe” 文件重复该上传过程。Once the HiveCSharp.exe upload has finished, repeat the upload process for the PigUDF.exe file.

运行 Apache Hive 查询Run an Apache Hive query

现在可以运行使用 Hive UDF 应用程序的 Hive 查询。Now you can run a Hive query that uses your Hive UDF application.

  1. 在 Visual Studio 中,导航到“视图” > “服务器资源管理器”。 In Visual Studio, navigate to View > Server Explorer.

  2. 依次展开“Azure” 和“HDInsight” 。Expand Azure, and then expand HDInsight.

  3. 右键单击已将 HiveCSharp 应用程序部署到的群集,并选择“编写 Hive 查询” 。Right-click the cluster that you deployed the HiveCSharp application to, and then select Write a Hive Query.

  4. 请使用以下文本执行 Hive 查询:Use the following text for the Hive query:

    -- Uncomment the following if you are using Azure Storage
    -- add file wasb:///HiveCSharp.exe;
    -- Uncomment the following if you are using Azure Data Lake Storage Gen2
    -- add file abfs:///HiveCSharp.exe;
    
    SELECT TRANSFORM (clientid, devicemake, devicemodel)
    USING 'HiveCSharp.exe' AS
    (clientid string, phoneLabel string, phoneHash string)
    FROM hivesampletable
    ORDER BY clientid LIMIT 50;
    

    重要

    取消注释与用于群集的默认存储类型相匹配的 add file 语句。Uncomment the add file statement that matches the type of default storage used for your cluster.

    此查询将从 hivesampletable 中选择 clientiddevicemakedevicemodel 字段,然后将这些字段传递到 HiveCSharp.exe 应用程序。This query selects the clientid, devicemake, and devicemodel fields from hivesampletable, and then it passes the fields to the HiveCSharp.exe application. 该查询预期应用程序返回三个字段,它们存储为 clientidphoneLabelphoneHashThe query expects the application to return three fields, which are stored as clientid, phoneLabel, and phoneHash. 该查询还预期在默认存储容器的根目录中找到 HiveCSharp.exeThe query also expects to find HiveCSharp.exe in the root of the default storage container.

  5. 将默认的“交互式” 切换为“批处理” ,然后选择“提交” 以将作业提交到 HDInsight 群集。Switch the default Interactive to Batch, and then Select Submit to submit the job to the HDInsight cluster. 此时会打开“Hive 作业摘要”窗口 。The Hive Job Summary window opens.

  6. 选择“刷新”以刷新摘要,直到“作业状态”更改为“已完成”。 Select Refresh to refresh the summary until Job Status changes to Completed. 若要查看作业输出,请选择“作业输出”。 To view the job output, select Job Output.

运行 Apache Pig 作业Run an Apache Pig job

也可以运行使用 Pig UDF 应用程序的 Pig 作业。You can also run a Pig job that uses your Pig UDF application.

  1. 使用 SSH 连接到 HDInsight 群集。Use SSH to connect to your HDInsight cluster. (例如,运行命令 ssh sshuser@<clustername>-ssh.azurehdinsight.cn。)有关详细信息,请参阅将 SSH 与 HDInsight 配合使用(For example, run the command ssh sshuser@<clustername>-ssh.azurehdinsight.cn.) For more information, see Use SSH withHDInsight.

  2. 使用以下命令启动 Pig 命令行:Use the following command to start the Pig command line:

    pig
    

    此时显示 grunt> 提示。A grunt> prompt is displayed.

  3. 输入以下命令以运行使用 .NET Framework 应用程序的 Pig 作业:Enter the following to run a Pig job that uses the .NET Framework application:

    DEFINE streamer `PigUDF.exe` CACHE('/PigUDF.exe');
    LOGS = LOAD '/example/data/sample.log' as (LINE:chararray);
    LOG = FILTER LOGS by LINE is not null;
    DETAILS = STREAM LOG through streamer as (col1, col2, col3, col4, col5);
    DUMP DETAILS;
    

    DEFINE 语句为 PigUDF.exe 应用程序创建别名 streamerCACHE 从群集的默认存储中加载此别名。The DEFINE statement creates an alias of streamer for the PigUDF.exe application, and CACHE loads it from default storage for the cluster. 以后,可以将 streamerSTREAM 运算符配合使用来处理 LOG 中包含的单一行,并将数据返回为一系列的列。Later, streamer is used with the STREAM operator to process the single lines contained in LOG and return the data as a series of columns.

    备注

    用于流式处理的应用程序名称在使用别名时必须用 `(反斜杠引号)字符括起来,当与 SHIP 一起使用时必须用 '(单引号)字符括起来。The application name that is used for streaming must be surrounded by the ` (backtick) character when aliased, and by the ' (single quote) character when used with SHIP.

  4. 在输入最后一行后,该作业应该启动。After entering the last line, the job should start. 它返回类似于以下文本的输出:It returns output similar to the following text:

    (2019-07-15 16:43:25 SampleClass5 [WARN] problem finding id 1358451042 - java.lang.Exception)
    (2019-07-15 16:43:25 SampleClass5 [DEBUG] detail for id 1976092771)
    (2019-07-15 16:43:25 SampleClass5 [TRACE] verbose detail for id 1317358561)
    (2019-07-15 16:43:25 SampleClass5 [TRACE] verbose detail for id 1737534798)
    (2019-07-15 16:43:25 SampleClass7 [DEBUG] detail for id 1475865947)
    
  5. 使用 exit 退出 pig。Use exit to exit pig.

后续步骤Next steps

在本文档中,你已了解如何从 HDInsight 上的 Hive 和 Pig 使用 .NET Framework 应用程序。In this document, you've learned how to use a .NET Framework application from Hive and Pig on HDInsight. 如果希望了解如何将 Python 与 Hive 和 Pig 配合使用,请参阅在 HDInsight 中将 Python 与 Apache Hive 和 Apache Pig 配合使用If you would like to learn how to use Python with Hive and Pig, see Use Python with Apache Hive and Apache Pig in HDInsight.

若要了解 Hive 的其他用法以及如何使用 MapReduce,请参阅以下文章:For other ways to use Hive, and to learn about using MapReduce, see the following articles: