Azure HDInsight에서 Apache Spark 클러스터와 함께 Apache Zeppelin Notebook 사용Use Apache Zeppelin notebooks with Apache Spark cluster on Azure HDInsight

HDInsight Spark 클러스터에는 Apache Zeppelin Notebook이 포함되어 있습니다.HDInsight Spark clusters include Apache Zeppelin notebooks. 해당 Notebook을 사용하여 Apache Spark 작업을 실행합니다.Use the notebooks to run Apache Spark jobs. 이 문서에서는 HDInsight 클러스터에서 Zeppelin Notebook을 사용하는 방법에 대해 알아 봅니다.In this article, you learn how to use the Zeppelin notebook on an HDInsight cluster.

사전 요구 사항Prerequisites

  • HDInsight의 Apache Spark.An Apache Spark cluster on HDInsight. 자세한 내용은 Azure HDInsight에서 Apache Spark 클러스터 만들기를 참조하세요.For instructions, see Create Apache Spark clusters in Azure HDInsight.
  • 클러스터 기본 스토리지에 대한 URI 체계입니다.The URI scheme for your clusters primary storage. 이 체계는 wasb:// Azure Blob Storage, abfs:// Azure Data Lake Storage Gen2 또는 adl:// Azure Data Lake Storage Gen1에 적용될 수 있습니다.The scheme would be wasb:// for Azure Blob Storage, abfs:// for Azure Data Lake Storage Gen2 or adl:// for Azure Data Lake Storage Gen1. Blob Storage에 대해 보안 전송이 활성화된 경우 URI는 wasbs://입니다.If secure transfer is enabled for Blob Storage, the URI would be wasbs://. 자세한 내용은 Azure Storage에서 보안 전송 필요를 참조하십시오.For more information, see Require secure transfer in Azure Storage .

