SpringBoot 로 Phoenix를 이용해서 HBASE로 Query를 날렸는데 다음과 같은 Exception을 발견하였습니다.



org.apache.phoenix.exception.PhoenixIOException: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions for user jdbc



이 문제는 JDBC 연결상의 문제라기 보다는, Spark로 Phoenix 사용하는 코드에도 동일하게 적용될수 있는 사항입니다


만약 HDP 계열을 사용하시다면, CDH, MapR도 비슷할것 같은데, 


현재 제 환경은 HDP 이기 떄문에


Ranger에서 HBASE에 테이블 접근권한을 주시면 됩니다. 

Spark로 개발하는 방법에는 여러가지가 있지만, 일단은 PySpark를 사용하고 있습니다 


다른 이유보다 너무 쉽게 됩니다.


현재 개발환경은, 개발서버에 Pycham 이 Direct로 붙는다는 환경이고 방화벽등의 환경에서는 달라질수 있습니다 


먼저 제 환경은 다음과 같습니다


개발툴 : Pycham Professional 

  - 서버의 파이썬 리모트 인터프리터 사용 

  - 시스템 기본 파이썬 인터프리터 사용


플랫폼 : HDP(Hortonworks Data Platform) 3.0.1




import os
import sys

os.environ['SPARK_HOME'] = "/usr/hdp/3.0.1.0-187/spark2"
os.environ['HIVE_HOME'] = "/usr/hdp/3.0.1.0-187/hive"
os.environ["HADOOP_USER_NAME"] = "spark"
os.environ['PYSPARK_SUBMIT_ARGS'] = '--master yarn --deploy-mode client ' \
'--num-executors 11 --executor-memory 19G --executor-cores 5 ' \
'--driver-memory 1G pyspark-shell'
sys.path.append("/usr/hdp/3.0.1.0-187/spark2/python")

from pyspark.sql import SparkSession
from pyspark.sql.functions import *

spark = SparkSession.builder.appName("pySpark1_redeyesofangel").getOrCreate()
spark.sql("select current_timestamp() ").show()
spark.stop()





소스는 매우 간단합니다. 해당코드는 Yarn client 모드로 동작하게 됩니다.  execturor 및 core는 각 클러스터 성능에 따라 맞춰주시면 됩니다.

 

기본적으로 서버에서 제공하는 파이썬 인터프리터를 사용할때(본예제에서는 우분투 16.04의 Python 2.7 사용중) pip install py4j 는 설치먼저 하셔야 합니다. 


단순히 해당 코드는 현재시간을 보여주는 코드입니다. Pycham에서 바로 run을 하면 다음과 같은 결과를 볼수 있습니다 




ssh://dev@192.168.0.140:22/usr/bin/python -u /tmp/pycharm_project_484/pySpark_1.py

Setting default log level to "WARN".

To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).

+--------------------+

| current_timestamp()|

+--------------------+

|2018-11-29 17:27:...|

+--------------------+



Process finished with exit code 0






다음에는 틈틈히 HIVE 연결, 데이터프레임 사용등등 올려보도록 하겠습니다 





일단, 하는중 일부는 Spark 로 처리한 데이터를 Hive에 테이블을 넣는게 있습니다.


사실 이때는 몰랐는데,


Spark 로 Hive 테이블을 읽으려는데 빈값이 나오더군요 .


사실 Spark 2.3? 인가 바뀌면서 enableHivesupport 인가 이옵션만 활성화 시키면 되서 , 뭐 다른문제인가 했는데,


사실 약간 조건적 상황인것 같은데, 현재 방법에서는 읽을 방법이 없는것 같습니다


HDP 3가 되면서 Hive에 기본적으로 테이블을 생성하면(Spark 로 생성하는게 아닌 Hive에서 직접) ACID가 적용이 되는데, 현재는 Spark 에서 접근할 방법이 없는것 같습니다.


물론, 강제적으로 alter table 해서 해결하면될것 같은 글들이 보이긴 하는데,



https://community.hortonworks.com/questions/170146/spark-not-reading-data-from-a-hive-managed-table-m.html


Spark not reading data from a Hive managed table. Meanwhile, Hive can query the data in the table just fine.

  1. // This query:
  2. sqlContext.sql("select * from retail_invoice").show
  3.  
  4. // gives this output:
  5.  
  6.  
  7. +---------+---------+-----------+--------+-----------+---------+----------+-------+
  8.  
  9.  
  10. |invoiceno|stockcode|description|quantity|invoicedate|unitprice|customerid|country|
  11.  
  12.  
  13. +---------+---------+-----------+--------+-----------+---------+----------+-------+
  14.  
  15.  
  16. +---------+---------+-----------+--------+-----------+---------+----------+-------+
  17.  
  18. // The Hive DDL for the table in HiveView 2.0:
  19. CREATE TABLE `retail_invoice`(
  20. `invoiceno` string,
  21. `stockcode` string,
  22. `description` string,
  23. `quantity` int,
  24. `invoicedate` string,
  25. `unitprice` double,
  26. `customerid` string,
  27. `country` string)
  28. CLUSTERED BY (
  29. stockcode)
  30. INTO 2 BUCKETS
  31. ROW FORMAT SERDE
  32. 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
  33. STORED AS INPUTFORMAT
  34. 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
  35. OUTPUTFORMAT
  36. 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
  37. LOCATION
  38. 'hdfs://hadoopsilon2.zdwinsqlad.local:8020/apps/hive/warehouse/retail_invoice'
  39. TBLPROPERTIES (
  40. 'COLUMN_STATS_ACCURATE'='{\"BASIC_STATS\":\"true\",\"COLUMN_STATS\":{\"country\":\"true\",\"quantity\":\"true\",\"customerid\":\"true\",\"description\":\"true\",\"invoiceno\":\"true\",\"unitprice\":\"true\",\"invoicedate\":\"true\",\"stockcode\":\"true\"}}',
  41. 'numFiles'='2',
  42. 'numRows'='541909',
  43. 'orc.bloom.filter.columns'='StockCode, InvoiceDate, Country',
  44. 'rawDataSize'='333815944',
  45. 'totalSize'='5642889',
  46. 'transactional'='true',
  47. 'transient_lastDdlTime'='1517516006')