Apache Zeppelin Notebook 시작Launch an Apache Zeppelin notebook

  1. Spark 클러스터 개요 에서 클러스터 대시보드Zeppelin Notebook 을 선택합니다.From the Spark cluster Overview, select Zeppelin notebook from Cluster dashboards. 클러스터에 대한 관리자 자격 증명을 입력합니다.Enter the admin credentials for the cluster.

    참고

    또한 브라우저에서 다음 URL을 열어 클러스터에 대한 Zeppelin Notebook에 도달할 수 있습니다.You may also reach the Zeppelin Notebook for your cluster by opening the following URL in your browser. CLUSTERNAME 을 클러스터의 이름으로 바꿉니다.Replace CLUSTERNAME with the name of your cluster:

    https://CLUSTERNAME.azurehdinsight.net/zeppelin

  2. 새 Notebook을 만듭니다.Create a new notebook. 헤더 창에서 Notebook > 새 참고 만들기 로 이동합니다.From the header pane, navigate to Notebook > Create new note.

    새 Zeppelin 노트북 만들기

    노트북의 이름을 입력한 다음 참고 만들기 를 선택합니다.Enter a name for the notebook, then select Create Note.

  3. 노트북 헤더에 연결된 상태가 표시되는지 확인합니다.Ensure the notebook header shows a connected status. 오른쪽 상단 모서리에 녹색 점으로 표시됩니다.It's denoted by a green dot in the top-right corner.

    Zeppelin 노트북 상태

  4. 샘플 데이터를 임시 테이블에 로드합니다.Load sample data into a temporary table. HDInsight에서 Spark 클러스터를 만들면 샘플 데이터 파일인 hvac.csv\HdiSamples\SensorSampleData\hvac 아래의 연결된 스토리지 계정에 복사됩니다.When you create a Spark cluster in HDInsight, the sample data file, hvac.csv, is copied to the associated storage account under \HdiSamples\SensorSampleData\hvac.

    새 노트북에 기본적으로 만들어지는 빈 단락에 다음 코드 조각을 붙여넣습니다.In the empty paragraph that is created by default in the new notebook, paste the following snippet.

    %livy2.spark
    //The above magic instructs Zeppelin to use the Livy Scala interpreter
    
    // Create an RDD using the default Spark context, sc
    val hvacText = sc.textFile("wasbs:///HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv")
    
    // Define a schema
    case class Hvac(date: String, time: String, targettemp: Integer, actualtemp: Integer, buildingID: String)
    
    // Map the values in the .csv file to the schema
    val hvac = hvacText.map(s => s.split(",")).filter(s => s(0) != "Date").map(
        s => Hvac(s(0),
                s(1),
                s(2).toInt,
                s(3).toInt,
                s(6)
        )
    ).toDF()
    
    // Register as a temporary table called "hvac"
    hvac.registerTempTable("hvac")
    

    SHIFT + ENTER 를 누르거나 단락에 대한 재생 단추를 선택하여 코드 조각을 실행합니다.Press SHIFT + ENTER or select the Play button for the paragraph to run the snippet. 단락의 오른쪽 모서리 상태가 준비, 보류 중, 실행 중, 완료 순서로 진행됩니다.The status on the right-corner of the paragraph should progress from READY, PENDING, RUNNING to FINISHED. 출력은 같은 단락 하단에 표시됩니다.The output shows up at the bottom of the same paragraph. 스크린샷은 다음 이미지와 같습니다.The screenshot looks like the following image:

    원시 데이터에서 임시 테이블 만들기

    또한 각 단락에 제목을 제공할 수도 있습니다.You can also provide a title to each paragraph. 단락의 오른쪽 모서리에서 설정 아이콘(sprocket)을 선택한 다음 제목 표시 를 선택합니다.From the right-hand corner of the paragraph, select the Settings icon (sprocket), and then select Show title.

    참고

    %spark2 인터프리터는 모든 HDInsight 버전의 Zeppelin 노트북에서 지원되지 않으며 %sh 인터프리터는 HDInsight 4.0 이상에서는 지원되지 않습니다.%spark2 interpreter is not supported in Zeppelin notebooks across all HDInsight versions, and %sh interpreter will not be supported from HDInsight 4.0 onwards.

  5. 이제 hvac 테이블에서 Spark SQL 문을 실행할 수 있습니다.You can now run Spark SQL statements on the hvac table. 새 단락에 다음 쿼리를 붙여넣습니다.Paste the following query in a new paragraph. 쿼리가 빌딩 ID를 검색합니다.The query retrieves the building ID. 지정된 날짜의 각 빌딩의 대상 온도와 실제 온도 차이도 검색합니다.Also the difference between the target and actual temperatures for each building on a given date. Shift + Enter 를 누릅니다.Press SHIFT + ENTER.

    %sql
    select buildingID, (targettemp - actualtemp) as temp_diff, date from hvac where date = "6/1/13"
    

    %sql 문의 처음 부분은 Notebook에 Livy Scala 인터프리터를 사용하도록 지시합니다.The %sql statement at the beginning tells the notebook to use the Livy Scala interpreter.

  6. 막대형 차트 아이콘을 선택하면 표시 내용을 변경할 수 있습니다.Select the Bar Chart icon to change the display. 막대형 차트 를 선택하면 표시되는 설정 에서 을 선택할 수 있습니다.settings, appear after you have selected Bar Chart, allows you to choose Keys, and Values. 다음 스크린샷은 출력을 보여 줍니다.The following screenshot shows the output.

    Notebook1을 사용하여 Spark SQL 문 실행

  7. 또한 쿼리에 변수를 사용하여 Spark SQL 문을 실행할 수도 있습니다.You can also run Spark SQL statements using variables in the query. 다음 코드 조각은 쿼리할 수 있는 값이 포함된 쿼리에 변수 Temp를 정의하는 방법을 보여 줍니다.The next snippet shows how to define a variable, Temp, in the query with the possible values you want to query with. 쿼리를 처음 실행하면 드롭다운이 변수에 지정한 값으로 자동으로 채워집니다.When you first run the query, a drop-down is automatically populated with the values you specified for the variable.

    %sql  
    select buildingID, date, targettemp, (targettemp - actualtemp) as temp_diff from hvac where targettemp > "${Temp = 65,65|75|85}"
    

    새 단락에 이 코드 조각을 붙여넣고 Shift + Enter 를 누릅니다.Paste this snippet in a new paragraph and press SHIFT + ENTER. 그런 다음, Temp 드롭다운 목록에서 65 를 선택합니다.Then select 65 from the Temp drop-down list.

  8. 막대형 차트 아이콘을 선택하면 표시 내용을 변경할 수 있습니다.Select the Bar Chart icon to change the display. 그런 다음 설정 을 선택하고 다음과 같이 변경합니다.Then select settings and make the following changes:

    • 그룹: targettemp 를 추가합니다.Groups: Add targettemp.

    • 값: 1.Values: 1. 날짜 를 제거합니다.Remove date. 2.2. temp_diff 를 추가합니다.Add temp_diff. 3.3. 집계를 SUM 에서 AVG 로 변경합니다.Change the aggregator from SUM to AVG.

      다음 스크린샷은 출력을 보여 줍니다.The following screenshot shows the output.

      Notebook2를 사용하여 Spark SQL 문 실행

Notebook에서 외부 패키지 사용 방법How do I use external packages with the notebook?

HDInsight의 Apache Spark 클러스터에 있는 Zeppelin Notebook은 클러스터에 포함되지 않는 외부의 커뮤니티 제공 패키지를 사용할 수 있습니다.Zeppelin notebook in Apache Spark cluster on HDInsight can use external, community-contributed packages that aren't included in the cluster. 사용할 수 있는 패키지의 전체 목록은 Maven 리포지토리를 검색해 확인할 수 있습니다.Search the Maven repository for the complete list of packages that are available. 다른 소스에서 사용 가능한 패키지 목록을 가져올 수도 있습니다.You can also get a list of available packages from other sources. 예를 들어 커뮤니티 제공 패키지의 전체 목록은 Spark 패키지에서 사용할 수 있습니다.For example, a complete list of community-contributed packages is available at Spark Packages.

이 문서에서는 Jupyter Notebook으로 spark-csv 패키지를 사용하는 방법을 설명합니다.In this article, you'll see how to use the spark-csv package with the Jupyter Notebook.

  1. 인터프리터 설정을 엽니다.Open interpreter settings. 오른쪽 상단 모서리에서 로그인한 사용자 이름을 선택한 다음 인터프리터 를 선택합니다.From the top-right corner, select the logged in user name, then select Interpreter.

    인터프리터 시작

  2. livy2 로 스크롤한 다음 편집 을 선택합니다.Scroll to livy2, then select edit.

    인터프리터 설정1 변경

  3. livy.spark.jars.packages로 이동하여 해당 값을 형식 group:id:version로 설정합니다.Navigate to key livy.spark.jars.packages, and set its value in the format group:id:version. 따라서 spark-csv 패키지를 사용하려면 키 값을 com.databricks:spark-csv_2.10:1.4.0으로 설정해야 합니다.So, if you want to use the spark-csv package, you must set the value of the key to com.databricks:spark-csv_2.10:1.4.0.

    인터프리터 설정2 변경

    저장 을 선택한 다음 확인 을 선택하여 Livy 인터프리터를 다시 시작합니다.Select Save and then OK to restart the Livy interpreter.

  4. 위에서 입력한 키 값에 도달하는 방법을 이해하려면 여기를 참조하세요.If you want to understand how to arrive at the value of the key entered above, here's how.

    a.a. Maven Repository에서 패키지를 찾습니다.Locate the package in the Maven Repository. 이 문서에서는 spark-csv를 사용했습니다.For this article, we used spark-csv.

    b.b. 해당 리포지토리에서 GroupId, ArtifactIdVersion 값을 수집합니다.From the repository, gather the values for GroupId, ArtifactId, and Version.

    Jupyter Notebook으로 외부 패키지 사용

    다.c. 콜론(:)으로 구분된 세 개의 값을 연결합니다.Concatenate the three values, separated by a colon (:).

    com.databricks:spark-csv_2.10:1.4.0
    

Zeppelin Notebook 저장 위치Where are the Zeppelin notebooks saved?

Zeppelin Notebook은 클러스터 헤드 노드에 저장됩니다.The Zeppelin notebooks are saved to the cluster headnodes. 따라서 클러스터를 삭제하면 Notebook도 삭제됩니다.So, if you delete the cluster, the notebooks will be deleted as well. 나중에 다른 클러스터에서 사용하기 위해 Notebook을 유지하려면 작업 실행을 완료 한 후 Notebook을 내보내야 합니다.If you want to preserve your notebooks for later use on other clusters, you must export them after you have finished running the jobs. Notebook을 내보내려면 아래 이미지와 같이 내보내기 아이콘을 선택합니다.To export a notebook, select the Export icon as shown in the image below.