I can query the data in Hive just fine. The data is inserted from Nifi using the PutHiveStreaming processor.

We have tried to recreate the table, but the same problem arises. I haven't found any odd looking configurations.

Any Ideas on what could be going on here?

 0
avatar image

Answer by Sivaprasanna 

@Matt Krueger

Your table is ACID i.e. transaction enabled. Spark doesn't support reading Hive ACID table. Take a look at SPARK-15348 and SPARK-16996


물론 방법이 없는것은 아닙니다. 아예 하이브를 이용하지 않고, Spark에서 하이브 테이블을 만들어서 사용하면 될것 같긴한데 아직 여러가지 방법은 시도해보지는 않았습니다.(일단 필요한 기능들은 다 되기 때문에)



확실히 HDP3 올라오면서 falcon 같은건 data plan platform 인가로 분리했고, 잘쓰던 Hive View 같은거는 Superset 이나, Tez View 같은경우는 다른 분슨 분석 플랫폼인가 분리한것 같습니다. 뭐 결론은 ambari extension으로 만든것 같은데,


뭐 일단은 쓰는게 HDP 다보니, .. 하 KUDA 하고 Impala가 그렇게 좋다는데 언제 써볼수 있을려나..







분명히 HDP3 에서 ranger에 제대로 설정되어 있는데


zepplin 이나 spark 에서 하이브 테이블이 안보입니다.


분명히 2.6때는 보였는데, 


HDP 3 되면서 정말 불친절해진 모양이네요 

  1. cp /etc/hive/conf/hive-site.xml /etc/spark2/conf

답은 매우 간단합니다. 클라이언트 노드에서 spark2 에 hive-site를 옮기시면 됩니다...

HDP3 되면서 자동으로 다 설정해주던건데

이제 다 수동으로 바뀐 모양인네요



https://community.hortonworks.com/questions/221974/zeppelin-not-showing-hive-databasetables-in-hdp30.html


Zeppelin : Not able to connect Hive Databases (through spark2) HDP3.0

I have installed Hortonworks hdp3.0 and configured Zeppelin as well.

When I running spark or sql Zeppelin only showing me default database(This is the default database from Spark which has location as '/apps/spark/warehouse', not the default database of Hive). This is probably because hive.metastore.warehouse.dir property is not set from hive-site.xml and zeppelin is picking this from Spark config (spark.sql.warehouse.dir).

I had similar issue with spark as well and it was due to hive-site.xml file on spark-conf dir, I was able to resolve this by copying hive-site.xml from hive-conf dir to spark-conf dir.