Notebook 다운로드

이렇게 하면 Notebook이 다운로드 위치에 JSON 파일로 저장됩니다.This action saves the notebook as a JSON file in your download location.

Shiro를 사용하여 ESP(Enterprise Security Package) 클러스터에서 Zeppelin 인터프리터에 대한 액세스 구성Use Shiro to Configure Access to Zeppelin Interpreters in Enterprise Security Package (ESP) Clusters

위에서 설명한 것처럼 %sh 인터프리터는 HDInsight 4.0 이상에서 지원되지 않습니다.As noted above, the %sh interpreter isn't supported from HDInsight 4.0 onwards. 또한 %sh 인터프리터는 셸 명령을 통한 keytab 액세스와 같은 잠재적인 보안 문제를 도입하기 때문에 HDInsight 3.6 ESP 클러스터에서도 제거되었습니다.Furthermore, since %sh interpreter introduces potential security issues, such as access keytabs using shell commands, it has been removed from HDInsight 3.6 ESP clusters as well. 즉, %sh 인터프리터는 새 참고 만들기 를 클릭해도 사용할 수 없고 인터프리터 UI에도 기본적으로 존재하지 않습니다.It means %sh interpreter isn't available when clicking Create new note or in the Interpreter UI by default.

권한을 가진 도메인 사용자는 Shiro.ini 파일을 사용하여 인터프리터 UI에 대한 액세스를 제어할 수 있습니다.Privileged domain users can use the Shiro.ini file to control access to the Interpreter UI. 권한을 가진 도메인 사용자만 새 %sh 인터프리터를 만들고 각각의 새 %sh 인터프리터에 대한 사용 권한을 설정할 수 있습니다.Only these users can create new %sh interpreters and set permissions on each new %sh interpreter. shiro.ini 파일을 사용하여 액세스를 제어하는 방법은 다음과 같습니다.To control access using the shiro.ini file, use the following steps:

  1. 기존 도메인 그룹 이름을 사용하여 새 역할을 정의합니다.Define a new role using an existing domain group name. 다음 예제에서 adminGroupName은 AAD의 권한을 가진 사용자 그룹입니다.In the following example, adminGroupName is a group of privileged users in AAD. 그룹 이름에 특수 문자나 공백을 사용하지 마십시오.Don't use special characters or white spaces in the group name. = 뒤의 문자는 이 역할에 대한 사용 권한을 부여합니다.The characters after = give the permissions for this role. *은 그룹에 모든 권한이 있음을 의미합니다.* means the group has full permissions.

    [roles]
    adminGroupName = *
    
  2. Zeppelin 인터프리터 액세스를 위한 새 역할을 추가합니다.Add the new role for access to Zeppelin interpreters. 다음 예제에서는 adminGroupName의 모든 사용자가 Zeppelin 인터프리터에 대한 액세스 권한을 부여받고 새 인터프리터를 만들 수 있습니다.In the following example, all users in adminGroupName are given access to Zeppelin interpreters and can create new interpreters. roles[]의 형태로 대괄호 사이에 여러 역할을 넣고 쉼표로 구분할 수 있습니다.You can put multiple roles between the brackets in roles[], separated by commas. 그런 다음 필요한 권한이 있는 사용자는 Zeppelin 인터프리터에 액세스할 수 있습니다.Then, users that have the necessary permissions, can access Zeppelin interpreters.

    [urls]
    /api/interpreter/** = authc, roles[adminGroupName]
    

Livy 세션 관리Livy session management

Zeppelin Notebook의 첫 번째 코드 단락으로 클러스터에 새 Livy 세션이 생성됩니다.The first code paragraph in your Zeppelin notebook creates a new Livy session in your cluster. 이 세션은 이후에 만드는 모든 Zeppelin Notebook에서 공유됩니다.This session is shared across all Zeppelin notebooks that you later create. 어떤 이유로든 Livy 세션이 종료되면 Zeppelin 노트북에서는 작업이 실행되지 않습니다.If the Livy session is killed for any reason, jobs won't run from the Zeppelin notebook.

이 경우 Zeppelin Notebook에서 작업 실행을 시작하기 전에 다음 단계를 수행해야 합니다.In such a case, you must do the following steps before you can start running jobs from a Zeppelin notebook.

  1. Zeppelin Notebook에서 Livy 인터프리터를 다시 시작합니다.Restart the Livy interpreter from the Zeppelin notebook. 그러려면 오른쪽 상단 모서리의 로그인한 사용자 이름을 선택하여 인터프리터 설정을 연 다음 인터프리터 를 선택합니다.To do so, open interpreter settings by selecting the logged in user name from the top-right corner, then select Interpreter.

    인터프리터 시작

  2. livy2 로 스크롤한 다음 다시 시작 을 선택합니다.Scroll to livy2, then select restart.

    Livy 인터프리터 다시 시작

  3. 기존 Zeppelin Notebook에서 코드 셀을 실행합니다.Run a code cell from an existing Zeppelin notebook. 이 코드로 HDInsight 클러스터에 새로운 Livy 세션이 생성됩니다.This code creates a new Livy session in the HDInsight cluster.

일반 정보General information

서비스 유효성 검사Validate service

Ambari에서 서비스의 유효성을 검사하려면 https://CLUSTERNAME.azurehdinsight.net/#/main/services/ZEPPELIN/summary로 이동합니다. 여기서 CLUSTERNAME은 클러스터의 이름입니다.To validate the service from Ambari, navigate to https://CLUSTERNAME.azurehdinsight.net/#/main/services/ZEPPELIN/summary where CLUSTERNAME is the name of your cluster.

명령줄에서 서비스의 유효성을 검사하려면 헤드 노드로 SSH를 수행합니다.To validate the service from a command line, SSH to the head node. 명령 sudo su zeppelin을 사용하여 사용자를 zeppelin으로 전환합니다.Switch user to zeppelin using command sudo su zeppelin. 상태 명령:Status commands:

명령Command DescriptionDescription
/usr/hdp/current/zeppelin-server/bin/zeppelin-daemon.sh status 서비스 상태.Service status.
/usr/hdp/current/zeppelin-server/bin/zeppelin-daemon.sh --version 서비스 버전.Service version.
ps -aux | grep zeppelin PID를 식별합니다.Identify PID.

로그 위치Log locations

서비스Service 경로Path
zeppelin-serverzeppelin-server /usr/hdp/current/zeppelin-server//usr/hdp/current/zeppelin-server/
서버 로그Server Logs /var/log/zeppelin/var/log/zeppelin
구성 인터프리터, Shiro, site.xml, log4jConfiguration Interpreter, Shiro, site.xml, log4j /usr/hdp/current/zeppelin-server/conf 또는/etc/zeppelin/conf/usr/hdp/current/zeppelin-server/conf or /etc/zeppelin/conf
PID 디렉터리PID directory /var/run/zeppelin/var/run/zeppelin

디버그 로깅 활성화Enable debug logging

  1. https://CLUSTERNAME.azurehdinsight.net/#/main/services/ZEPPELIN/summary으로 이동합니다. 여기서 CLUSTERNAME은 클러스터의 이름입니다.Navigate to https://CLUSTERNAME.azurehdinsight.net/#/main/services/ZEPPELIN/summary where CLUSTERNAME is the name of your cluster.

  2. CONFIGS > Advanced zeppelin-log4j-properties > log4j_properties_content 로 이동합니다.Navigate to CONFIGS > Advanced zeppelin-log4j-properties > log4j_properties_content.

  3. log4j.appender.dailyfile.Threshold = INFOlog4j.appender.dailyfile.Threshold = DEBUG로 수정합니다.Modify log4j.appender.dailyfile.Threshold = INFO to log4j.appender.dailyfile.Threshold = DEBUG.

  4. log4j.logger.org.apache.zeppelin.realm=DEBUG를 추가합니다.Add log4j.logger.org.apache.zeppelin.realm=DEBUG.

  5. 변경 내용을 저장하고 서비스를 다시 시작합니다.Save changes and restart service.

다음 단계Next steps