I did the same for Zeppelin as well, copied hive-site.xml in zeppelin dir(where it has zeppelin-site.xml and also copied in zeppelin-external-dependency-conf dir.

But this did not resolve the issue

*** Edit#1 - adding some additional information ***

I have create spark session by enabling hive support through enableHiveSupport(), and even tried setting spark.sql.warehouse.dir config property. but this did not help.

  1. import org.apache.spark.sql.SparkSession
  2.  
  3. val spark =SparkSession.builder.appName("Test Zeppelin").config("spark.sql.warehouse.dir","/apps/hive/db").enableHiveSupport().getOrCreate()

Through some online help, I am learnt that Zeppelin uses only Spark's hive-site.xml file, but I can view all hive databases through spark it's only in Zeppelin (through spark2) I am not able to access Hive databases.

Additionaly Zeppelin is not letting me choose programming language, it by default creates session with scala. I would prefer a Zeppeling session with pyspark.

Any help on this will be highly appreciated


Answer by Shantanu Sharma

After copying hive-site.xml from hive-conf dir to spark-conf dir, I restarted the spark services that reverted those changes, I copied hive-site.xml again and it's working now.


  1. Favicon of http://namioto.github.io BlogIcon namioto 2019.05.02 11:54

    안녕하세요. 근데 이렇게 하면 ambari에서 spark 재기동 시 설정을 덮어씌워버리지 않나요??

    • Favicon of https://redeyesofangel.tistory.com BlogIcon Yuika eizt 2019.05.06 17:57 신고

      정확히는, 저렇게 해버리면 spark trift server 였나 history server 였나. 이것이 재시작하다가 죽어버립니다.

      일단 몇가지 고민이 있는데, 저당시 저거 말고도 다른 문제가 ACID hive table을 spark에서 읽어오지 못하더라고요 (지금 드라이버가 새로 나온것 같습니다 )

      그래서 지금은 원래 설정대로 하고서, external table빼서 Spark에서 ORC 또는 Parquet를 직접처리하는 방법으로 변경하였습니다 .


HDP3 되면서, 많은것이 바뀌었습니다


일단 눈에 띄는 변화는 Hadoop3 이 들어갔다는것과 제눈에 볼때 딱 달라진건 Falcon 이 없어진것


그리고 Flume 이 없어졌다는


https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.6.3/bk_release-notes/content/deprecated_items.html

Deprecated Components and Product Capabilities

The following components are marked deprecated from HDP and will be removed in a future HDP release:

Component or CapabilityStatusMarked Deprecated as ofTarget Release for RemovalComments
Apache FalconDeprecatedHDP 2.6.0HDP 3.0.0Contact your Hortonworks account team for the replacement options.
Apache FlumeDeprecatedHDP 2.6.0HDP 3.0.0Consider Hortonworks DataFlow as an alternative for Flume use cases.
Apache MahoutDeprecatedHDP 2.6.0HDP 3.0.0Consider Apache Spark as an alternative depending on the workload.
Apache SliderDeprecatedHDP 2.6.0HDP 3.0.0Apache Slider functionality will be absorbed by Apache YARN.
CascadingDeprecatedHDP 2.6.0HDP 3.0.0 
HueDeprecatedHDP 2.6.0HDP 3.0.0Consider Ambari Views as the alternative.


저기서 Flume 이 없어졌는데 HDP3 되면서 싹 없애버렸네요.

사실 Nifi 가 나오면서 그 자리를 Nifi가 대체해버린다고 했는데, 정작 Nifi 는 보이질 않습니다 (HDP 내에서)


엄밀히 말하면, nifi는 HDF(Hortonworks Data Flow)라는 새로운 플랫폼으로 제공이 되고 있습니다.(물론 호튼웍스에서 제공하는 RPM으로 깔아도 됩니다.)


하지만 NIFI를 쓰고 싶은데, 굳이 Ambari에서 관리하고 싶으니 .. 


HDF를 설치하면 똑같이 Ambari에 Storm, Nifi가 들어간 플랫폼이 설치가 됩니다. 하지만 원하는건 HDP에 그대로 설치하는것이니 


물론 Hortonworks 에서 관련옵션을 제공합니다 


https://docs.hortonworks.com/HDPDocuments/HDF3/HDF-3.2.0/planning-your-deployment/content/deployment_scenarios.html

ScenarioInstallation ScenarioSteps

Installing an HDF Cluster

This scenario applies if you want to install the entire HDF platform, consisting of all flow management and stream processing components on a new cluster.

The stream processing components include the new Streaming Analytics Manager (SAM) modules that are in GA (General Availability). This includes the SAM Stream Builder and Stream Operations modules but does not include installing the technical preview version of SAM Stream Insight, which is powered by Druid and Superset.

This scenario requires that you install an HDF cluster.

  1. Install Ambari.
  2. Install databases.
  3. Install the HDF management pack.
  4. Install an HDF cluster using Ambari.

Installing HDF Services on a New HDP Cluster

This scenario applies to you if you are both an Hortonworks Data Platform (HDP) and HDF customer and you want to install a fresh cluster of HDP and add HDF services.

The stream processing components include the new (SAM) and all of its modules. This includes installing the technical preview version of the SAM Stream Insight module, which is powered by Druid and Apache Superset.

This scenario requires that you install both an HDF cluster and an HDP cluster.

  1. Install Ambari.
  2. Install databases.
  3. Install an HDP cluster using Ambari.
  4. Install the HDF management pack.
  5. Update the HDF base URL.
  6. Add HDF services to an HDP cluster

Installing HDF Services on an Existing HDP Cluster

You have an existing HDP cluster with Apache Storm and or Apache Kafka services and want to install Apache NiFi or NiFi Registry modules on that cluster.

This requires that you upgrade to the latest version of Apache Ambari and HDP, and then use Ambari to add HDF services to the upgraded HDP cluster.

  1. Upgrade Ambari
  2. Upgrade HDP
  3. Install Databases
  4. Install HDF Management Pack
  5. Update HDF Base URL
  6. Add HDF Services to HDP cluster

Installing HDF Services on an Existing HDP Cluster


아마, 많은 경우는 기존에 HDP에 HDF올리는 방법이 생각됩니다.

1. upgrade Ambari -- 최신버전 Ambari로 업그레이드 하라는 내용입니다

2. Upgrade HDP -- 이건 HDP 2.6 쓰면 3버전으로 올리나는 내용입니다 --> 이미 HDP3 이니 패스 

3. HDF에서 사용할 메타 DB에 내용을 추가하라는 내용입니다. 선택지는 oracle,postgres,mysql 이 있지만 일단 저는 postgres


https://docs.hortonworks.com/HDPDocuments/HDF3/HDF-3.2.0/installing-hdf-and-hdp/content/installing_databases.html


해당 페이지에 있는 내용 그대로 postgres에 쿼리 몇줄만 쓰면됩니다. 거의다 create database, table 이런거라 기존 ambari가 사용하는 테이블은 안건드리니 하셔도 될것 같습니다 



아마 이부분은 확인은 안해봤는데, ambari 깔릴때 사용하는 postgres를 하면 이미 되어있거나 그럴것 같네요
  1. Log in to Postgres:
    sudo su postgres
    psql
  2. Create a database called registry with the password registry:
    create database registry;
    CREATE USER registry WITH PASSWORD 'registry';
    GRANT ALL PRIVILEGES ON DATABASE "registry" to registry;
  3. Create a database called streamline with the password streamline:
    create database streamline;
    CREATE USER streamline WITH PASSWORD 'streamline';
    GRANT ALL PRIVILEGES ON DATABASE "streamline" to streamline;

  1. Log in to Postgres:
    sudo su postgres
    psql
  2. Create a database, user, and password, each called druid, and assign database privileges to the user druid:
    create database druid;
    CREATE USER druid WITH PASSWORD 'druid';
    GRANT ALL PRIVILEGES ON DATABASE  "druid" to druid;
  3. Create a database, user, and password, each called superset, and assign database privileges to the user superset:
    create database superset;
    CREATE USER superset WITH PASSWORD 'superset';
    GRANT ALL PRIVILEGES ON DATABASE "superset" to superset;Install HDF Management Pack



4. Install HDF Management Pack

Ambari 에 HDF 스택을 추가하는것입니다 



  1. Download the Hortonworks HDF management pack. You can find the download location for your operating system in the HDF Release Notes.
  2. Copy the bundle to /tmp on the node where you installed Ambari.
  3. Install the management pack:
    ambari-server install-mpack \
    --mpack=/tmp/hdf-ambari-mpack-<version>.tar.gz \
    --verbose
  4. Restart the Ambari server:
    ambari-server restart


https://docs.hortonworks.com/HDPDocuments/HDF3/HDF-3.1.2/bk_release-notes/content/ch_hdf_relnotes.html#repo-location


릴리즈 노트를 보시면 해당파일을 구하실수 있습니다 


Table 1.5. RHEL/Oracle Linux/CentOS 6 HDF repository & additional download locations

OSFormatDownload location
RHEL/Oracle Linux/CentOS 6 (64-bit):HDF Build number3.1.2.0-7
HDF Base URLhttp://public-repo-1.hortonworks.com/HDF/centos6/3.x/updates/3.1.2.0
HDF Repohttp://public-repo-1.hortonworks.com/HDF/centos6/3.x/updates/3.1.2.0/hdf.repo
RPM tarballhttp://public-repo-1.hortonworks.com/HDF/centos6/3.x/updates/3.1.2.0/HDF-3.1.2.0-centos6-rpm.tar.gz
Tars tarballhttp://public-repo-1.hortonworks.com/HDF/centos6/3.x/updates/3.1.2.0/HDF-3.1.2.0-centos6-tars-tarball.tar.gz
HDF Management Packhttp://public-repo-1.hortonworks.com/HDF/centos6/3.x/updates/3.1.2.0/tars/hdf_ambari_mp/hdf-ambari-mpack-3.1.2.0-7.tar.gz
MiNiFi C++http://public-repo-1.hortonworks.com/HDF/centos6/3.x/updates/3.1.2.0/tars/nifi-minifi-cpp/nifi-minifi-cpp-0.4.0-bin.tar.gz
HDP and Ambari Repositories
Ambarihttp://public-repo-1.hortonworks.com/ambari/centos6/2.x/updates/2.6.2.0/ambari.repo
HDPhttp://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.6.5.0/hdp.repo
HDP-UTILS Base URLhttp://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.22/repos/centos6
OS Agnostic Downloads
NiFi only
NiFi Toolkit
Docker Hub

https://hub.docker.com/r/hortonworks/nifi/

Tags are latest and 3.1.2.0

NiFi Registry
MiNiFi Java Agent
MiNiFi Toolkit
iOS/Android Libraries


Table 1.6. RHEL/Oracle Linux/CentOS 7 HDF repository & additional download locations

OSFormatDownload location
RHEL/Oracle Linux/CentOS 7 (64-bit):HDF Build Number3.1.2.0-7
HDF Base URLhttp://public-repo-1.hortonworks.com/HDF/centos7/3.x/updates/3.1.2.0
HDF Repohttp://public-repo-1.hortonworks.com/HDF/centos7/3.x/updates/3.1.2.0/hdf.repo
RPM tarballhttp://public-repo-1.hortonworks.com/HDF/centos7/3.x/updates/3.1.2.0/HDF-3.1.2.0-centos7-rpm.tar.gz
Tars tarballhttp://public-repo-1.hortonworks.com/HDF/centos7/3.x/updates/3.1.2.0/HDF-3.1.2.0-centos7-tars-tarball.tar.gz
HDF Management Packhttp://public-repo-1.hortonworks.com/HDF/centos7/3.x/updates/3.1.2.0/tars/hdf_ambari_mp/hdf-ambari-mpack-3.1.2.0-7.tar.gz
MiNiFi C++ Agenthttp://public-repo-1.hortonworks.com/HDF/centos7/3.x/updates/3.1.2.0/tars/nifi-minifi-cpp/nifi-minifi-cpp-0.4.0-bin.tar.gz
HDP and Ambari Repositories
Ambarihttp://public-repo-1.hortonworks.com/ambari/centos7/2.x/updates/2.6.2.0/ambari.repo
HDPhttp://public-repo-1.hortonworks.com/HDP/centos7/2.x/updates/2.6.5.0/hdp.repo
HDP-UTILS Base URLhttp://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.22/repos/centos7
OS Agnostic Downloads
NiFi only
NiFi Toolkit
Docker Hub

https://hub.docker.com/r/hortonworks/nifi/

Tags are latest and 3.1.2.0

NiFi Registry
MiNiFi Java Agent
MiNiFi Toolkit
iOS/Android Libraries


Table 1.7. SLES 11 SP3/SP4 HDF repository & additional download locations

OSFormatDownload location
SUSE Enterprise Linux 11 SP3, SP4HDF Build Number3.1.2.0-7
HDF Base URLhttp://public-repo-1.hortonworks.com/HDF/suse11sp3/3.x/updates/3.1.2.0
Repohttp://public-repo-1.hortonworks.com/HDF/suse11sp3/3.x/updates/3.1.2.0/hdf.repo
RPM tarballhttp://public-repo-1.hortonworks.com/HDF/suse11sp3/3.x/updates/3.1.2.0/HDF-3.1.2.0-suse11sp3-rpm.tar.gz
Tars tarballhttp://public-repo-1.hortonworks.com/HDF/suse11sp3/3.x/updates/3.1.2.0/HDF-3.1.2.0-suse11sp3-tars-tarball.tar.gz
HDF Management Packhttp://public-repo-1.hortonworks.com/HDF/suse11sp3/3.x/updates/3.1.2.0/tars/hdf_ambari_mp/hdf-ambari-mpack-3.1.2.0-7.tar.gz
HDP and Ambari Repositories
Ambarihttp://public-repo-1.hortonworks.com/ambari/suse11/2.x/updates/2.6.2.0/ambari.repo
HDPhttp://public-repo-1.hortonworks.com/HDP/suse11sp3/2.x/updates/2.6.5.0/hdp.repo
HDP-UTILS Base URLhttp://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.22/repos/suse11sp3
OS Agnostic Downloads
NiFi only
NiFi Toolkit
Docker Hub

https://hub.docker.com/r/hortonworks/nifi/

Tags are latest and 3.1.2.0

NiFi Registry
MiNiFi Java Agent
MiNiFi Toolkit
iOS/Android Libraries


Table 1.8. SLES 12 HDF repository & additional download locations

OSFormatDownload location
SUSE Linux Enterprise Server (SLES) v12 SP1HDF Build Number3.1.2.0-7
HDF Base URLhttp://public-repo-1.hortonworks.com/HDF/sles12/3.x/updates/3.1.2.0
Repohttp://public-repo-1.hortonworks.com/HDF/sles12/3.x/updates/3.1.2.0/hdf.repo
RPM tarballhttp://public-repo-1.hortonworks.com/HDF/sles12/3.x/updates/3.1.2.0/HDF-3.1.2.0-sles12-rpm.tar.gz
Tars tarballhttp://public-repo-1.hortonworks.com/HDF/sles12/3.x/updates/3.1.2.0/HDF-3.1.2.0-sles12-tars-tarball.tar.gz
HDF Management Packhttp://public-repo-1.hortonworks.com/HDF/sles12/3.x/updates/3.1.2.0/tars/hdf_ambari_mp/hdf-ambari-mpack-3.1.2.0-7.tar.gz
HDP and Ambari Repositories
Ambarihttp://public-repo-1.hortonworks.com/ambari/sles12/2.x/updates/2.6.2.0/ambari.repo
HDPhttp://public-repo-1.hortonworks.com/HDP/sles12/2.x/updates/2.6.5.0/hdp.repo
HDP-UTILS Base URLhttp://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.22/repos/sles12
OS Agnostic Downloads
NiFi only
NiFi Toolkit
Docker Hub

https://hub.docker.com/r/hortonworks/nifi/

Tags are latest and 3.1.2.0

NiFi Registry
MiNiFi Java Agent
MiNiFi Toolkit
iOS/Android Libraries


Table 1.9. Ubuntu 14 HDF repository & additional download locations

OSFormatDownload location
Ubuntu Trusty (14.04) (64-bit)HDF Build Number3.1.2.0-7
HDF Base URLhttp://public-repo-1.hortonworks.com/HDF/ubuntu14/3.x/updates/3.1.2.0
Repohttp://public-repo-1.hortonworks.com/HDF/ubuntu14/3.x/updates/3.1.2.0/hdf.list
Deb tarballhttp://public-repo-1.hortonworks.com/HDF/ubuntu14/3.x/updates/3.1.2.0/HDF-3.1.2.0-ubuntu14-deb.tar.gz
Tars tarballhttp://public-repo-1.hortonworks.com/HDF/ubuntu14/3.x/updates/3.1.2.0/HDF-3.1.2.0-ubuntu14-tars-tarball.tar.gz
HDF Management Packhttp://public-repo-1.hortonworks.com/HDF/ubuntu14/3.x/updates/3.1.2.0/tars/hdf_ambari_mp/hdf-ambari-mpack-3.1.2.0-7.tar.gz
HDP and Ambari Repositories
Ambarihttp://public-repo-1.hortonworks.com/ambari/ubuntu14/2.x/updates/2.6.2.0/ambari.list
HDPhttp://public-repo-1.hortonworks.com/HDP/ubuntu14/2.x/updates/2.6.5.0/hdp.list
HDP-UTILS Base URLhttp://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.22/repos/ubuntu14
OS Agnostic Downloads
NiFi only
NiFi Toolkit
Docker Hub

https://hub.docker.com/r/hortonworks/nifi/

Tags are latest and 3.1.2.0

NiFi Registry
MiNiFi Java Agent
MiNiFi Toolkit
iOS/Android Libraries


Table 1.10. Ubuntu 16 HDF repository & additional download locations

OSFormatDownload location
Ubuntu Trusty 16 (64-bit)HDF Build Number3.1.2.0-7
HDF Base URLhttp://public-repo-1.hortonworks.com/HDF/ubuntu16/3.x/updates/3.1.2.0
Repohttp://public-repo-1.hortonworks.com/HDF/ubuntu16/3.x/updates/3.1.2.0/hdf.list
Deb tarballhttp://public-repo-1.hortonworks.com/HDF/ubuntu16/3.x/updates/3.1.2.0/HDF-3.1.2.0-ubuntu16-deb.tar.gz
Tars tarballhttp://public-repo-1.hortonworks.com/HDF/ubuntu16/3.x/updates/3.1.2.0/HDF-3.1.2.0-ubuntu16-tars-tarball.tar.gz
HDF Management Packhttp://public-repo-1.hortonworks.com/HDF/ubuntu16/3.x/updates/3.1.2.0/tars/hdf_ambari_mp/hdf-ambari-mpack-3.1.2.0-7.tar.gz
MiNiFi C++ Agenthttp://public-repo-1.hortonworks.com/HDF/ubuntu16/3.x/updates/3.1.2.0/tars/nifi-minifi-cpp/nifi-minifi-cpp-0.4.0-bin.tar.gz
HDP and Ambari Repositories
Ambarihttp://public-repo-1.hortonworks.com/ambari/ubuntu16/2.x/updates/2.6.2.0/ambari.list
HDPhttp://public-repo-1.hortonworks.com/HDP/ubuntu16/2.x/updates/2.6.5.0/hdp.list
HDP-UTILS Base URLhttp://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.22/repos/ubuntu16
OS Agnostic Downloads
NiFi only
NiFi Toolkit
Docker Hub

https://hub.docker.com/r/hortonworks/nifi/

Tags are latest and 3.1.2.0

NiFi Registry
MiNiFi Java Agent
MiNiFi Toolkit
iOS/Android Libraries


Table 1.11. Debian 7 HDF repository & additional download locations

OSFormatDownload location
Debian 7HDF Build Number3.1.2.0-7
HDF Base URLhttp://public-repo-1.hortonworks.com/HDF/debian7/3.x/updates/3.1.2.0
Repohttp://public-repo-1.hortonworks.com/HDF/debian7/3.x/updates/3.1.2.0/hdf.list
Deb tarballhttp://public-repo-1.hortonworks.com/HDF/debian7/3.x/updates/3.1.2.0/HDF-3.1.2.0-debian7-deb.tar.gz
Tars tarballhttp://public-repo-1.hortonworks.com/HDF/debian7/3.x/updates/3.1.2.0/HDF-3.1.2.0-debian7-tars-tarball.tar.gz
HDF Management Packhttp://public-repo-1.hortonworks.com/HDF/debian7/3.x/updates/3.1.2.0/tars/hdf_ambari_mp/hdf-ambari-mpack-3.1.2.0-7.tar.gz
HDP and Ambari Repositories
Ambarihttp://public-repo-1.hortonworks.com/ambari/debian7/2.x/updates/2.6.2.0/ambari.list
HDPhttp://public-repo-1.hortonworks.com/HDP/debian7/2.x/updates/2.6.5.0/hdp.list
HDP-UTILS Base URLhttp://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.22/repos/debian7
OS Agnostic Downloads
NiFi only
NiFi Toolkit
Docker Hub

https://hub.docker.com/r/hortonworks/nifi/

Tags are latest and 3.1.2.0

NiFi Registry
MiNiFi Java Agent
MiNiFi Toolkit
iOS/Android Libraries


이렇게 하시고 ambari를 재시작하시면 HDF가 추가되어 있습니다 



Falcon 도 HDP3 되면서 없어지면


https://hortonworks.com/products/data-services/


DataPlane Service로 플랫폼 DPS?가 된것 같더군요. 아마도 이것도 이런식으로 추가해서 사용하면 되지 않을까.. 버전이 바뀔때마다 휙휙 바뀌니 손에 익어서 HDP는 계속 사용하고 있지만..




Zepplin 만 쓰다가, Intellj + SBT + Scala 조합으로 Spark 프로그램을 만들다 보니, 

열받는게, Zepplin 의 경우 중간중간 쉽게 중간 값을 볼수 있었는데, 일반적인 개발방법은 엄청 불편하다고 생각했는데,


아니나 다를까, Spark 원격 디버깅 하는 방법이 존재


1. sbt assembly 해서 Spark 패키지 만들고

2. 파일을 서버에 업로드(Sbt에 Deploy 플러그인 있는데, 이런걸 이용하면 편할듯) 

   -- 이런것이 없으면 디버깅 할때마다 이짓을 해야됨


3. Spark Client (실행노드)에서 다음을 입력

  - 물론, 생각에 따라서는 Bashrc에 넣어도 상관없을듯


export SPARK_SUBMIT_OPTS= agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=4000


4. spark-submit 


5. Intellj Debug 모드 시작


저 명령어가 나온상태에서 intellj 에서 Debug 모드를 키면 정의한 SparkJob이 yarn-client 모드로 배포되고 


브레이크 포인트를 지정한 해당 부분에 걸림 




이렇게 하면 흔히, 호튼웍스나 스파크싸이트에서 말하는 원격 디버깅을 할수 있는데, 

문제는 할때마다 assembly해서 배포해야함

아무래도 이부분은 sbt plugin을 이용해서 자동배포하면 편할것 같은.. 




스파크 스트리밍 코드를 묶다가 예전에 있던 코드를 활용했더니 ... 


[warn]  ::::::::::::::::::::::::::::::::::::::::::::::

[warn]  ::          UNRESOLVED DEPENDENCIES         ::

[warn]  ::::::::::::::::::::::::::::::::::::::::::::::

[warn]  :: com.eed3si9n#sbt-assembly;0.11.2: not found

[warn]  ::::::::::::::::::::::::::::::::::::::::::::::

[warn]

[warn]  Note: Some unresolved dependencies have extra attributes.  Check that these dependencies exist with the requested attributes.

[warn]          com.eed3si9n:sbt-assembly:0.11.2 (scalaVersion=2.12, sbtVersion=1.0)

[warn]


해결방법


https://github.com/sbt/sbt-assembly


확인해서 버전을 맞춰야함 


Setup

Using Published Plugin

For sbt 0.13.6+ and sbt 1.0.0-M6, add sbt-assembly as a dependency in project/assembly.sbt:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.7")

For older sbt 0.13.x, see sbt-assembly 0.11.2.

For sbt 0.12, see sbt-assembly 0.9.2.

(You may need to check this project's tags to see what the most recent release is.)



해당 오류는 Mysql-connector-java 가 5.1.22 버전보다 낮아서 생기는 문제입니다


만약 클러스터에서 해당 오류가 spark,hive등에서 발생하고 있다면, jdbc를 변경해주시면 됩니다 



https://community.hortonworks.com/articles/70912/hive-metastore-not-working-syntax-error-option-sql.html



저 같은경우는


1.jdbc를 받은다음


1.ambari-server resources 패치 

/var/lib/ambari-server/resource 내의 mysql-connector-java


그리고 각 클라이언트 또는 hive 가 깔린 /usr/hdp/버전/hive/lib 내의 mysql-connetor-java를 해당 버전으로 바꾼뒤 서비스를 다시 시작하였습니다





Cassandra 테이블을 스파크 데이터와 join 하고 싶을때 


https://github.com/datastax/spark-cassandra-connector/blob/master/doc/14_data_frames.md


datastax , 쉽게 생각하면 카산드라 벤더에서 만든 스파크 드라이버를 이용 


val createDDL = """CREATE TEMPORARY VIEW/TABLE words USING org.apache.spark.sql.cassandra OPTIONS ( table "words", keyspace "test", cluster "Test Cluster", pushdown "true")""" spark.sql(createDDL) // Creates Catalog Entry registering an existing Cassandra Table

View 또는 TABLE로 맵핑해서 SparkSQL로 사용





아파츠 재플린 , apache Zepplin아파츠 재플린 , apache Zepplin




몰랐는데, 재플린에서도 Code Assistant 기능이 있었네요..


사용법


sc를 치고  CTRL 키를 누른상태에서 . 을 누르면 어시스턴스 기능이 나옵니다. 


아파츠 재플린 , apache Zepplin아파츠 재플린 , apache Zepplin



하 이렇게 좋은걸 모르고 있었다니... 



최근 클러스터 환경을  HDP(Hortonworks Data Platform) 2.5.3.0 -> HDP 2.6.1.0으로 올리면서


Spark 환경을 1.6 -> 2.1 로 바꾸었습니다.



사실 스칼라도 해보겠다고 두꺼운 Programming in Scala 3판도 샀지만..... 이미 초심은..


그러던 도중 ... 


분명히 Zepplien 에서 1.6에서 Parquet 파일을 Table로 저장할때, 


sqlContext.parquetFile("/tmp/extracted").sveAsTable("step01");


로 했던것 같은데.. Spark를 2버전으로 바꾸니 saveAsTable is not a member of org.apache.spark.sql.DataFrame


다음과 같은 오류가 나네요 .. 아마 내부 API나 어떤 변경이 있겠지만.. 역시 구글신 


sqlContext.parquetFile("/tmp/extracted").write.format("parquet").saveAsTable("step01")


다음으로 변경하니 , 제대로 저장이 되네요.








Spark에서 paruqet 압축 알고리즘을 찾다가. 

분명히 두가지 방법중 한가지 방법이면 된다고 하는것 같은데


sqlContext.setConf("spark.sql.psqlContext.setConf("spark.sql.parquet.compression.codec", "snappy")
sqlContext.sql("SET spark.sql.parquet.compression.codec=snappy")


저는 이것이 동작하네요 
sqlContext.sql("SET spark.sql.parquet.compression.codec=snappy")

사용하는 화경은 HDP 2.5 Spark 1.6 입니다




Parquet + Spark 조합을 사용하고 있습니다


SparkSQL로 처리하기가 애매한 상황이라.  

직접 코딩좀 할일이 있어서 Scala를 만지는데 ...


1. sbt에 잘몰라서 설정하는데 고생

2. sbt와 스칼라버전과 build.sbt 의 %,%% 차이를 몰라서 고생

3. 책을 보고 있는데, 자바하고 문법이 비슷한것 같은데

   이제는 파이썬에 너무 익숙해져서 스칼라가 눈에 잘 안들어오는...



맨날 HDP 에 설치가 잘된 제플린을 사용하다보니,,

수동으로 제플린을 사용하려고 하니 HIVE를 사용하려고 하니 다음과 같은 오류가 발생합니다.

Prefix not found.

paragraph_1493986135331_752263516's Interpreter hive not found
org.apache.zeppelin.interpreter.InterpreterException: paragraph_1493986135331_752263516's Interpreter hive not found at org.apache.zeppelin.notebook.Note.run(Note.java:605) at org.apache.zeppelin.socket.NotebookServer.persistAndExecuteSingleParagraph(NotebookServer.java:1641) at org.apache.zeppelin.socket.NotebookServer.runAllParagraphs(NotebookServer.java:1588) at org.apache.zeppelin.socket.NotebookServer.onMessage(NotebookServer.java:268) at org.apache.zeppelin.socket.NotebookSocket.onWebSocketText(NotebookSocket.java:59) at org.eclipse.jetty.websocket.common.events.JettyListenerEventDriver.onTextMessage(JettyListenerEventDriver.java:128) at org.eclipse.jetty.websocket.common.message.SimpleTextMessage.messageComplete(SimpleTextMessage.java:69) at org.eclipse.jetty.websocket.common.events.AbstractEventDriver.appendMessage(AbstractEventDriver.java:65) at org.eclipse.jetty.websocket.common.events.JettyListenerEventDriver.onTextFrame(JettyListenerEventDriver.java:122) at org.eclipse.jetty.websocket.common.events.AbstractEventDriver.incomingFrame(AbstractEventDriver.java:161) at org.eclipse.jetty.websocket.common.WebSocketSession.incomingFrame(WebSocketSession.java:309) at org.eclipse.jetty.websocket.common.extensions.ExtensionStack.incomingFrame(ExtensionStack.java:214) at org.eclipse.jetty.websocket.common.Parser.notifyFrame(Parser.java:220) at org.eclipse.jetty.websocket.common.Parser.parse(Parser.java:258) at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.readParse(AbstractWebSocketConnection.java:632) at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onFillable(AbstractWebSocketConnection.java:480) at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) at java.lang.Thread.run(Thread.java:745)


제가 사용한 제플린 버전은 1.7.1 버전이고 이유는 간단합니다.

HIVE 인터프리터가 없기 때문입니다.


설정방법은 여기 친절하게 나와있습니다.


https://zeppelin.apache.org/docs/0.7.1/interpreter/hive.html



설명은 간단하지만,, 분명히 HDP에서 제플린으로 HIVE사용할때는 %hive 사용했던것 같은데..


제플린을 오래 사용하지 않아서 jdbc로 통합된것 같더군요


먼저 Hadoop 홈폴더에 보면 share 폴더 아래 hadoop 아래 common이라는 폴더가 있을겁니다.

여기서 hadoop-common을 제플린 폴더의 interpreter 폴더 jdbc 폴더 안에 복사합니다


그다음 hive 홈폴더에서 lib 폴더에 보면 hive-jdbc-standalone이라는 jar 파일이 있습니다 

마찬가지로 제플린 interpreter 폴더 jdbc 에 복사합니다


그다음 제플린 UI에서 인터프리터를 여신다음 여기서 jdbc를 검색합니다

그다음 jdbc에 다음을 추가합니다

hive.driver   = org.apache.hive.jdbc.HiveDriver

hive.password = 자신의 설정

hive.url =자신의 설정

hive.user =자신의 설정


그다음 제플린 데몬을 제시작하면


%hive(jdbc) 하신다음 바로 사용이 가능합니다.





....추가적으로 지금 제플린에 yarn-client 모드로 spark 엮고 있는데, 이거 제대로 되면 방법도 올려보겠습니다.


맨날 벤더 하둡 쓰려다가 ㅠㅠㅠ self-deployed 하둡 쓰려니까 어렵네요 ㅠㅠ 
























twitter scrooge 를 


spark scala 코드를 만지고 있는데, 다음과 같은 오류가 발생한다면


build.sbt에 아래를 추가하시면 될것 같습니다.


resolvers ++= Seq(
"Twitter Maven Repo" at "http://maven.twttr.com"
)


잘은 모르겟지만 libthrift 저게 maven centeral repo에는 업다고 하네요 



잠깐동안 예제를 따라해보면서 해본 느낌은.. 


잘 모르겠지만 엄청 간단합니다. 


먼저 Parallel Python에서 http://www.parallelpython.com/content/view/18/32/ 에서 다운 받아서, pp를 다운받아서, 돌아갈 머신과 마스터 노드에 python setup.py install 하면 끝..


그리고 사용방법은 계산노드(slave)에서 ppserver.py -a(auto discovery) 하면 끝.. 물론 포트를 지정해 준다면 -p 옵션을 사용하면됩니다. 


그런다음 마스터 노드에서 다음과 같은 방법으로 하면됩니다.  (지금 같은경우는 1master node, 1slave node로 구성된 케이스)



import sys,thread
import pp
class myTest:
def __init__(self):
self.value=0
self.lock = thread.allocate_lock()

def result(self, value):
self.lock.acquire()
self.value += value
self.lock.release()


def mysum(n):
result=0
for i in range(1,1000):
result+=i
return result



sum = myTest()

ppserver= ppservers=("*",)

job_server = pp.Server(ppservers=ppservers)
job1 = job_server.submit(mysum,(100,),callback=sum.result)

job_server.print_stats()

job_server.wait()

print "result is "+str(sum.value)

job_server.print_stats()

#ppservers = ("10.0.0.1",)


slave서버를 입력 하는 방법인데 ppserver("*",) 이 방법은 Master노드와 같은 대역에 있을대 저렇게 하면, 자동으로 인식이됨 저 코드의 경우 1master node에서 1 slave노드에게 계산하라고 해서 callback 한 결과를 보여주고 있습니다. 


Job execution statistics:

 job count | % of all jobs | job time sum | time per job | job server

         1 |        100.00 |       0.0000 |     0.000000 | local

Time elapsed since server creation 0.00300002098083

1 active tasks, 8 cores


result is 499500

Job execution statistics:

 job count | % of all jobs | job time sum | time per job | job server

         1 |        100.00 |       0.0010 |     0.001000 | local

Time elapsed since server creation 0.00399994850159

0 active tasks, 8 cores



몇가지 궁금한게 생겼는데,, 결국에는 RabiitMq같은 Queue는 필요없을것 같은데,, 다중 노드는 어떻게 명령을 내려야되는거며, 어떻게 중간에 합치는게 따로 있나.  그리고 어짜피 쓰레드는 길(GIL)이 걸릴테니, 멀티프로세싱으로 하고 싶은데,, 이것도 되려나.. (답은 간단하더군요)

결론은 파이썬 신기합니다. . 

추가:: 방금전에 해본결과로는 결국에는 작동하는 로컬밖에 나오지 않았습니다. 
사실 몇가지 실험을 해보았는데, 결론은 다음과 같았다  이번에는 모든 10노드를 전부 기동시키고 
연산작업을... 한 1000개를 걸어보았습니다. 

Job execution statistics:
 job count | % of all jobs | job time sum | time per job | job server
        26 |         16.15 |      28.5401 |     1.097695 | 192.168.1.203:60000
        28 |         17.39 |      26.5884 |     0.949585 | 192.168.1.206:60000
         8 |          4.97 |       5.8869 |     0.735865 | 192.168.1.204:60000
         8 |          4.97 |       4.0038 |     0.500477 | 192.168.1.100:60000
         6 |          3.73 |       4.7484 |     0.791398 | 192.168.1.201:60000
        13 |          8.07 |      13.5061 |     1.038933 | 192.168.1.207:60000
        10 |          6.21 |      10.0583 |     1.005829 | 192.168.1.209:60000
        26 |         16.15 |      77.0360 |     2.962923 | local
        36 |         22.36 |      35.4551 |     0.984865 | 192.168.1.208:60000


결과는 다음과 같은데 10노드가 전부 활동하지는 않습니다... 예상에는 알아서 스케쥴링을 하거나, 현재의 상황을 찍었을때 찰나에는 다른 노드에서 일을하지 않고 있거나 그런것 같습니다. 

이 결과를 찾기 위해 이짓 저짓을 많이 해봤는데, 

어쩌면 이 당연한 사실을 찾기위해 몇시간을 순간 날렸네요.

결국은 파이썬이 신기하네요. 하지만 전 그래도 Java가 좋아요,,

스칼라도 공부해야되는데..





몇가지 처리해야할 작업이 있습니다. 


몇 가지 케이스에 대해 계속 테스트를 해보고 있지만. 이걸 Hadoop MapReduce로 처리하는것은 정말 성능이 안나오더군요. 흔히 말한는 반복적인 작업... 이걸 Storm, 또는 Spark를 통해 해결해 보고 싶지만. 현재 사정상 신규아키텍처를 도입하는데 문제가 있어서... 


물론,,, 현재 환경은 HDP(Hortonworks Data Platform)2.3 이기 때문에, 설치하거나 실행하는데, 문제는 아닙니다. Storm 같은경우 Topology를 만들면 되겠지만.. 약간 제가 생각하는 작업에는 불리할것 같고.. Spark쪽은 아직 제가 지식이 부족해서 시간대비 성과가 부족할것 같은 생각 때문입니다.


물론, 전 아직까지는 언어중에 Java가 좋지만, 요즘 왠만한 귀찮은 작업들은 Python으로 하고 있었는데(사실 과거에는 Perl도 배워보고 싶엇지만..) 너무 강력해서 계속 쓰게 되네요. 솔찍히 Java로 10줄 만들걸 파이선으로 3줄이면 표현이 되거든요..


사실 이렇게 하다가 고민이 생겼습니다. 다중 노드(현재 저 같은 경우는 10노드 + 추가 2노드) Produce Consumer 패턴?으로 로 작업을 병렬로 처리해보고 싶었는데, 이걸 프로그램으로 하나하나 만들기도 모하고,, 이러저런 고민이 많았는데,,


파이선이 해결해 주었네요 http://www.parallelpython.com/ 몇가지 고민은 Master Node에서 Slave 노드로 작업을 어떻게 넘겨주느냐 여부인데,, 자체적인 Queue가 있는것인지, 아님 외부 Queue를 이용해야하는지 봐봐야겠네요..


지금 RabbitMQ와 Kafaka를 동시에 보고 있는데,,, 제가 제대로 알고 있다면 Kafakfa는 Consumer에게 전달된 메세지가 어떤것인지에 대한 보장??꼭 UDP같은 성격이라... 의 문제가 있어서... 텍스트들을 보다 보면,, 케이스에 따라서는 RabbitMQ를 추천하시더군요 


일단은 이번포스팅의 목적은 파이선에서 병렬 처리를 쉽게 해주는 방법이 있는데,, 그것은 parallel python 입니다.


파이썬 짱짱,,